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

posted @ 2018-09-24 21:09  段晓睿  阅读(197)  评论(0编辑  收藏  举报