不得不说对于菜鸟级的我,这是一次心酸的经历啊。。。自打接到王老师布置的这个任务(个人项目)之后,我心里一直在想着自己要用哪种语言来完成我的任务。以前多多少少写过一些程序的,这又想起了数据库小学期与永哥和小强哥一起奋斗的日子来了,和大牛一起合作就是长见识,哈哈!
好吧,介绍一下题目,对一个英文文本进行词频统计,并把出现频率最高的10个词打印出来。
发愁是肯定的,努力也是肯定的,既然对一个英文文本进行词频统计,那么肯定会用到文件的读写函数,所以先找到了c语言课本,对这一部分的知识做了一下系统地复习。并且对该部分的知识做了一个小小的总结,虽然不是很全面吧,但是是自己对知识的深入理解。当然这对我们班的神人来说就是小case了,所以还是很惭愧滴!
对文件的读写操作搞懂了之后呢,就要设计自己的思路了。首先,定义一个结构体,(想必,我的同学们也有好多用结构体的...)
1 struct wordcount//定义一个结构体Wordcount 2 { 3 char *word; 4 int count; 5 struct wordcount *next; 6 };
然后定义了一些指向结构体变量的指针,和缓冲区用来存放从文本文件中获取的内容。然后运用isalpha()来判断读到缓冲区的内容是否为字母。
/* 函数:isalpha
原型:int isalpha(int ch)
用法:头文件加入#include <cctype>(旧版本的编译器使用<ctype.h>)
功能:判断字符ch是否为英文字母,当ch为英文字母a-z或A-Z时,在标准c中相当于使用“isupper(ch)||islower(ch)”做测试,返回非零值,否则返回零。*/
之后就是判断缓冲区中的单词有没有超过规定的最大限度,以及把大写字母转换为小写字母等等。部分代码如下
用strcpy()函数来判断是否和buff内的单词相同,若相同,则count+1
1 while (wc)//如果有的话则计数加1 2 { 3 if (strcmp(wc->word,buff)==0) 4 { 5 wc->count=wc->count+1; 6 isfinded=1; 7 break; 8 } 9 else 10 wc=wc->next; 11 }
对出现次数最高的10个词进行排序则可能弱了一些,我选用的是交换排序,所以效率会慢了一些。自然所用的时间就会长好多了(和那些大牛级的任务了)。下面是全部的代码:
#include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #define MAXLEN 30 struct wordcount//定义一个结构体Wordcount { char *word; int count; struct wordcount *next; }; struct wordcount *head,*wc,*sort,*headsort; char buff[MAXLEN]; char *zs_c;//buf[]数组用来存放英文字母 int buff_count=0, isfinded; int main() { FILE *fp; char ch; int i; int k; char filename[20]; printf("请输入文件名: "); scanf("%s",filename); if ((fp=fopen(filename,"r"))==NULL) { printf("不能打开该文件! "); exit(0); } while ((ch=fgetc(fp))!=EOF)//读取英文文本中的内容 if (isalpha(ch)) { buff[buff_count++]=tolower(ch);//判断是否为字母若果是则把它放到数组Buff[] if (buff_count>=MAXLEN) { printf("单词长度超过最大限度! ");//判断单词的长度是否超过最长限度 fclose(fp); return -1; } } else { //若果不是字母,且buff[]中没有单词的话则把其放到Wordcount link中 if (buff_count!=0) { buff[buff_count]='