zoukankan      html  css  js  c++  java
  • 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

    测试结果:

  • 相关阅读:
    HDU 6182 A Math Problem 水题
    HDU 6186 CS Course 位运算 思维
    HDU 6188 Duizi and Shunzi 贪心 思维
    HDU 2824 The Euler function 欧拉函数
    HDU 3037 Saving Beans 多重集合的结合 lucas定理
    HDU 3923 Invoker Polya定理
    FZU 2282 Wand 组合数学 错排公式
    HDU 1452 Happy 2004 数论
    HDU 5778 abs 数论
    欧拉回路【判断连通+度数为偶】
  • 原文地址:https://www.cnblogs.com/shaloo/p/5841877.html
Copyright © 2011-2022 走看看