409 - Excuses, Excuses!
2016-08-13 20:24
148 查看
本文包含以下内容:
一、思路
二、代码实现
三、总结
一、思路
本题主要考察字符串的输入输出、匹配
对于K,E,scanf读取,getchar接收\n
keywords和excuses都需要被存起来,因为keywords要用于查找匹配,excuse最后输出 中要用到,可以考虑char型的二维数组进行存储
一个keyword一行,中间无空格无特殊符号,因此可以用scanf或者gets循环读取,不同的是如果用scanf ,其后要有getchar接收换行符
一句excuses一行,有空格,各种特殊符号。因此用gets读取。
接下来是匹配的问题:
因为是单词与单词的匹配,可以用strcmp 函数,
对于一句excuse,用getchar逐个读取字符存到char t[]中,遇到空格就停止,然后与keyword逐个匹配,如果匹配到一个cnt++
cnt最大的excuse就是worst excuse.
要注意的问题:
1.keywords只有小写,而excuse大小写都有。因此读入之后要把excuse转换为小写。但是输出时是原始的 excuse,
因此读入excuse后存到一个临时字符串里,对其进行大小写转换以及匹配的操作
2.最后输出的时候不要忘记,如果cnt最大的不止一个,也要全部输出。但是输出的先后顺序不限
二、代码实现
三、总结
一些编程时的错误:
scanf_s 以%s读的时候,参数有三个,最后一个参数指明边界
strcmp 如果两个字符相等返回的不是1是0! 因此应该用if(strcmp(s1,s2)==0)而非if(strcmp(s1,s2))去判断两个字符是否相等
程序中有这样一部分代码
原因是如果t不加上字符串结束符,则其后的一长串乱码都会被视作 属于t,因此不能正常匹配。
如果要用strcmp,记得检查自己字符串结尾是否有结束符。
其他:
这次程序总体调试的比较顺利
原因有两点:一是提前在纸上理清了思路,
二是 写一部分测试一部分
看似更花时间的事情实际 上帮助节省了很多时间。
一、思路
二、代码实现
三、总结
一、思路
本题主要考察字符串的输入输出、匹配
对于K,E,scanf读取,getchar接收\n
keywords和excuses都需要被存起来,因为keywords要用于查找匹配,excuse最后输出 中要用到,可以考虑char型的二维数组进行存储
一个keyword一行,中间无空格无特殊符号,因此可以用scanf或者gets循环读取,不同的是如果用scanf ,其后要有getchar接收换行符
一句excuses一行,有空格,各种特殊符号。因此用gets读取。
接下来是匹配的问题:
因为是单词与单词的匹配,可以用strcmp 函数,
对于一句excuse,用getchar逐个读取字符存到char t[]中,遇到空格就停止,然后与keyword逐个匹配,如果匹配到一个cnt++
cnt最大的excuse就是worst excuse.
要注意的问题:
1.keywords只有小写,而excuse大小写都有。因此读入之后要把excuse转换为小写。但是输出时是原始的 excuse,
因此读入excuse后存到一个临时字符串里,对其进行大小写转换以及匹配的操作
2.最后输出的时候不要忘记,如果cnt最大的不止一个,也要全部输出。但是输出的先后顺序不限
二、代码实现
#include<stdio.h> #include<string> int main() { int K, E,cnt[20]; char key[20][20], ex[20][80]; int dataset = 1; while (true) { scanf_s("%d", &K); scanf_s("%d", &E); char c = getchar(); //read keywords for (int i = 0; i < K; i++) { scanf_s("%s", key[i], 20); c = getchar(); } memset(cnt, 0, sizeof(cnt)); //read excuse and process for (int i = 0; i < E; i++) { //read excuse gets_s(ex[i]); //invert to lower char line[80]; int len = strlen(ex[i]); for (int x = 0; x <= len; x++) { if (ex[i][x] >= 'A'&&ex[i][x] <= 'Z') line[x] = ex[i][x] + 32; else line[x] = ex[i][x]; } //judge and count int p = 0; //p指向ex[i] while (true) { char t[20]; //get a word from the excuse for (int j = 0;; p++, j++) { if (line[p] == ' ' || line[p] == '.' || line[p] == '"' || line[p] == ',' || line[p] == '!' || line[p] == '?') { t[j] = '\0'; break; } t[j] = line[p]; } //judge and count for (int q = 0; q < K; q++) if (strcmp(t, key[q]) == 0) { cnt[i]++; break; } p++; if (line[p] == '\0')break; } }//for i //find worst int worst = 0; for (int r = 0; r < E; r++) if (cnt[r] > cnt[worst])worst = r; printf("Excuse Set #%d\n", dataset); printf("%s\n", ex[worst]); for (int r = 0; r < E; r++) if (cnt[r] == cnt[worst] &&r!=worst)printf("%s\n", ex[r]); printf("\n"); dataset++; } return 0; }
三、总结
一些编程时的错误:
scanf_s 以%s读的时候,参数有三个,最后一个参数指明边界
strcmp 如果两个字符相等返回的不是1是0! 因此应该用if(strcmp(s1,s2)==0)而非if(strcmp(s1,s2))去判断两个字符是否相等
程序中有这样一部分代码
for (int j = 0;; p++, j++) { if (line[p] == ' ' || line[p] == '.' || line[p] == '"' || line[p] == ',' || line[p] == '!' || line[p] == '?') { t[j] = '\0'; break; } t[j] = line[p]; }原本没有写
t[j] = '\0';这一句程序。后来发现在匹配时出现问题,cnt永远是0.
原因是如果t不加上字符串结束符,则其后的一长串乱码都会被视作 属于t,因此不能正常匹配。
如果要用strcmp,记得检查自己字符串结尾是否有结束符。
其他:
这次程序总体调试的比较顺利
原因有两点:一是提前在纸上理清了思路,
二是 写一部分测试一部分
看似更花时间的事情实际 上帮助节省了很多时间。
相关文章推荐
- uva 409 - Excuses, Excuses!
- Uva 409 - Excuses, Excuses!
- UVA 409 Excuses, Excuses!
- UVA之409 - Excuses, Excuses!
- HDU 1606(POJ 1598 UVA 409) Excuses, Excuses!(字符串匹配处理)
- 409 Excuses, Excuses!
- uva409 - Excuses, Excuses!
- Volume 1. Elementary Problem Solving->Volume 1 String 409 - Excuses, Excuses!
- UVA 409 - Excuses, Excuses!(字符串)
- uva - 409 - Excuses, Excuses!
- Uva 409 Excuses, Excuses!
- UVA 409 Excuses, Excuses!
- uva 409 Excuses, Excuses!(字符串处理)
- 409 - Excuses, Excuses!
- UVa 409 Excuses! Excuses!
- Excuses, Excuses! UVa409 字符串
- UVA 409 Excuses, Excuses!
- uva 409 Excuses, Excuses!
- UVa_409 - Excuses, Excuses!
- UVa409_Excuses, Excuses!(小白书字符串专题)