• C语言词频统计设计


    项目需求:

    1.设计一个词频统计小软件,对给定的英文文章进行单词频率的统计。

    2.文章中相应的标点不计入统计。

    3.将统计结果以从大到小的排序方式输出。 

    设计:

    1.因为功能相对简单,采用C语言直接进行编写。

    2.项目包含的统计功能利用定义的结构体分别对单词和次数进行统计。

    3.以字符串的形式读取单词,并对其中的每个字符进行标点分析。

    4.统计完成后采用冒泡排序的方式对次数进行排序。

    5.将整个统计结果循环输出。

    部分核心代码:

    结构体定义:

    定义一个结构体来存放读取的单词与其统计的次数。

    typedef struct addup
    {
        char word[50];
        int count;
    }R;

    读取文本1.0(采用fopen函数读取固定路径文本):

           char temp[50];
           R fin[10000]={"\0",0};
           fp=fopen("f:/1.txt","r");
    

    读取文本2.0(采用stdin函数手动输入读取路径):

    改进:相对之前的代码,更换函数使得可以用户手动录入想要读取的文本路径,而不用直接修改源码。

           char temp[50];
           R fin[10000]={"\0",0};
    char file[10]; fflush(stdin); gets(file); fp=freopen(file,"r",stdin);

    单词匹配:

    针对读取的每个单词,和结构体中之前存取的单词进行对比,如果相同则累计数量,如果不同则更新数组。

    while(!feof(fp))
           {
               fscanf(fp,"%s",temp);
               q=strlen(temp);
               n++;
        for(i=0;i<n;++i)
            if(strcmp(fin[i].word,temp)==0)
            {
                 fin[i].count++;
                  n--;
                  break;
             }
             if(i>=n)
             {
                 strcpy(fin[n-1].word,temp);
                 fin[n-1].count++;
             }
           }

    标点判定:

    将读取的字符串以字符为单位判断标点并去除。

    for(i=0;i<q;i++)
    {
         if(temp[i]==','||temp[i]=='.'||temp[i]=='?'||temp[i]=='!'||temp[i]=='"')
         temp[i]='\0';
    }

    冒泡排序:

    for (i=0;i<n;i++)  
            for (j=0;j<n-i;j++)  
              {  
                if (fin[j].count<fin[j+1].count)  
                   {  
                   ls[0]=fin[j+1];  
                   fin[j+1]=fin[j];  
                   fin[j]=ls[0];  
                   }  
              }  

    输出结果:

     freopen("f:/2.txt","w",stdout);      
           for(i=0;i<n;i++)
           {
             printf("%s : ",fin[i].word);
             s=0;
                for(j=0;j<fin[i].count;++j)
                 s++;
             printf("%d 次",s);
             printf("\n");
           }
           fclose(stdout);

    测试用例:

    因为词频统计单词重复几率不会过高,因此小篇幅文章不一定能得出好的测试结果,选取了马丁路德金的《I have a dream》演讲稿进行统计。

    全篇单词量:1666

    测试结果:

  • 相关阅读:
    idea中maven自动导入出现问题
    DDIA
    DDIA
    DDIA
    DDIA
    DDIA
    DDIA
    DDIA
    MIT 6.824 第五次作业Primary-Backup Replication
    MIT 6.824 第四次作业GFS
  • 原文地址:https://www.cnblogs.com/shaloo/p/5841877.html
Copyright © 2020-2023  润新知