一、要求

1、对源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等,文件夹内的所有文件)统计字符数、单词数、行数、词频,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速处理多个文件。

 

2. 使用性能测试工具进行分析,找到性能的瓶颈并改进

 

3. 对代码进行质量分析,消除所有警告

 

4. 设计10个测试样例用于测试,确保程序正常运行(例如:空文件,只包含一个词的文件,只有一行的文件,典型文件等等)

 

 

二、需求分析

(1)基本功能

a) 统计文件的字符数;

b) 统计文件的单词总数;

c) 统计文件的总行数;

d) 统计文件中各单词的出现次数,输出频率最高的10个;

e) 对给定文件夹及其递归子文件夹下的所有文件进行统计;

f) 统计两个单词(词组)在一起的频率,输出频率最高的前10个;

g) 在Linux系统下,进行性能分析,过程写到blog中(附加题)。

(2)输入与输出要求

a) 输入以命令行参数传入(文件夹的路径);

b) 在当前路径输出最终结果文件result.txt。

三、基本思路

看到要求首先想到的是针对每一个要求写一个独立的函数来统计,在统计过程中考虑所有情况之后就可以得到正确的输出,但是之后又想到在统计的过程中都需要遍历所有文件,按照字符对文件进行读取,那么可以直接把所有功能全部写在一个函数里面,统计所有需要统计的项目,虽然这样使一个函数里面的功能过多,但是可以提高速度,而且遍历一遍文件只做一个功能也不符合实际的要求,于是我决定把5个主要功能写在一个函数里面。

然后是具体的实现,统计字符数、总行数和总单词数比较简单,设置计数器每次加1即可。对于出现次数最多的单词和词组,最开始想到的是字典树,但是其查找排序比较费时间所以放弃,后来想到hash函数,而无序容器也有hash函数的功能,由于考虑到自己没有信心写出比标准库更有效的hash所以直接使用unordered_map,统计完所有单词和词组之后由于只要求输出出现次数最多的10个,所以可以考虑用选择或者冒泡排序找出最多的10个就结束循环。遍历文件的方法也不用多说,可以使用 _finddata_t 结构体及 _findfirst 和 _findnext等函数,所以大致思路就是这样,PSP表格等到全部写完之后再上传。

测试样例可以考虑所有情况,比如下面的样例:

aaaa aaaa aaaa aaaa aaaa aaaa aaaa

abc123 abc123 abc123 abc123 abc123 abc123 abc123 abc123

abc123a abc123a abc123a abc123a abc123a abc123a

a/aaa a/aaa a/aaa a/aaa a/aaa

a/aaaaa a/aaaaa a/aaaaa a/aaaaa a/aaaaa a/aaaaa

a/aaaaa123 a/aaaaa123 a/aaaaa123 a/aaaaa456

AaAa AaAa AaAa AaAa AaAa