统计英文文章中各单词的频率,打印频率最高的十个单词(C语言实现)

 一、程序思路及相关代码

      首先打开文件,代码如下

FILE *fp;
     char fname[10];
     printf("请输入要分析的文件名:\n");
     scanf("%s",fname);
     if((fp=fopen(fname,"r"))==NULL){   //读取文件内容,并返回文件指针,该指针指向文件的第一个字符
          fprintf(stderr,"error opening.\n");
          exit(1);
     }

  对于文件的扫描,以字符为单位

1
2
3
4
5
6
7
8
9
do{
          ch=fgetc(fp);
          if(ch==‘ ‘||ch==‘,‘||ch==‘.‘||ch==‘;‘)     //如果是空格,自动跳到下个字符
                 scanner(fp);
           else{
                 fseek(fp,-1,1);        //如果不是空格,则回退一个字符并扫描
               scanner(fp);
           }
      }while (ch!=EOF);

  要统计单词频率,首先要将文章分为单个单词

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
int zimu(char ch){ 
    if((ch >= ‘A‘ && ch <= ‘Z‘)
        || (ch >= ‘a‘ && ch <= ‘z‘))
        return ch;
    else
        return 0;
}
void scanner(FILE *fp)
{    
     char b[20];
    ch=fgetc(fp);
    if(zimu(ch))
    {               //判断该字符是否是字母
        b[0]=ch;
        ch=fgetc(fp);         //调用函数扫描字符
        i=1;
        while(zimu(ch))
        {    
            b[i] = ch;
            i++;
            ch = fgetc(fp);
        }
        fseek(fp,-1,1);
        b[i] = ‘\0‘;
        k++;
        strcpy(w[k].c,b);
    }
}

 对于单词,为单词创建结构体

struct word
{
    char c[20];//单词词组
    int n;//单词个数
}w[10000];

 

   统计各个单词的个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(i=1;i<k+1;i++)
          w[i].n=1;
    for(i=1;i<k+1;i++)
    {
        for(j=i+1;j<k+1;j++)
        {
            if(strcmp(w[i].c,w[j].c)==0)
            {
              w[i].n++;
                  w[j].n=0;
            }
            if(w[i].n==0)//将已统计的单词跳过
                break;
        }
    }

   将单词按个数多少进行排序

统计英文文章中各单词的频率,打印频率最高的十个单词(C语言实现)
for(i=1;i<k+1;i++)
    {
        for(j=1;j<k+1-i;j++)
        {
            if(w[i].n>w[j].n)//交换结构体内数据
            {
                t=w[i].n;
                strcpy(a,w[i].c);
                w[i].n=w[j].n;
                strcpy(w[i].c,w[j].c);
                w[j].n=t;
                strcpy(w[j].c,a);
            }
        }
    }
    printf("英文文章中频率最高10个单词及个数为:\n");
    for(i=1;i<11;i++)
        printf("%d:  %s   %d\n",i,w[i].c,w[i].n);
    }
统计英文文章中各单词的频率,打印频率最高的十个单词(C语言实现)

二、遇到问题

(1)对于单词的扫描,后来查看编译中的词法分析解决了

(2)对于词组的复制,使用strcpy(w[k].c,b);解决将词组c复制到结构体数组中

(3)对于单词个数统计,

if(w[i].n==0)//将已统计的单词跳过
 break;

将与后面单词相同的跳过,避免出现重复

三、程序过程统计

     二月26号下午,2个小时思考程序思路,并书写大体框架

    二月27号上机时间,将扫描和单词分解完成

    二月27号完成程序

四、程序运行截图

统计英文文章中各单词的频率,打印频率最高的十个单词(C语言实现)

统计英文文章中各单词的频率,打印频率最高的十个单词(C语言实现),布布扣,bubuko.com

统计英文文章中各单词的频率,打印频率最高的十个单词(C语言实现)

上一篇:五个 .NET 性能小贴士


下一篇:Golang 程序中实现优雅关闭 HTTP SERVER