第四周小组作业
Posted 彩民
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四周小组作业相关的知识,希望对你有一定的参考价值。
项目地址
https://github.com/DM-Star/WordCount-opt
psp表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
15 |
15 |
· Estimate |
· 估计这个任务需要多少时间 |
15 |
15 |
Development |
开发 |
655 |
700 |
· Analysis |
· 需求分析 (包括学习新技术) |
180 |
180 |
· Design Spec |
· 生成设计文档 |
45 |
30 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 |
10 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
30 |
· Design |
· 具体设计 |
30 |
50 |
· Coding |
· 具体编码 |
300 |
300 |
· Code Review |
· 代码复审 |
30 |
60 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 |
40 |
Reporting |
报告 |
65 |
105 |
· Test Report |
· 测试报告 |
30 |
40 |
· Size Measurement |
· 计算工作量 |
5 |
5 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
60 |
|
合计 |
735 |
820 |
基础任务
在本次任务中我负责的是输入控制模块。
【接口实现】:总体用一个bool型的函数bool inputCheck(char *fileName, fstream &in)实现,在main函数里调用此函数,首先对输入文件名进行判断,若输入文件名正确且有效,函数返回true,从而可以继续之后的统计任务。
(1)判断输入文件是否是.txt文件:将输入文件文件名从后往前遍历,提取出文件名的后缀,再与“.txt”比对,从而判断输入文件是否是txt文件。
char *A = ".txt"; char B[MAX_WORD_LEN] = ""; int i = strlen(fileName) - 1; int j = 0; for (i = strlen(fileName) - 1; i >= 0; i--) { if (fileName[i] == \'.\') { for (j = i; j < strlen(fileName); j++) B[j - i] = fileName[j]; } } if (strcmp(A, B) != 0) { cout << fileName << "not a \'txt\' file"; return false; }
(2)判断输入文件是否存在:直接读取文件,若无法读取则说明文件不存在。
in.open(fileName); if (!in) { // Determine if the file exists cout << fileName << "file not exists" << endl; return false; }
(3)判断输入文件是否为空(当然这一步不判断也可以,如果输入文件为空那么输出自然也为空了,但是可以起到一种提示的作用):尝试读取文件中的一个字符,若读取内容为空则说明文件为空。
char ch; ch = in.get(); if (ch == EOF) { // Determine if the file is empty cout << fileName << "file is empty!" << endl; return false; }
单元测试
测试截图:
测试评价:做了十六个测试,测试结果和预想一直。利用白盒测试按照测试路径覆盖了所有的判定节点和路径,不同的路径换用了不同的文件进行测试,但没能凑到二十个用例。测试脚本写的比较笨,一个输入对应一个测试方法。
静态测试
对我个人的代码用Google提供的代码检查工具cpplint做了静态检查,我们参考了Google给出的C++风格指南,并且对所有的代码进行了检查。Google给出的代码规范涉及的范围十分全面,从头文件、命名空间,一直到if……else……语句,到注释、空格、花括号,都给出了详尽的规范。以下是我对自己代码进行静态检查的结果:
结果显示,大部分都是格式问题。
性能测试和优化
虽然我的代码只是很小的一部分,但是还是有很多可以优化的地方。在我们组长王宇轩的指导下,我们对输入控制部分的代码做了一些优化
char *inputCheck(char *fileName) { char B[MAX_WORD_LEN] = ""; for (int i = strlen(fileName) - 1; i >= 0; i--) { if (fileName[i] == \'.\') { for (int j = i; j < strlen(fileName); j++) B[j - i] = fileName[j]; } } if (strcmp(".txt", B) != 0) { cout << fileName << "not a \'txt\' file"; return nullptr; } ifstream in(fileName, ios::binary); if (!in) { // Determine if the file exists cout << fileName << "file not exists" << endl; return nullptr; } filebuf *pbuf = in.rdbuf(); // 调用buffer对象方法获取文件大小 long size = pbuf->pubseekoff(0, ios::end, ios::in); if (size == 0) { cout << fileName << "file is empty" << endl; in.close(); return nullptr; } pbuf->pubseekpos(0, ios::in); // 分配内存空间 char *ch = new char[size + 1]; pbuf->sgetn(ch, size); ch[size] = \'\\0\'; in.close(); return ch; }
主要改进是,原来用fstream读取文件,改成了用ifstream读取文件,因为fstream是逐个读取,而ifstream可以将整个文件一次性读取出来,程序整体的运行时间减少了几秒钟。
总结
在这一次的小组作业中,我认识到了自己编写代码时存在的很多不规范的问题,我们的组长也给我指出了很多问题,比如说只用过一次的数据就不要再设置变量进行赋值了,不仅浪费空间,代码看起来也会更加繁琐。而这些静态测试工具也能够很好地帮助我们规范代码,这让我意识到了测试在编程中的重要性。
以上是关于第四周小组作业的主要内容,如果未能解决你的问题,请参考以下文章