利用C++STL之关联容器求解WcPro

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对一些可能出错的部分提出了质疑, 我根据自己的理解做了解释。对代码的规范性我提前做了要求,比如变量的命名,函数书写的格式,函数名的规范, 最后大家的代码格式基本一致,很像一个人写的,说明了磨刀不误砍柴工。

这次小组作业让我觉得团队合作的重要性,学会怎么凝聚大家的力量。还有代码开发与软件测试并行, 确保每一个模块没有错误的时候再往下面进行。在写代码的时候,一定要多注释,这样不管自己维护还是别人阅读, 都会减少不少麻烦。

原文地址:https://www.cnblogs.com/liucj-666/p/8747729.html