1. Github地址
https://github.com/chaosrings/wcPro
2. PSP表格
PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planing | 计划 | 10 | 20 |
·Estimate | ·估计这个任务需要多少时间 | 10 | 20 |
Development | 开发 | 480 | 500 |
·Analysis | ·需求分析(包括学习新技术) | 60 | 60 |
·Design Spec | ·生成设计文档 | 0 | 0 |
· Design Review | 设计复审 (和同事审核设计文档 | 15 | 15 |
· Coding Standard | ·代码规范 (为目前的开发制定合适的规范) | 15 | 15 |
·Design | ·具体设计 | 30 | 30 |
·Coding | ·具体编码 | 180 | 200 |
·Code Review | ·代码复审 | 60 | 60 |
·Test | ·测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | 120 | 120 |
·Test Report | ·测试报告 | 60 | 60 |
·Size Measurement | · 计算工作量 | 30 | 30 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 610 | 640 |
3. 接口实现
我负责的模块主要是对结果进行输出到指定文件中,函数接口为:
void saveToFile(const vector<pair<string, int> > &frequencyVec)
其中的参数frequencyVec是一个Vector数据,保存着单词和相应的词频信息
3.1 具体代码实现
void saveToFile(const vector<pair<string, int> > &frequencyVec)
{
ofstream outputFile("result.txt", ofstream::out); //打开名文result.txt文件,如果当前目录不存在就新建一个
int cnt = 0;
if (outputFile.is_open())
{
for(int i=0;i<(int)frequencyVec.size()&&i<100;++i) //加100的约束条件是只输出前100个统计的单词
outputFile << frequencyVec[i].first << ":" << frequencyVec[i].second << endl;
outputFile.close();
}
}
其中frequencyVec是统计好的“单词-词频”的Vector,并且已经按需求排序。所以在这个保存结果的函数里需要做的就是打开result.txt文件,并把结果写到文件中。如果该目录下不存在result.txt文件则新建一个,通过outputFile("result.txt", ofstream::out)实现。如果统计好的不同单词多于100个时,只对前100个做输出处理,操作完成后关闭文件。
4. 测试用例
该函数测试的流程图如下:
4.1 白盒测试:
测试路径 | 测试用例 | 预期输出 | 实际输出 |
---|---|---|---|
1->3 | 当前目录有result.txt文件,frequencyVec的长度小于100 | 统计好的单词全输出 | 全输出 |
2->1->3 | 当前目录没有result.txt文件,frequencyVec的长度小于100 | 创建result.txt文件并输出到其中 | 单词信息写到新建的result.txt中 |
1->4 | frequency中的长度大于100 | 只输出前100项单词和词频 | 排好序的100项单词和相应词频 |
2->1->4 | 当前目录没有result.txt文件,frequencyVec的长度大于100 | 创建result.txt文件并输出前100项到其中 | 100项单词信息写到新建的result.txt中 |
4.2 黑盒测试
对于各种测试输入,可以划分为4个等价类
对于个等价类的输入,同白盒测试一样。
5. 单元测试
由于该函数比较简单,而且主要作用是输出,用专门的测试框架会比较不方便,所以这里并没有用框架而是简单地在main函数里面调用测试。
5.1 少量单词
当只有少量单词时,测试结果如图:
运行结果和预期相同。
5.2 大量单词
当包含大量单词,且单词总数大于100时,结果如下:
运行结果也和预期相同,单词种数大于100则只输出前100项.
6. 小组贡献
0.24
拓展任务:静态测试
以下面小组中的某位成员的一段代码为例进行评审,该代码主要实现了词法分析功能
string Lex::getNextToken()
{
string thisToken = "";
while (currentPos < targetStr.size() && !isalpha(targetStr[currentPos]))//在currentPos小于目标字符长度时跳过非字母开头
++currentPos;
while (currentPos < targetStr.size())
{
char curChar = targetStr[currentPos];
if (isalpha(curChar)) //如果是字母便保存
thisToken +=curChar;
else if (curChar == '-'&¤tPos < targetStr.size() - 1 && isalpha(targetStr[currentPos + 1]))//有连字符号时,只有连字符号后是字母才算单词
{
thisToken += '-';
}
else
break; //其他情况,已经从curentPos开始获取到了一个单词,返回
currentPos++;
}
return thisToken;
}
参照谷歌C++风格指南,对代码的规范进行评价:
1、缩进比较合理,方便代码的阅读
2、变量命名比较规范,容易理解变量含义
3、加以适当的注释可以让人更好地理解代码
4、方法有恰当的返回值,代码结构清晰
大体上来说并没有什么问题。
再利用cppcheck检查自己的代码,也没有太大的问题。