福大软工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语言了,代码的实现过程变成异常痛苦,花了太多的时间在实现代码上,然后做封装等等,但是目前的代码规范让自己还不是很满意,例如变量名注释返回值等还有很多可以改进的地方,特别是异常处理,由于直接开始实现代码,没有提前想到这个部分,所以后续添加异常处理的时候就变得特别困难。

posted @ 2018-09-12 22:23  travail  阅读(204)  评论(0编辑  收藏  举报