解题思路:
先计算输入段落最长有多少字符,若单词的总长度不超过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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论