解题思路:
先计算输入段落最长有多少字符,若单词的总长度不超过2000,加上标点符号和空格,段落的总长度不超过6000,这里就算有10000个字符罢。用fgets读入有限长度的字符串,去掉段尾的无关换行符,单词由空格、逗号、句号隔开,每获取一个子串作为单词,更新和统计最长单词的长度,以其大写形式搜索字典,若该单词出现过,出现的次数加一,并不再往后寻找;若搜遍字典,单词没有出现过,就作为新词加入字典,并将其出现的次数记为一。统计完成后,输出与最长单词右对齐的每个单词,并输出其出现的次数。
注意事项:
在输出单词时,以变量长度左端加空格右对齐的用法参考自:printf专题:你可能不知道的printf用法
参考代码:
#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; }
0.0分
1 人评分
2005年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:584 |
简单的a+b (C语言代码)浏览:629 |
C语言程序设计教程(第三版)课后习题6.3 (Java代码)浏览:656 |
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:619 |
C语言训练-计算一个整数N的阶乘 (C语言代码)浏览:936 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:965 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:936 |
求圆的面积 (C语言代码)浏览:1670 |
C语言训练-数字母 (C语言代码)浏览:608 |
K-进制数 (C语言描述,蓝桥杯)浏览:925 |