算法提高---统计单词数

问题描述
  统计输入英文文章段落中不同单词(单词有大小写之分,但统计时忽略大小写)各自出现的次数。 输入段落中所含单词的总数不超过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;
}

 

posted @ 2017-01-02 16:06  我在这儿  阅读(320)  评论(0)    收藏  举报