原题链接:蓝桥杯算法提高VIP-统计单词数
解题思路:
先计算输入段落最长有多少字符,若单词的总长度不超过2000,加上标点符号和空格,段落的总长度不超过6000,这里就算有10000个字符罢。用fgets读入有限长度的字符串,去掉段尾的无关换行符,单词由空格、逗号、句号隔开,每获取一个子串作为单词,更新和统计最长单词的长度,以其大写形式搜索字典,若该单词出现过,出现的次数加一,并不再往后寻找;若搜遍字典,单词没有出现过,就作为新词加入字典,并将其出现的次数记为一。统计完成后,输出与最长单词右对齐的每个单词,并输出其出现的次数。
注意事项:
在输出单词时,以变量长度左端加空格右对齐的用法参考自:printf专题:你可能不知道的printf用法
参考代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include<stdio.h> #include<string.h> #include<ctype.h> #define N 10000 char s[N]; int main(){ char *t,words[100][21]; //单词总数不超过100 int i,c,l,m,times[100]={0}; if (NULL!= fgets (s,N,stdin)){ //输入段落 l= strlen (s); if (s[l-1]== '\n' ) s[l-1]= '\0' ; //去掉无关字符 c=m=0; t= strtok (s, " ,." ); //单词由空格、逗号、句号隔开 while (t){ l= strlen (t); if (l>m) m=l; //最长单词的长度 for (i=0;i<l;i++) *(t+i)= toupper (*(t+i)); //以大写形式统计 for (i=0;i<c;i++){ if ( strcmp (words[i],t)==0){ //若该单词出现过 times[i]++; //出现的次数加一 break ; //已找到单词,不再继续寻找 } } if (i==c){ //单词没有出现过 strcpy (words[c++],t); //作为新词加入字典 times[c-1]=1; //出现的次数为一 } t= strtok (NULL, " ,." ); } for (i=0;i<c;i++){ printf ( "%*s:" ,m,words[i]); //第i个单词占m位,与最长单词右对齐 for (l=0;l<times[i];l++) //输出第i个单词出现的次数 putchar ( '*' ); printf ( "%d\n" ,l); } } return 0; } |
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复