PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 90 | 120 |
· Estimate | · 估计这个任务须要多少时间 | 700 | 797 |
Development | 开发 | 200 | 250 |
· Analysis | · 需求分析 (包括学习新技术) | 150 | 150 |
· Design Spec | · 生成设计文档 | 20 | 10 |
· Design Review | · 设计复审 | 10 | 18 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 10 | 20 |
· Coding | · 具体编码 | 150 | 150 |
· Code Review | · 代码复审 | 5 | 5 |
· Test | · 测试(自我测试,修改代码,提交修改) | 5 | 15 |
Reporting | 报告 | 10 | 10 |
· Test Repor | · 测试报告 | 5 | 3 |
· Size Measurement | · 计算工做量 | 5 | 4 |
· Postmortem & Process Improvement Plan | 11 · 过后总结, 并提出过程改进计划 | 10 | 12 |
合计 | 700 | 797 |
答:首先看到这个题目,先查阅了资料文件输入输出流的具体编码要求和规定,采用一个个字符读取的方式,统计字符数。git
第二步就是筛选单词,将4个字母及以上的单词保留下来,这里还要注意开头是数字的单词也要筛选掉,最后要考虑全是空格的状况,将他的ascii码值做为筛选条件便可筛除。github
最后一步就是统计频数最高的10个单词以及依次输出他们并输出他们的频率。这里查阅资料以及同窗之间相互学习了解到了map的用法,map的用法比较贴切本题要求,故采用map来作这道题。函数
首先写一个getfile函数,实现对文件的读取,用get()函数对每个字符进行读取到程序中。性能
其次是统计函数与单词数,写一个函数,遇到特定字符(例如‘\n’),行数++,可是这样作会有些特殊状况会多加到,所以后面加了一个布尔变量来控制特殊状况的处理。单词数的话用vector来实现,vector是成倍开辟空间,可能会浪费一些空间,可是对于存取字符串比较好用。单元测试
最后是找出频数最高的10个单词并依次输出。采用map去解决这个问题会比较快。并且map的性质符合此题要求,因此采用map来解决,最后遍历10遍依次输出便可。学习
经过向同窗请教得知,C++用于文件读写的ifstream和ofstream函数改成C语言的fopen性能会提高不少,消耗时间会下降一点。查阅相关资料后,代码改进方面能够改为C语言的fopen函数时间会快一点。测试
打开文件而且统计字符函数编码
void agefile(string filename)//打开文件统计字符函数 { char c; ifstream s(filename); if (!s) { flag1 = false; } while (s.get(c))//采用get函数读取字符 { b[j++] = c; } if (flag1 == true) { d << "characters: " << j << endl; //输出字符数 } else { d << "error" << endl; } }
统计频率最高的10个单词而且输出单词及频数设计
void addword(bool flag = true, int max = -999)//统计单词数词频最多的10个单词以及输出单词 { bool flag2 = false; q = strmap.begin(); for (int s1 = 0; s1 < 10; s1++)//采用遍历10次的的方式,若是不足十次bool值置false跳出循环 { flag2 = false; if (flag == false) { break; } flag = true; max = -999; while (q != strmap.end())//采用map函数进行存取遍历 { if (q->second > max) { flag2 = true; max = q->second; a = q->first; } q++; } if (flag2 == true) { d << "<" << a << ">: " << max << endl; } q = strmap.begin(); strmap[a] = -10; for (int j1 = 0; j1 < str_shorted.size(); j1++)//判断 { if (strmap[str_shorted[j1]] == -10) { w++; } } if (w == str_shorted.size()) { flag = false; } w = 0; } }
选取了比较极端的状况测试。共采用5组相似极端数据测试,通过与同窗比对,没有出现太大问题。3d
测试图以下:
1.没有输入文件时形成的停滞。解决:新增布尔变量和error机制
2.文件中统计单词数异常的问题。解决:更改了断定机制,原先的断定机制不足以应付全部特殊状况。
从此次实践中学到了比较多的东西,了解了程序读写文件的方法,程序的内测等。增强了代码能力,缺点在于编码的规范真的不好劲,编码的习惯也有所不足,之后须要慢慢改正以及多加练习。