1. github地址:https://github.com/changjiang666/WcPro
2. PSP表格
PSP2.1 |
PSP阶段 |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
60 | 60 |
· Estimate |
· 估计这个任务需要多少时间 |
60 | 60 |
Development |
开发 |
250 | 300 |
· Analysis |
· 需求分析 (包括学习新技术) |
20 | 30 |
· Design Spec |
· 生成设计文档 |
10 | 20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 | 20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 | 10 |
· Design |
· 具体设计 |
10 | 10 |
· Coding |
· 具体编码 |
120 | 150 |
· Code Review |
· 代码复审 |
10 | 10 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 | 50 |
Reporting |
报告 |
40 | 50 |
· Test Report |
· 测试报告 |
10 | 10 |
· Size Measurement |
· 计算工作量 |
10 | 20 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 | 20 |
合计 |
350 | 410 |
3. 基础任务
在这次小组作业中,我负责单词计数和排序功能的实现。下面对具体的功能划分以及实现简要讨论:
(1)单词提取: 这次的任务比上次简单一些,优化后的状态只需要2个。代码如下:
if(SPACE == state && isalpha(c)) { state = WORD; tmp.push_back(c); } else if(WORD == state) { if( isalpha(c) || '-' == c ) tmp.push_back(c); else { state = SPACE; word_flag = IS_WORD; } }
state标志着当前读取字符的状态,初值设置为SPACE,遇到字母和-设置为WORD。
word_flag标志当前单词的状态,初值设置为NOT_WORD, 当确定为一个单词时设置为IS_WORD。
(2)词频统计 统计每个单词的数目,会涉及到字符串的查找,查找最快的就是哈希查找,C++中关联容器map已经 帮我们实现了键值对的查找。实现代码如下:
if(IS_WORD == word_flag) { word_flag = NOT_WORD; //word_flag set NOT_WORD, make sure next loop success while(tmp.back() == '-') //process table---- tmp.pop_back(); word.assign(tmp.begin(), tmp.end()); //vector transfer string transform(word.begin(), word.end(), word.begin(), ::tolower); //word transfer lower this->word_count[word] += 1; //count word tmp.clear(); //clear vector and goto next loop }
为了便于后面的讨论,贴出.h中对WcPro类的定义
#ifndef WCPRO_H_ #define WCPRO_H_ #include <map> #include <string> #include <iostream> #include <vector> using namespace std; typedef pair<string, size_t> PAIR; class WcPro { private: vector<PAIR> word_count_vec; map<string, size_t> word_count; char *textBuf; public: WcPro(char *textBuf); ~WcPro(); void processText(); void print(); void getVal(vector<PAIR> &vec); }; #endif // WCPRO_H_
词频统计的代码注释已经说明,下面不再赘述。
(3)排序 排序实现本来应该是最麻烦的,但是C++的STL已经帮我们做好了一切。 只要会抄就行了。sort内部的实现机理我也不清楚,但是效率应该不会低于 C库中的qsort,类似于qsort, sort接受一个函数指针,这个函数指针指向的函数 对排序工作做出具体的指示。不过sort只能对顺序容器排序,不能对关联容器排序。 于是在排序前将关联容器转变成向量。这都很简单,调用接口就行了。直接上代码。 下面是函数指针指向的函数:
bool cmp_by_value(const PAIR& lhs, const PAIR& rhs) { return (lhs.second != rhs.second) ? lhs.second > rhs.second : lhs.first < rhs.first; }
下面是具体的排序工作:
vector<PAIR> word_count_vector(word_count.begin(), word_count.end()); sort(word_count_vector.begin(), word_count_vector.end(), cmp_by_value); word_count_vec.assign(word_count_vector.begin(), word_count_vector.end());
(4)测试
白盒测试主要是对判定结点的测试
黑盒测试主要是按照输入输出的测试
单词提取测试: 用software,content-based, Let’s,night-, "l, TABLE1-2, (see Box 3–2).8885d_c01_016进行测试
词频统计测试: 用fuck, fuck ,fuck! hello, hello, he进行词频统计测试
排序测试: 用w,e,s,r,g,hello, he, ho进行排序测试。
拓展功能
从google的C++风格指南中学习了头文件的定义,并且对头文件的包含顺利有了一点了解。 以前只关注代码的规范,没有注意这些细节,以后要多注意。
我们组都采用了cppcheck静态测试工具来进行了代码的静态测试。 测试结果说WcPro的构造方法参数不明确,然而没有发现什么问题。后来同组的YS查找了一些资料,发现可能是cppcheck本身的问题。
高级任务
最后我把3个人的代码做了集成,拿YX.W的5M的英语名著做了性能测试,包括IO时间,总共花了2S,不到3S。 只能感慨写C++STL的大佬果然不同凡响。 周末我们3个人做了评审,我讲了一下代码的主干部分,YS和LCW对一些可能出错的部分提出了质疑, 我根据自己的理解做了解释。对代码的规范性我提前做了要求,比如变量的命名,函数书写的格式,函数名的规范, 最后大家的代码格式基本一致,很像一个人写的,说明了磨刀不误砍柴工。
这次小组作业让我觉得团队合作的重要性,学会怎么凝聚大家的力量。还有代码开发与软件测试并行, 确保每一个模块没有错误的时候再往下面进行。在写代码的时候,一定要多注释,这样不管自己维护还是别人阅读, 都会减少不少麻烦。