网站建设与管理办法,推荐几个安全没封的网站,专业手表网站,天长网站制作不得不说对于菜鸟级的我#xff0c;这是一次心酸的经历啊。。。自打接到王老师布置的这个任务#xff08;个人项目#xff09;之后#xff0c;我心里一直在想着自己要用哪种语言来完成我的任务。以前多多少少写过一些程序的#xff0c;这又想起了数据库小学期与永哥和小强… 不得不说对于菜鸟级的我这是一次心酸的经历啊。。。自打接到王老师布置的这个任务个人项目之后我心里一直在想着自己要用哪种语言来完成我的任务。以前多多少少写过一些程序的这又想起了数据库小学期与永哥和小强哥一起奋斗的日子来了和大牛一起合作就是长见识哈哈 好吧介绍一下题目对一个英文文本进行词频统计并把出现频率最高的10个词打印出来。 发愁是肯定的努力也是肯定的既然对一个英文文本进行词频统计那么肯定会用到文件的读写函数所以先找到了c语言课本对这一部分的知识做了一下系统地复习。并且对该部分的知识做了一个小小的总结虽然不是很全面吧但是是自己对知识的深入理解。当然这对我们班的神人来说就是小case了所以还是很惭愧滴 对文件的读写操作搞懂了之后呢就要设计自己的思路了。首先定义一个结构体想必我的同学们也有好多用结构体的... 1 struct wordcount//定义一个结构体Wordcount
2 {
3 char *word;
4 int count;
5 struct wordcount *next;
6 }; 然后定义了一些指向结构体变量的指针和缓冲区用来存放从文本文件中获取的内容。然后运用isalpha来判断读到缓冲区的内容是否为字母。 /* 函数isalpha 原型int isalphaint ch 用法头文件加入#include cctype(旧版本的编译器使用ctype.h) 功能判断字符ch是否为英文字母当ch为英文字母a-z或A-Z时在标准c中相当于使用“isupper(ch)||islower(ch)”做测试返回非零值否则返回零。*/ 之后就是判断缓冲区中的单词有没有超过规定的最大限度以及把大写字母转换为小写字母等等。部分代码如下 用strcpy函数来判断是否和buff内的单词相同若相同则count1 1 while (wc)//如果有的话则计数加12 {3 if (strcmp(wc-word,buff)0)4 {5 wc-countwc-count1;6 isfinded1;7 break;8 }9 else
10 wcwc-next;
11 } 对出现次数最高的10个词进行排序则可能弱了一些我选用的是交换排序所以效率会慢了一些。自然所用的时间就会长好多了和那些大牛级的任务了。下面是全部的代码 #include stdio.h
#include ctype.h
#include stdlib.h
#include string.h#define MAXLEN 30struct wordcount//定义一个结构体Wordcount
{char *word;int count;struct wordcount *next;
};struct wordcount *head,*wc,*sort,*headsort;
char buff[MAXLEN];
char *zs_c;//buf[]数组用来存放英文字母
int buff_count0, isfinded;int main()
{FILE *fp;char ch;int i;int k;char filename[20];printf(请输入文件名\n);scanf(%s,filename);if ((fpfopen(filename,r))NULL) {printf(不能打开该文件!\n);exit(0);}while ((chfgetc(fp))!EOF)//读取英文文本中的内容if (isalpha(ch)){buff[buff_count]tolower(ch);//判断是否为字母若果是则把它放到数组Buff[]if (buff_countMAXLEN){printf(单词长度超过最大限度!\n);//判断单词的长度是否超过最长限度fclose(fp);return -1;}}else{//若果不是字母且buff[]中没有单词的话则把其放到Wordcount link中if (buff_count!0){buff[buff_count]\0;wchead;isfinded0;while (wc)//如果有的话则计数加1{if (strcmp(wc-word,buff)0){wc-countwc-count1;isfinded1;break;}elsewcwc-next;}if (isfinded0) {zs_c(char *)malloc(buff_count);if (zs_c0){printf(错误!: zs_c !\n);fclose(fp);exit(0);}memcpy(buff,zs_c,buff_count);wc(struct wordcount *)malloc(sizeof(struct wordcount));if (wc0){printf(分配有误\n);fclose(fp);exit(0);}wc-wordzs_c;wc-count1;wc-nexthead;headwc;}buff_count0;}}fclose(fp);if (head)//对单词进行排序{sorthead-next;head-next0;while (sort){wcsort;sortsort-next;if ((wc-count) (head-count)){wc-nexthead-next;headwc;}else{headsorthead;while ((headsort-next) (headsort-next-count wc-count ))//交换进行排序{headsort-countheadsort-next-count;wc-next-countheadsort-next-count;wc-next-countheadsort-count;headsort-wordheadsort-next-word;wc-next-wordheadsort-next-word;wc-next-wordheadsort-word;}}}}while (head)//对结果进行输出{wchead;headhead-next;printf(序号\t单词\t频率\n);for(i1;i11;i)printf(NO%d\t%s\t %d\n,i,wc-word,wc-count);}return 0;
} 运行结果 个人工作总结 实话说来对于好久没有碰过程序的我来说不得不说这是很困难的。 2.22就开始构思如何实现这个问题开始进行咨询并开始复习文件的读取。 2.27上机时间2:00--4:00开始写程序事实表明情况是不乐观的此时多么希望神可以拯救我啊抓狂。后来了解到用trie树map实现起来效率比较高所以对这两种方法进行了查询但是能力有限所以还是沿用了最先的想法周五自打吃完晚饭就开始继续调试程序就因为文件无法读取这个问题困扰了一晚上最终和娇哥交流后因为她也遇到了相同的问题难姐难妹啊才知道是文件默认的格式就是.txt是自动隐藏的还以为是自己安装的vc有问题呢或者和电脑本身有关系看来写程序这个东西是要和同仁交流的。 周六晚8:00又出现了一个大大的问题那就是死循环所以那更是一个痛苦程序的调试是必须的了终于发现了原来是在进行数据交换的时候丢了一个指针。本来想使用argv传递参数的argv[0]是执行的该文件argv[1]是传递的第二个参数即在屏幕上输入的第一个内容本来是想用这种方法来获取文件的名称的但是失败了所以又改用了原来c语言传统的文件读取方式。 不得不承认我的这个工程效率是不高的比如说排序用到的算法啊有时间一定要再研究一下如果文本的大小再大些的话速度是相当的慢了就。自己的能力还不是很高自己都觉得着急了因为对trie树也进行了一定的学习我想自己接下来能否可以用这种数据结构来实现最让我崇拜的就是辉哥的hashtable了自己一定要对这些知识进行学习。多学习多联系这是我对写程序的深刻体会 转载于:https://www.cnblogs.com/zsjy/p/3576384.html