项目需求:
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
测试结果: