c語言實現詞頻統(tǒng)計的簡單實例
需求:
1.設計一個詞頻統(tǒng)計軟件,統(tǒng)計給定英文文章的單詞頻率。
2.文章中包含的標點不計入統(tǒng)計。
3.將統(tǒng)計結果以從大到小的排序方式輸出。
設計:
1.因為是跨專業(yè)0.0···并不會c++和java,只能用僅學過的C語言進行編寫,還是挺費勁的。
2.定義一個包含單詞和頻率兩個成員的結構體來統(tǒng)計詞頻(進行了動態(tài)分配內存,可以處理較大文本)。
3.使用fopen函數讀取指定的文檔。
4.使用fgetc函數獲取字符,再根據取得的字符是否是字母進行不同的處理。
5.采用快速排序法對統(tǒng)計結果進行排序。
5.將整個統(tǒng)計結果循環(huán)輸出。
部分代碼:
結構體定義:
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); //輸入需要統(tǒng)計詞頻的文件名 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; //設標志位判斷是否存在連續(xù)標點或者空格 } 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--; } } } /****************動態(tà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語言實現詞頻統(tǒng)計的簡單實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持我們。
欄 目:C語言
下一篇:C語言之雙向鏈表詳解及實例代碼
本文標題:c語言實現詞頻統(tǒng)計的簡單實例
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2046.html
您可能感興趣的文章
- 04-02c語言函數調用后清空內存 c語言調用函數刪除字符
- 04-02c語言的正則匹配函數 c語言正則表達式函數庫
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言中對數函數的表達式 c語言中對數怎么表達
- 04-02c語言用函數寫分段 用c語言表示分段函數
- 04-02c語言編寫函數冒泡排序 c語言冒泡排序法函數
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段函數
- 04-02C語言中怎么打出三角函數 c語言中怎么打出三角函數的值
- 04-02c語言調用函數求fibo C語言調用函數求階乘


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言的正則匹配函數 c語言正則表達
- 04-02c語言用函數寫分段 用c語言表示分段
- 04-02c語言中對數函數的表達式 c語言中對
- 04-02c語言編寫函數冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數 c語言中怎
- 04-02c語言調用函數求fibo C語言調用函數求
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結
- 01-11ajax實現頁面的局部加載
- 08-05dedecms(織夢)副欄目數量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery