20180918-1 词频统计
此作业的要求参见[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2126]
功能需求:
1.小文件输入. 为表明程序能跑
2.支持命令行输入英文作品的文件名
3. 支持命令行输入存储有英文作品文件的目录名,批量统计
4. 从控制台读入英文单篇作品,重定向输出
功能实现:
首先从最小的功能1开始实现,大体思路是:
先成功读取文件,我是一个字符一个字符的读入的;
然后判断是否属于一个单词,存入我设置的结构体中;
存入的过程中会判断这个单词之前有没有出现过,进行计数;
然后是依据单词出现的次数进行排序;
最后显示输出。
功能1实现效果如下:
单词的判定如下:
1 while(!feof(fp)) 2 { 3 c=fgetc(fp); 4 5 if((c>=97 && c<=122) || (c>=65 && c<=90) || c==95 || c==45 || c==39) 6 { 7 if(c>=65 && c<=90) 8 str[i]=c+32; 9 else 10 str[i]=c; 11 //word中用"_"或'-'或'\''连接的算一个单词 12 str[++i]='\0'; 13 flag=0; 14 } 15 else 16 { 17 if(flag==0) //如果是紧跟(考虑到有连续出现2个及以上标点的情况)在一个字母后的标点, 18 //则前面读取到了一个单词,存入链表 19 { 20 total+=Save_word(str,head); 21 sum++; 22 flag=1; 23 i=0; 24 } 25 } 26 }
功能2的实现过程中没有对功能1的关键代码做修改,为了更方便的查看单词数很多的文件的运行结果,我加入了一个写文件的功能,最后提交的时候删除了这一功能。
下图是老师给的示例中的the_dead_return的统计结果:
功能3中的读取文件夹的操作,我参考了[https://blog.csdn.net/enjoy_learn/article/details/78314346]中的代码,
在定位到命令行输入的文件夹的步骤时出现问题,使用头文件#include<direct.h>和函数_chdir(filedr)得到解决。
部分运行结果如下:
使用了下面的方式判断输入的是文件名还是文件夹名
1 if(_S_IFREG & buf.st_mode)
1 else if(_S_IFDIR & buf.st_mode)
尝试了很久功能4的实现,在处理参数时遇到问题,暂未能解决。
由于要求控制台命令行运行,我在完成了3个功能之后开始修改输入的方式,这参考了[https://blog.csdn.net/jaken99/article/details/77657480],实现判断输入字符串是文件还是文件夹。现在代码的组织结构很乱以至于都不知道该截取哪段代码贴上来,并且只能完成前三个功能,我准备重新整理一下,但估计赶不上deadline了,所以我要交作业了。
功能实现及测试PSP
PSP阶段 | 预计花费时间/min | 实际花费时间/min | 时间花费差距原因 |
实现功能1 | 120 | 223 | 用到了指针,由于对C语言有些遗忘,使用时指针指向的逻辑关系会出错,在复习语法和调试的过程中耗费了2-3个小时。 |
实现功能2 | 45 | 69 | 在功能1的基础上没有做过多修改,在输入的文件名是否有.txt的处理上耗费了时间 |
实现功能3 | 120 | 142 | 功能3是功能1、2的拓展,在显示输出,文件夹定位和打开并读取其中文本文件的过程中耗费了时间。 |
实现控制台输入 | 105 | 最开始还是对控制台理解不够,以为用VS运行时的黑框框就可以。后来改成控制台输入,对输入数据进行了新的处理。 | |
实现功能4 | 180 | 前期代码组织很乱,只抽取了几个函数并且使用效果不好,主函数中的输入的判断和单词的判断混在了一起,对功能1、2、3、4的区分不够导致后期对输入的处理出现了问题,无法对功能4相应的输入进行处理,想重新组织代码但时间有限,只完成了前3个功能。 |
本次作业代码地址:https://coding.net/u/Ruidxr/p/Word_Frequency_Count/git
作者:段小胖 本文版权归作者和博客园共有,欢迎转载。未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出,以免更多的人被误导。 |