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

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

  • 相关阅读:
    Caused by: java.util.MissingResourceException: Can't find bundle for base name javax.servlet.LocalStrings, locale zh_CN
    java调优
    idea的spring配置
    【从0到1学Web前端】javascript中的ajax对象(一) 分类: JavaScript 2015-06-24 10:18 754人阅读 评论(1) 收藏
    javascript中对条件判断语句的优化 分类: JavaScript 2015-06-07 09:54 832人阅读 评论(2) 收藏
    【从0到1学Web前端】CSS伪类和伪元素 分类: HTML+CSS 2015-06-02 22:29 1065人阅读 评论(0) 收藏
    django中url,静态文件,POST请求的配置 分类: Python 2015-06-01 17:00 789人阅读 评论(0) 收藏
    【从0到1学Web前端】CSS定位问题三(相对定位,绝对定位) 分类: HTML+CSS 2015-05-29 23:01 842人阅读 评论(0) 收藏
    Javascript图片预加载详解 分类: JavaScript HTML+CSS 2015-05-29 11:01 768人阅读 评论(0) 收藏
    【从0到1学Web前端】CSS定位问题二(float和display的使用) 分类: HTML+CSS 2015-05-28 22:03 812人阅读 评论(1) 收藏
  • 原文地址:https://www.cnblogs.com/liucj-666/p/8747729.html
Copyright © 2011-2022 走看看