c說話完成詞頻統計的簡略實例。本站提示廣大學習愛好者:(c說話完成詞頻統計的簡略實例)文章只能為提供參考,不一定能成為您想要的結果。以下是c說話完成詞頻統計的簡略實例正文
需求:
1.設計一個詞頻統計軟件,統計給定英文文章的單詞頻率。
2.文章中包括的標點不計入統計。
3.將統計成果以從年夜到小的排序方法輸入。
設計:
1.由於是跨專業0.0···其實不會c++和java,只能用僅學過的C說話停止編寫,照樣挺費力的。
2.界說一個包括單詞和頻率兩個成員的構造體來統計詞頻(停止了靜態分派內存,可以處置較年夜文本)。
3.應用fopen函數讀取指定的文檔。
4.應用fgetc函數獲得字符,再依據獲得的字符能否是字母停止分歧的處置。
5.采取疾速排序法對統計成果停止排序。
5.將全部統計成果輪回輸入。
部門代碼:
構造體界說:
struct fre_word { int num; char a[18]; };
分派初始內存:
struct fre_word *w; w=(struct fre_word *)malloc(100*p*sizeof(struct fre_word));//給構造體分派初始內存
讀取文本:
printf("輸出讀入文件的名字:"); scanf("%s", filename); //輸出須要統計詞頻的文件名 if((fp=fopen(filename, "r"))==NULL) { printf("沒法翻開文件\n"); exit(0); }
單詞婚配:
/****************將單詞湧現次數設置為1****************************/ for(i=0;i<100;i++) { (w+i)->num=1; } /****************單詞婚配****************************************/ i=0; while(!feof(fp))//文件還沒有讀取終了 { ch=fgetc(fp); (w+i)->a[j]='\0'; if(ch>=65&&ch<=90||ch>=97&&ch<=122) //ch若為字母則存入 { (w+i)->a[j]=ch; j++; flag=0; //設標記位斷定能否存在持續標點或許空格 } else if(!(ch>=65&&ch<=90||ch>=97&&ch<=122)&&flag==0) //ch若不是字母且上一個字符為字母 { i++; j=0; flag=1; for(m=0;m<i-1;m++) //婚配單詞,若已存在則num+1 { if(stricmp((w+m)->a,(w+i-1)->a)==0) { (w+m)->num++; i--; } } } /****************靜態分派內存****************************************/ if(i==(p*100)) //用i斷定以後內存已滿 { p++; w=(struct fre_word*)realloc(w,100*p*(sizeof(struct fre_word))); for(n=i;n<=100*p;n++) //給新分派內存的構造體賦初值 (w+n)->num=1; } }
疾速排序:
void quick(struct fre_word *f,int i,int j) { int m,n,temp,k; char b[18]; m=i; n=j; k=f[(i+j)/2].num; //拔取的參照 do { while(f[m].num>k&&m<j) m++; // 從左到右找比k小的元素 while(f[n].num<k&&n>i) n--; // 從右到左找比k年夜的元素 if(m<=n) { //若找到且知足前提,則交流 temp=f[m].num; strcpy(b,f[m].a); f[m].num=f[n].num; strcpy(f[m].a,f[n].a); f[n].num=temp; strcpy(f[n].a,b); m++; n--; } } while(m<=n); if(m<j) quick(f,m,j); //應用遞歸 if(n>i) quick(f,i,n); }
成果輸入:
for(n=0;n<=i;n++) { printf("文檔中湧現的單詞:"); printf("%-18s",(w+n)->a); printf("其湧現次數為:"); printf("%d\n",(w+n)->num); }
測試用例:
看了之前同窗的博客和先生的評論,就應用了較長的文本停止測試,用的是奧巴馬就職演講稿。
部門測試成果:
以上這篇c說話完成詞頻統計的簡略實例就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。