算法提高---统计单词数
问题描述
统计输入英文文章段落中不同单词(单词有大小写之分,但统计时忽略大小写)各自出现的次数。 输入段落中所含单词的总数不超过100,最长单词的长度不超过20个字母.
输入格式
一个包含若干句子的段落, 每个句子由若干英文单词组成. 除空格,逗号和句号外, 这些输入的句子中不含其他非字母字符, 并且, 逗号和句号紧跟在它前面的英文单词后面, 中间没有空格. 段落最后一个字符是回车符,表示输入结束.
输出格式
若段落中共有M个不同的英文单词,则按照其在段落中出现的先后顺序输出M行,各行的格式为:单词中所有字母均用大写形式输出(最长的单词顶格输出,它前面没有多余的空格;其余单词与其右对齐)+冒号+N个*号+该单词在段落中的出现次数N
样例输入
This is a test. This test is easy. This is a test. This test is easy.
样例输出
This:****4
IS:****4
A:**2
TEST:****4
EASY:**2
#include <stdio.h> #include <string.h> void Delete_And_Big(char *cha){ int i; for(i=0;cha[i]!='\0';i++){ if(cha[i] == ',' || cha[i] == '.'){ cha[i] = '\0'; break; } else{ if(cha[i] >= 'a' && cha[i] <= 'z') cha[i] = cha[i] - 32; } } } void Count_And_Print(char cha[][21],int *flag,int num){ int i,j,k; int count[101] = {0}; //统计频次 i = j = 0; while(j<=num){ if(flag[j] == 0){ count[j] = 1; for(i=j+1;i<=num;i++){ if(!strcmp(cha[j],cha[i])){ //字符串比较 count[j] ++; flag[i] = 1; } } } if(!flag[j]){ printf("%s:",cha[j]); for(k=0;k<count[j];k++) printf("*"); printf("%d\n",count[j]); } j ++; } } int main(){ char cha[101][21]={'\0'}; char c; int num = 0; int flag[101] = {0}; scanf("%s",cha[num]);//忽略回车空格等空白字符,文章总是不为空的 scanf("%c",&c); while(c != '\n'){ Delete_And_Big(cha[num]);//将接收的单词除掉尾部可能的逗号和句号,并将单词变成全部大写 num ++; scanf("%s",cha[num]); scanf("%c",&c);//注意回车是'\n' 而不是'\0' } Delete_And_Big(cha[num]); Count_And_Print(cha,flag,num); return 0; }

浙公网安备 33010602011771号