統計一段文字中出現頻率最高的10個單詞(c語言)


 

注:這次使用C語言做的這個程序。個別不懂的地方和算法部分是請教的其他同學,交流並吸收,所以收獲頗多!

在程序中每一個地方我都做了注釋,方便同學之間交流。也讓老師容易看。程序也有很多不足的地方,但限於本人能力有限以及時間緊迫,難免出現很多問題,希望老師和同學能夠幫助解決!

設計思路:(在代碼中基本都做了注釋,很好的體現了這里的設計思路

1.這個程序首先我定義了一個結構體,內容包含單詞的出現次數和單詞的長度。

2.然后把所有單詞出現的次數都設置為1,以便后面進行比較。

3.文件的讀取工作很簡單,以前學過。使用if((fp=fopen(filename,"r"))==NULL)語句即可。

4.然后開始識別單詞,如果單詞后面有空格則認為一個單詞結束。使用flag標志,來進行確定。

5.最后根據出現次數進行排序,然后輸出。

下面是程序讀取文件后的運行結果:

代碼部分:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct S_word
{
    int num;
    char a[15];// 單詞的長度
};
int main()
{
    struct S_word W[300]; //定義一個結構體W
    int i,m,n,k;
    char b[10];  // 用來和a【10】交換的數組
    FILE *fp;    // 定義文件
    char ch;     //從文件中讀取字符
    int flag=0;  //標志空格后面是否有單詞
    int j=0;    
    int temp;   //排序時交換用
    char filename[10];
/****************首先將出現次數均設置為1****************************/
    for(i=0;i<300;i++)
    {    W[i].num=1;
    }
        i=0;
/****************首先將出現次數均設置為1****************************/
/****************打開文件****************************/
    printf("Please input the name of the file :\n");
    scanf("%s",filename);
    if((fp=fopen(filename,"r"))==NULL)
    {
        printf("error opening!");
        exit(0);
    }
/****************打開文件****************************/
/****************讀取文件內容****************************/
   while(!feof(fp))
   {       
            ch=fgetc(fp);
            W[i].a[j]='\0';
            if(ch>=65&&ch<=90||ch>=97&&ch<=122)
            {
            W[i].a[j]=ch;                                       //識別單詞
            j++;
            flag=1;
            }
            else if(ch==' '&&flag==1)
            {   
                flag=0;
                j=0;
                  n=i;
                i++;
            if(n>=1)                                     //每一個單詞跟前面的比較,如果相同就使次數加一
            {
                for(m=0;m<n;m++)
                {
                    if(strcmp(W[n].a,W[m].a)==0)
                    {                                
                        W[m].num++;
                        i=i-1;                           //如果單詞相同則認為是一個單詞
                    }
                }                     
            }
            }
   }
/****************根據單詞出現次數進行排序***************************/  
     for(n=0;n<i-1;n++)
     {
         k=n;
         for(j=n+1;j<i;j++)
             if(W[j].num>W[k].num)
             { k=j;
               temp=W[k].num;
               W[k].num=W[n].num;
               W[n].num=temp;
               strcpy(b,W[k].a);
               strcpy(W[k].a,W[n].a); 
               strcpy(W[n].a,b);
             }             
     }
/****************根據單詞出現次數進行排序**********/ 
/****************輸出部分**************************/ 
     printf("The most commonly 10 words:\n");
     for(n=0;n<=9;n++)
     {  
    
         printf("%s\n",W[n].a);
         printf("其出現次數為:");
         printf("%d\n",W[n].num);
     }
/****************輸出部分**************************/ 
    return 0;

}

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM