c語言實(shí)現(xiàn)詞頻統(tǒng)計(jì)的簡(jiǎn)單實(shí)例
需求:
1.設(shè)計(jì)一個(gè)詞頻統(tǒng)計(jì)軟件,統(tǒng)計(jì)給定英文文章的單詞頻率。
2.文章中包含的標(biāo)點(diǎn)不計(jì)入統(tǒng)計(jì)。
3.將統(tǒng)計(jì)結(jié)果以從大到小的排序方式輸出。
設(shè)計(jì):
1.因?yàn)槭强鐚I(yè)0.0···并不會(huì)c++和java,只能用僅學(xué)過的C語言進(jìn)行編寫,還是挺費(fèi)勁的。
2.定義一個(gè)包含單詞和頻率兩個(gè)成員的結(jié)構(gòu)體來統(tǒng)計(jì)詞頻(進(jìn)行了動(dòng)態(tài)分配內(nèi)存,可以處理較大文本)。
3.使用fopen函數(shù)讀取指定的文檔。
4.使用fgetc函數(shù)獲取字符,再根據(jù)取得的字符是否是字母進(jìn)行不同的處理。
5.采用快速排序法對(duì)統(tǒng)計(jì)結(jié)果進(jìn)行排序。
5.將整個(gè)統(tǒng)計(jì)結(jié)果循環(huán)輸出。
部分代碼:
結(jié)構(gòu)體定義:
struct fre_word
{
int num;
char a[18];
};
分配初始內(nèi)存:
struct fre_word *w; w=(struct fre_word *)malloc(100*p*sizeof(struct fre_word));//給結(jié)構(gòu)體分配初始內(nèi)存
讀取文本:
printf("輸入讀入文件的名字:");
scanf("%s", filename); //輸入需要統(tǒng)計(jì)詞頻的文件名
if((fp=fopen(filename, "r"))==NULL)
{
printf("無法打開文件\n");
exit(0);
}
單詞匹配:
/****************將單詞出現(xiàn)次數(shù)設(shè)置為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; //設(shè)標(biāo)志位判斷是否存在連續(xù)標(biāo)點(diǎn)或者空格
}
else if(!(ch>=65&&ch<=90||ch>=97&&ch<=122)&&flag==0) //ch若不是字母且上一個(gè)字符為字母
{
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--;
}
}
}
/****************動(dòng)態(tài)分配內(nèi)存****************************************/
if(i==(p*100)) //用i判斷當(dāng)前內(nèi)存已滿
{
p++;
w=(struct fre_word*)realloc(w,100*p*(sizeof(struct fre_word)));
for(n=i;n<=100*p;n++) //給新分配內(nèi)存的結(jié)構(gòu)體賦初值
(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); //運(yùn)用遞歸
if(n>i) quick(f,i,n);
}
結(jié)果輸出:
for(n=0;n<=i;n++)
{
printf("文檔中出現(xiàn)的單詞:");
printf("%-18s",(w+n)->a);
printf("其出現(xiàn)次數(shù)為:");
printf("%d\n",(w+n)->num);
}
測(cè)試用例:
看了之前同學(xué)的博客以及老師的評(píng)論,就使用了較長(zhǎng)的文本進(jìn)行測(cè)試,用的是奧巴馬就職演講稿。
部分測(cè)試結(jié)果:
以上這篇c語言實(shí)現(xiàn)詞頻統(tǒng)計(jì)的簡(jiǎn)單實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持我們。
上一篇:淺談C語言函數(shù)調(diào)用參數(shù)壓棧的相關(guān)問題
欄 目:C語言
本文標(biāo)題:c語言實(shí)現(xiàn)詞頻統(tǒng)計(jì)的簡(jiǎn)單實(shí)例
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2046.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery


