福大软工1816 - 第二次作业
福大软工1816 - 第二次作业
github项目地址:https://github.com/Travaill/personal-project
1.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 600 | 685 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 20 | 20 |
· Design Spec | · 生成设计文档 | 20 | 20 |
· Design Review | · 设计复审 | 5 | 5 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 420 | 480 |
· Code Review | · 代码复审 | 10 | 5 |
· Test | · 测试(自我测试,修改代码,提交修改) | 20 | 30 |
Reporting | 报告 | ||
· Test Repor | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 60 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 5 |
合计 | 675 | 685 |
2.需求分析
输入文件名以命令行参数传入。例如我们在命令行窗口(cmd)中输入:
WordCount.exe input.txt
统计input.txt中的以下几个指标
- 统计文件的字符数:
- 只需要统计Ascii码,汉字不需考虑
- 空格,水平制表符,换行符,均算字符
- 统计文件的单词总数,单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
- 英文字母: A-Z,a-z
- 字母数字符号:A-Z, a-z,0-9
- 分割符:空格,非字母数字符号
- 例:file123是一个单词, 123file不是一个单词。file,File和FILE是同一个单词
- 统计文件的有效行数:任何包含非空白字符的行,都需要统计。
- 统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词。
- 按照字典序输出到文件result.txt:例如,windows95,windows98和windows2000同时出现时,则先输出windows2000
- 输出的单词统一为小写格式
- 输出的格式为
characters: number
words: number
lines: number
<word1>: number
<word2>: number
...
3.计算模块接口的设计与实现过程
代码主要模块
- 预处理模块:将一份txt文件里面的非法字符等全部转换为空格
- 字符统计模块:统计文件中出现的字符
- 行数统计模块:统计文件中的行数综合
- 单词统计模块:统计文件中的单词出现次数并输出频率前十的单词,频率相同按照字典序输出
程序流程图
关键函数展示
在判断合法单词的时候利用了正则表达式
vector<pair<string, int>> CountWord() //调用这个函数把文字传进来。
{
ifstream in("temp.txt");
ostringstream tmp;
tmp << in.rdbuf();
string str = tmp.str();
map<string, int> result;
regex repPattern("[a-zA-Z]{4,}[a-z0-9A-Z]*");
// 声明匹配结果变量
match_results<string::const_iterator> rerResult;
// 定义待匹配的字符串
string strValue = str;
while (regex_search(strValue, rerResult, repPattern))
{
result[rerResult[0]]++;
strValue = rerResult.suffix().str();
}
vector<pair<string, int>> resultvec(result.begin(), result.end());
sort(resultvec.begin(), resultvec.end(), CmpByValue());
return resultvec;
}
4.计算模块接口部分的性能改进
5.计算模块部分单元测试展示
还在学习中......
6.计算模块部分异常处理说明
-
当要输入的文件名不存在时
FILE *fp; fp = fopen(filename,"rt"); if(fp==NULL) { printf("文件名或文件地址输入错误\n"); }
7.心得体会
太久没打C语言了,代码的实现过程变成异常痛苦,花了太多的时间在实现代码上,然后做封装等等,但是目前的代码规范让自己还不是很满意,例如变量名注释返回值等还有很多可以改进的地方,特别是异常处理,由于直接开始实现代码,没有提前想到这个部分,所以后续添加异常处理的时候就变得特别困难。