項目需求:
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
測試結果: