github的地址
[https://github.com/Cai-WB/personal-project/tree/master/Cplusplus/031602301/src/Project1]
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 60 | 60 |
•Estimate | •估计这个任务需要多少时间 | 500 | 730 |
Development | 开发 | 40 | 30 |
•Analysis | •需求分析 (包括学习新技术) | 150 | 200 |
•Design Spec | •生成设计文档 | 30 | 20 |
•Design Review | •设计复审 | 20 | 15 |
•Coding Standard | •代码规范(为目前的开发制定合适的规范) | 10 | 20 |
•Design | •具体设计 | 10 | 20 |
•Coding | •具体编码 | 120 | 150 |
•Code Review | •代码复审 | 30 | 30 |
•Test | •测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 30 | 30 |
•Test Repor | •测试报告 | 20 | 15 |
•Size Measurement | •计算工作量 | 40 | 20 |
•Postmortem & Process Improvement Plan | •事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 580 | 730 |
解题思路描述
拿到这个题目,第一个感觉就是what???怎么看不懂啊,但是静下心来慢慢的分析题目的要求,发现小要求真多。对于第一个要求,统计字符的个数,采取读行的方法,每次读取一行(相当于段落数,这时题目要求我们求取的文件段落数也一并解觉了),统计该行的字符数,然后重复该步骤直至读完文件。对于第二个要求,统计单词的个数,采用正则表达式的思想,匹配到合适的字符串,统计合适的字符串的个数,把这些字符串放到集合里面。然后遍历集合,找出频率最高的十个字符串,然后输出。
设计实现过程
在设计代码的过程中,我设计了两个类,一个是File类用来实现文件的一些相关读写操作,里面构造了若干个函数,比如文件的输入或者输出,另一个countWord类用来实现单词的分类和判断,依据正则表达式的思想设计算法,分割单词,将其放入集合中,统计出现的次数
性能分析
代码分析
该函数是整个代码的核心段,主要用来实现对单词的判断,分割,统计。
void File::Wordscount(string filename)
{
ifstream cinfile(filename, ios::in | ios::_Nocreate);
smatch m;
string s, s1;
regex danci("[a-zA-Z]{4}[0-9a-zA-Z]*");
while (getline(cinfile, s))
{
while (regex_search(s, m, danci))
{
s1 = m.str();
transform(s1.begin(), s1.end(), s1.begin(), tolower);
words.push_back(s1);
wordscount++;
s = m.suffix().str();
}
}
cinfile.close();
List::iterator i, j;
if (!words.empty())
{
words.sort();
string s;
int temp;
for (i = words.begin(); i != words.end(); ++i)
{
countWord *w = new countWord;
s = *i;
w->name = s;
temp= 1;
for (j = ++i; j != words.end(); ++j)
{
if (s == *j)
temp ++;
else
break;
}
w->count = temp;
i = --j;
words_count.push_back(*w);
}
words.unique();
}
}
还有一些函数是文件的输入输出,在这里不做具体的展示。
代码覆盖率
如图所示
之所以有这样的代码覆盖率,可能是因为文件的输入输出错误或者文件中没有重复的单词
心得体会
在用c++写之前,我先是尝试用java写的,主要是考虑到java中有一个map集合,可以很好的适应这个题目,但是到最后运行的时候结果老是出错,在分割单词的时候出现了问题(可能我学艺不精),能正常实现的功能是读出文档的字符数,段落数。后来随着截止时间的迫近,才采用c++来写的,(但是那个java的代码我是不会放弃的,不写完整有点不甘心,助教学姐有没有帮忙看代码的功能啊)。但是C++的过程也是不容易的,课堂上我们学习的时候并没有学的这么深,像正则表达式,文件的输入输出,都是临时才学的,慢慢的理解。经过这一次的作业,发现自己还要学的还要很多很多,构建之法这本书刚到手不久,只看了一点点,以前就老是觉得代码很重要,但其实对于一道题目,前期的思考和后期的测试,debug所要花费的时间更多,如何提高代码的性能也是值得考虑的,不单单只是能出结果就可以。通过这次的作业,发现自己身上的很多不足,以后还是要好好的努力的,争取提高。