第二周作业——词频统计
题目需求具体如下:
https://edu.cnblogs.com/campus/nenu/2018fall/homework/2126
git地址:
https://git.coding.net/liu-xin/wf.git
功能1 小文件输入,为表明程序能跑。需要在控制台下输入命令,实现统计文件中不重复单词总个数,重复次数由高到低输出。
功能 2 命令行输入英文作品的文件名,实现作品不重复单词计数,重复次数由高到低输出前十位。
功能 3 命令行输入存储有英文作品文件的目录名,批量统计作品不重复单词总数,重复次数由高到低输出前十位。
功能 4从控制台读入英文单篇作品,表明你能提供更适合嵌入脚本的作品或者bing:linux重定向。
一、准备工作
从头到尾浏览一遍题目要求以后,我第一反应不是编程思路是什么,而是先把准备工作做好。打开Excel表,随时记录时间,打开Word,随时记录遇到的困难和解决办法。
二、版本控制
版本控制我之前是没有接触过的,刚开始是一脸懵,直接从度娘开始,查找什么是版本控制?什么是git?什么是tortoisgit?具体怎样操作都是一步一步跟着自己查找进行操作。但是,其中还是走了好多弯路,耗费了大量的时间在熟悉工具上。心得:只知道按步骤来,不思考,往往做着无用功。
第一步:下载、安装git和git客户端tortoisgit。
git下载地址:https://git-scm.com/download
tortoisgit下载地址:https://tortoisegit.org/download/
安装过程:点击下一步。
第二步:申请coding.net账号并新建一个项目
第三步:在coding.net上配置远程git ,具体请参见
https://blog.csdn.net/gyy930324/article/details/54575246
(PS:若是代码丢失,现在代码无法运行,找不到原版代码,需要恢复代码参见https://blog.csdn.net/jjs2749651/article/details/80763842。希望你用不到代码恢复,太惨了……)
三、学习过程
准备工作做好之后,接下来是最核心的环节了,由于自己对C语言比较熟悉,选择了C语言进行编程。利用中午下课午休时间去图书馆借了谭浩强《C语言程序设计》,用于知识点的查漏补缺。
我把要求详细的分析了以后,列出了我认为比较关键的地方:
1. 文件的读取:
2. 文件遍历
3. 单词判断:a.重复 b.大小写 c.特殊符号
4. 词频排序:
5.控制台输出
6.代码整合
7.重定向
四、遇到的困难与解决办法
功能一:
- 忘记了C语言中文件的读。
解决办法:参见参见谭浩强《C语言程序设计》第四版第十章和https://blog.csdn.net/qq_29109941/article/details/74276375
2.忘记了结构体和指针的用法。
解决办法:参见谭浩强《C语言程序设计》第四版 第八章和第九章。
3.忘记了排序算法。
解决办法:参见谭浩强《C语言程序设计》第四版 P147。
4.控制台使用命令行参数运行程序。
解决办法:int main(int argc,char *argv[])
//argv[0]指向程序运行的全路径名
//argv[1]指向DOS命令行中执行程序名后的第一个字符串
//argv[2]指向执行程序名后的第二个字符串
//argv为存储命令行参数的字符串数组
功能二:
- 不知道怎么处理整本小说读。
解决办法:https://blog.csdn.net/yang332233/article/details/53081785 (实现txt读取)
2.单词统计判断出现错误。
解决办法:除了大小写分别26个字母以外,处理特殊符号。
功能三 :
- 遍历文件夹中的txt困难。
解决办法:查找文件的类 struct _finddata_t结构体用法,chdir函数用法。
2.无法自动输出文件中每一个txt的词频统计。
解决办法:每读取一个目录输出一次单词统计。
3.各个功能代码整合困难。(判断输入是文件夹的名字,还是文件txt的名字比较困难)
解决办法:1)通过输入的参数判断:if (S_ISDIR(st.st_mode))
2)正则表达: 正则没看懂,最后选择的第一种解决办法。
功能四:
- 不理解题意。
解决办法:找度娘,浏览相关博客了解重定向的相关知识点。非自己实现,参考了潘世维同学的代码,在此表示感谢。
五、重要代码
1
long Handle; //遍历文件夹中的txt struct _finddata_t fileinfo; struct stat st; stat(argv[1],&st); //判断某文件是文件夹还是文件 if (S_ISDIR(st.st_mode)) //是文件夹 { chdir(argv[1]); //chdir()用户将当前的工作目录改变成以参数路径所指的目录 if((Handle=_findfirst("*.txt",&fileinfo))==-1L) //findfirst搜索与指定的文件名称匹配的第一个实例,若成功则返回第一个实例的句柄,否则返回-1L。 { printf("没有找到匹配的项目\n"); } else { printf("%s\n",fileinfo.name); find(fileinfo); while(_findnext(Handle,&fileinfo)==0) { printf("---\n"); printf("%s\n",fileinfo.name); find(fileinfo); printf("---\n"); } _findclose(Handle); } }
2
1 FILE *fp; 2 fp=fopen(fileinfo.name,"r");
3
void count(char s[]) { int i,j; int flag=0; for(i=0;i<=sum;i++) { if(strcmp(C[i].str,s)==0) { C[i].num++; flag=1; } } if(flag==0) { for(j=0;j<30;j++) C[sum].str[j]=s[j]; C[sum].num++; sum++; } }
4
void paixu() { int i,j; struct word a; for(i=0;i<sum;i++) { for(j=i+1;j<sum;j++) { if(C[i].num<C[j].num) { a=C[j]; C[j]=C[i]; C[i]=a; } } }
六、 执行效果图
功能一
功能二
功能三
功能四
七、PSP阶段表格
PSP阶段 | 预计花费时间 | 实际花费时间 | 时间差距 |
功能一 | 480min | 804min | 324min |
txt文件的读取 | 60min | 91min | 31min |
结构体和指针的用法 | 60min | 87min | 27min |
单词计数 | 30min | 42min | 12min |
排序算法 | 45nin | 65min | 20min |
使用命令行参数运行程序 | --- | 287min | |
代码调试 | --- | 232min | |
功能二 | 60min | 94min | 34min |
读取txt内容 | 60min | 48min | 12min |
控制前十输出 | 10min | 17min | 7min |
代码调试 | --- | 29min | |
功能三 | 480min | 546min | 66min |
遍历文件夹 | 180min | 233min | 53min |
代码调试 | --- | 81min | |
代码优化 | --- | 65min | |
功能整合 | 120min | 167min | 47min |
功能四 | 420min | 465min | 45min |
需求分析 | 120min | 134min | 14min |
重定向 | 180min | 112min | 68min |
代码优化 | --- | 219min |