第四周小组作业

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可以将整个文件一次性读取出来,程序整体的运行时间减少了几秒钟。

总结

在这一次的小组作业中,我认识到了自己编写代码时存在的很多不规范的问题,我们的组长也给我指出了很多问题,比如说只用过一次的数据就不要再设置变量进行赋值了,不仅浪费空间,代码看起来也会更加繁琐。而这些静态测试工具也能够很好地帮助我们规范代码,这让我意识到了测试在编程中的重要性。

以上是关于第四周小组作业的主要内容,如果未能解决你的问题,请参考以下文章

第四周小组作业-wordcountpro

第四周小组作业

wordcount第四周小组作业

第四周小组作业

第四周小组作业

第四周WordCount小组作业