第一部分
—具体要求:要求包括: (1)bug标题,(2)bug内容,含测试环境和准备工作、测试的步骤、运行结果、期待的结果、运行结果与期待结果间的差异, (3)佐证材料,至少包括运行截图、引用作业要求 (wf spec)中的条款。
被测试作者:高远博同学
git地址:https://coding.net/u/Rainbows/p/wc/git
标题:没有区分大小写
环境:win10,控制台输入命令
重现步骤:
1.exe程序根目录中shift右键空白处启动控制台
2.输入 wf -s test.txt
3.运行结果:没有统一小写
截图如下:
预期结果:
标题:输出格式不正确
环境:win10,控制台输入命令,codeblocks
重现步骤:
1.exe程序根目录中shift右键空白处启动控制台
2.输入 wf -s war_and_peace.txt
3.运行结果:输出格式不对
截图如下:
预期结果:
总结:两次输出格式都不符合要求,不过这个问题是小问题,易于修改,程序的主要功能函数还是符合预期的。
第二部分
—具体要求: 记录所有为你的代码找到的bug,合并相同的bug,亲自重现bug现象,发布bug报告。
1.被测试作者:自己
标题:输入不符合标准
环境:win10,控制台输入命令
重现步骤:
1.exe程序根目录中shift右键空白处启动控制台
2.输入 wf gone_with_the_wand
3.运行结果:无法正常打开
2.被测试作者:自己
标题:输出不符合标准
环境:win10,控制台输入命令
重现步骤:
1.exe程序根目录中shift右键空白处启动控制台
2.输入 wf Gone_with_the_wind
3.运行结果:输出结果明显单词的个数不正确
截图如下:
3.被测试作者:自己
标题:输出不符合标准
环境:win10,控制台输入命令
重现步骤:
1.exe程序根目录中shift右键空白处启动控制台
2.输入 wf Gone_with_the_wind
3.运行结果:输出结果有个别单词划分错误
截图如下:
4.被测试作者:自己
标题:输出不符合标准
环境:win10,控制台输入命令
重现步骤:
1.exe程序根目录中shift右键空白处启动控制台
2.输入 wf -s < war_and_peace.txt
3.运行结果:输出结果为全部单词而不是要求的前十
截图如下:
5.被测试作者:自己
标题:编译错误
环境:win10,vs2013
重现步骤:
在vs2013调试代码出现bug
截图如下
第三部分
—具体要求: 修改bug。根据自己和其他同学提交的bug报告,修改自己代码的bug,或clone其他任意同学的代码,另建git,在此git中修改这位同学的bug。
对应第二部分的五个bug:
1.按照要求输入无法正常读取
这个原因是我在这周优化代码时发现到的问题。在我最开始的代码中,为了图方便把读取文件的目录放在了“G://”下。这样设置很容易出现错误,因为考虑到不是每个人的盘符都能到G盘。而且我看到很多同学的程序把路径都设置成程序的根目录下,所以我也把我的程序改成这样。
改动的部分代码如下:

1 char const *a = argv[i]; 2 char const *b = ".txt"; 3 std::string const& cc = std::string(a) + std::string(b); 4 char const *c = cc.c_str(); 5 fin.open(c);
2.输出结果单词的个数不正确
这个bug也是在这周才发现,因为在上周测试的时候,因为单篇文章的单词书很多,所以很难判断是否出错。这周在优化的过程中发现了这个bug。是由于循环写错了,已经进行修改。
部分代码:

1 while(fin >> strWord) 2 { 3 StringToLower(strWord); 4 erasePunct(strWord);//调用标点判断函数 5 wmap[strWord]++; 6 }
修改后截图:
3.输出结果有个别单词划分错误
这个问题在第一周进行测试的时候就已经发现,当时没有好的解决方法。在这周进行优化的时候,读了《C++ prime》这本书。知道可以利用string类提供的可向前和向后遍历的迭代器iterator。同时可以利用内置的ispunct()函数直接判断参数是否为标点符号或特殊符号,则返回TRUE,否则返回NULL(0)。这样大大提高了识别率。修改后的部分代码:

1 void erasePunct(string &s)//利用字符串判断和iterator迭代器的特性直接判断标点符号 2 { 3 string::iterator it = s.begin(); 4 while(it != s.end()) 5 { 6 if(ispunct(*it))//ispunct()可以直接判断参数是否为标点符号或特殊符号。 7 it = s.erase(it); 8 else 9 ++it; 10 } 11 }
修改后截图:
4.输出结果为全部单词而不是要求的前十
这个问题在我第一周设计程序的时候就没太明白。因为不知道到底哪部分要全输出,哪部分要只输出前十。在我的理解下单文件读取的应该都是全部输出。多个文件读入的时候应该只输出前十的单词。但是这周在优化程序的时候看到大部分同学都是在war_and_peace这个文件中只输出前十,所以我也该为这样。
修改后截图:
5.编译错误
这个bug很奇怪。因为这周的任务是优化性能,所以我把原本程序中运行速度最慢的部分做了优化。在CodeBlocks中调试并且编译成功。而且在最后测试中也完全符合预期。但我在vs2013中调试就会跳出错误。我bing google了很多网页,怀疑是野指针的问题。便开始修改,修改了好几个版本的确可以正常运行,但是又会出现各种奇奇怪怪的bug。所以这个bug暂时还是没办法修复。