第四周作业

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 == '-'&&currentPos < targetStr.size() - 1 && isalpha(targetStr[currentPos + 1]))//有连字符号时,只有连字符号后是字母才算单词
		{
			thisToken += '-';
		}
		else
			break;  //其他情况,已经从curentPos开始获取到了一个单词,返回
		currentPos++;
	}
	return thisToken;

}

参照谷歌C++风格指南,对代码的规范进行评价:
1、缩进比较合理,方便代码的阅读
2、变量命名比较规范,容易理解变量含义
3、加以适当的注释可以让人更好地理解代码
4、方法有恰当的返回值,代码结构清晰
大体上来说并没有什么问题。
再利用cppcheck检查自己的代码,也没有太大的问题。

posted @ 2018-04-08 20:35  LZing  阅读(184)  评论(2编辑  收藏  举报