注:這次使用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; }
