作业要求
1. 对源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等)统计字符数、单词数、行数、词频,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件
2. 使用性能测试工具进行分析,找到性能的瓶颈并改进
3. 对代码进行质量分析,消除所有警告
4. 设计10个测试样例用于测试,确保程序正常运行(例如:空文件,只包含一个词的文件,只有一行的文件,典型文件等等)
功能要求
1. 统计文件的字符数
2. 统计文件的单词总数
3. 统计文件的总行数
4. 统计文件中各单词的出现次数
5. 对给定文件夹及其递归子文件夹下的所有文件进行统计
6. 统计两个单词(词组)在一起的频率,输出频率最高的前10个
注意:
a) 空格,水平制表符,换行符,均算字符,需要统计的字符ASCII码值范围:32-126,其他字符均可视为分隔符
b) 单词的定义:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写
英文字母:A-Z,a-z
字母数字符号:A-Z,a-z,0-9
分割符:空格,非字母数字符号
例如:”file123”是一个单词,”123file”不是一个单词。file,File和FILE是同一个单词。
如果两个单词只有最后的数字结尾不同,则认为是同一个单词,例如,windows,windows95和windows7是同一个单词,iPhone4和IPhone5是同一个单词,但是,windows和windows32a是不同的单词,因为他们不是仅有数字结尾不同
输出按字典顺序,例如,windows95,windows98和windows2000同时出现时,输出windows2000
词组的定义:windows95 good, windows2000 good123,可以算是同一种词组。按照词典顺序输出。
c) 输入文件名以命令行参数传入
d) 输出文件result.txt
characters: number
words: number
lines: number
<word>: number
<word>为文件中真实出现的单词大小写格式,例如,如果文件中只出现了File和file,程序不应当输出FILE,且<word>按字典顺序(基于ASCII)排列,上例中程序应该输出File: 2
e) 根据命令行参数判断是否为目录
初步思路
1.文件遍历:采用深度优先搜索的方法递归遍历根目录下的所有文件
2.行数统计:以按行读取的方式读取文本文件,每次成功读取后对应的counter+1,直至文件末尾
3.字符数统计:判断字符的ASCII码范围是否是32-126,若是则对应的counter+1,若不是则继续看下一个字符
4.单词统计:根据要求,只有由至少4个英文字母打头的连续英文、数字字符串才算做一个单词,并且单词实体忽略数字尾端以及不区别大小写字母,因此可以用单词的前四个字母计算出偏移量,并根据这个偏移量将单词放入哈希散列表中,同时每个单词应具有最简形式、已统计数量等属性,故采用结构体的形式存储
5.词组统计:一个词组由两个单词构成,故可以用指向两个单词结构体的指针表示词组
typedef struct My_Word_Class { string word; string trimmed; //word without digital suffix and capital character intptr_t number; struct My_Word_Class *next; }MyWC; typedef struct My_Group_Class { MyWC *firstWord, *secondWord; intptr_t number; struct My_Group_Class *next; }MyGC;