此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2126]
代码【https://coding.net/u/liuyy0817/p/count_words/git】
词频统计 SPEC 20180918
老五在寝室吹牛他熟读过《鲁滨逊漂流记》,在女生面前吹牛热爱《呼啸山庄》《简爱》和《飘》,在你面前说通读了《战争与和平》。但是,他的四级至今没过。你们几个私下商量,这几本大作的单词量不可能低于四级,大家听说你学习《构建之法》,一致推举你写个程序名字叫wf,统计英文作品的单词量并给出每个单词出现的次数,准备用于打脸老五。
功能1 小文件输入。
为表明程序能跑,结果真实而不是迫害老五,请他亲自键盘在控制台下输入命令。为了评估老五的词汇量而不是阅读量,total一项中相同的单词不重复计数,出现2次的very计数1次。
功能2 支持命令行输入英文作品的文件名,请老五亲自录入。输入文件最大不超过40MB. 如果你的程序中途崩了,会被老五打脸,不增加经验值。
功能3 支持命令行输入存储有英文作品文件的目录名,批量统计。因为单词量巨大,只列出出现次数最多的10个单词。
功能4 从控制台读入英文单篇作品,这不是为了打脸老五,而是为了向你女朋友炫耀,表明你能提供更适合嵌入脚本中的作品(或者如她所说,不过是更灵活的接口)。如果读不懂需求,请教师兄师姐,或者 bing: linux 重定向,尽管这个功能在windows下也有,搜索关键词中加入linux有利于迅速找到。
1、发表博客,介绍上述“项目”中每个功能的重点/难点,展示重要代码片断,给出执行效果截图,展示你感觉得意、突破、困难的地方。
重点难点:
1)命令行参数
每个C语言程序都必须有一个称为main()的函数,作为程序启动的起点。当执行程序时,命令行参数(command-line argument)(由shell逐一解析)通过两个入参提供给main()函数。第一个参数int argc,表示命令行参数的个数。第二个参数char *argv[],是一个指向命令行参数的指针数组,每一参数又都是以空字符(null)结尾的字符串。第一个字符串,亦即argv[0]指向的,(通常)是该程序的名称。argv中的指针列表以NULL指针结尾(即argv[argc]为NULL)。
2)如何分词(字母,连词符,换行号算作单词,其余算分词)
1 for (int i = 0; i<len; i++) 2 { 3 if (isalpha(temp[i]) || temp[i] == '-' || temp[i] == '\'') 4 { 5 tmp[j] = temp[i]; 6 j++; 7 } 8 9 }
3)如何按词频大小输出(把map里的数据存到vector里,然后排序)
1 void display_maps(map<string, int> &wmap) //把数据存到map里进行排序 2 { 3 map<string, int>::const_iterator map_it; 4 int tot = 0; 5 for (map_it = wmap.begin(); map_it != wmap.end(); map_it++) 6 tot++; 7 cout << "total " << tot << endl; 8 cout << endl; 9 vector<PAIR> name_number_vec(wmap.begin(), wmap.end()); 10 sort(name_number_vec.begin(), name_number_vec.end(), CmpByValue()); 11 for (int i = 0; i != name_number_vec.size(); ++i) { 12 if (i>9) 13 break; 14 cout << setw(10) << name_number_vec[i].first << setw(6) << name_number_vec[i].second << endl; 15 } 16 }
执行效果图
功能1
功能2
功能3与功能4未能实现。
2、在同一篇博客中,参照教材第35页表2-2和表2-3,为上述“项目”制作PSP阶段表格。
PSP阶段表格第1列分类,如功能1、功能2、测试功能1等。
要求1 估算你对每个功能 (或/和子功能)的预计花费时间,填入PSP阶段表格,时间颗粒度为分钟。
要求2 记录词频统计项目实际花费时间,填入PSP阶段表格,时间颗粒度要求分钟。
要求3 对比要求1和要求2中每项时间花费的差距,分析原因。
PSP表格
分类 | 预计花费时间 | 实际花费时间 |
功能1 | 120 | 198 |
功能2 | 60 | 108 |
功能3 | 180 | 323,未完成 |
功能4 | 120 | 225,未完成 |
总结:由于基础差,太久没编程等种种原因,这个项目我做起来很吃力,完全达不到老师要求的效果,然后我请教了高远博学长,在学长的帮助下,我实现了前两个功能,在此,我要感谢高远博学长对我帮助。这次作业也教会我,要继续努力,不会的地方要多去向学姐学长请教,他们每个人都会教会我许多东西,自己一个人闭门造车是没有用的,只会浪费时间。