zoukankan      html  css  js  c++  java
  • WordCount

    github链接:https://github.com/DM-Levey/WordCount

    项目需求:http://www.cnblogs.com/ningjing-zhiyuan/p/8563562.html

    一、项目简介:

      这门课的课程叫做软件质量与测试,或者像老师说的叫软件测试与质量,很明显这门课的目的是希望我们提高软件的质量,我同意老师说的,不编程,怎么知道自己的编码可能有多少不良习惯?毕竟重点不在代码,所以我觉得编码阶段5个小时不能再多了,但就像之前说的,如果这门课的重点是测试,那么更多的时间应该用来测试,那么大概再花5个小时测试?不过抱歉,我也有我的事情要干,实在不想拿出10个小时,根据这个作业的性质,我不得不头重脚轻了。于是制定了如下的PSP表格:

    PSP2.1

    PSP阶段

    预估耗时

    (分钟)

    实际耗时

    (分钟)

    Planning

    计划

    10  5

    · Estimate

    · 估计这个任务需要多少时间

    10  5

    Development

    开发

    325  645

    · Analysis

    · 需求分析 (包括学习新技术)

     15  35

    · Design Spec

    · 生成设计文档

     60  20

    · Design Review

    · 设计复审 (和同事审核设计文档)

     20  20

    · Coding Standard

    · 代码规范 (为目前的开发制定合适的规范)

     20  20

    · Design

    · 具体设计

     60  120

    · Coding

    · 具体编码

     60  200

    · Code Review

    · 代码复审

     30  30

    · Test

    · 测试(自我测试,修改代码,提交修改)

    60  200

    Reporting

    报告

     50  40

    · Test Report

    · 测试报告

     10  20

    · Size Measurement

    · 计算工作量

     10  10

    · Postmortem & Process Improvement Plan

    · 事后总结, 并提出过程改进计划

     30  10
     

    合计

     385  690

    二、大体思路

      首先看到这个项目,我觉得最陌生的一点是用cmd里面的参数来控制文件的操作,像-o -w这些,以前我只是在window自带的shutdown 里面用过这种命令,但写这种命令确实是第一次,这就是我要首先研究清楚的,之后我在百度中找到了关于main函数中参数argc和argv 的使用方法:

    argc:命令行总的参数的个数,即argv中元素的格式。
    *argv[ ]:字符串数组,用来存放指向你的字符串参数的指针数组,每一个元素指向一个参数。
    argv[0]:指向程序的全路径名。
    argv[1]:指向在DOS命令行中执行程序名后的第一个字符串。
    argv[2]:指向第二个字符串
    然后就可以尝试着看一下具体是什么样的情况:

    这样就可以通过argv[i]来读取他的命令,结尾是.c的文件则是要读的文件,.txt的文件就是写出的文件。
      大致处理了命令行的问题之后就开始看主要算法,基本功能很简单,只是计数而已,因为我们之前C语言学过这个,最基本的就是数分割符的个数,但这样会出现的问题是
    我只要中间多输入几个分隔符,那他就会错乱,这个问题也很好处理,只要从外面进入一个单词里面,就单词数+1,之前还在考虑比如adj@@!这种东西不算单词,是不是遇到
    除字母以外的符号我应该把这个从单词数里去掉,但后来发现需求上表示这个也算是单词,那就好办多了,就用正常的计数方法计算就结束了,基本功能到此结束。我用了一
    个结构体来表示他需要计数的变量:
    typedef struct BasicInfo
    {
        int nc;            //字符数
        int nw;            //单词数
        int nl;            //行数
        int codeline;    //代码行
        int spaceline;    //空行
        int commentline;//注释行
    }
    
    
    
    


    具体的数单词字符行数的函数参考了机械工业出版社的C程序设计语言中的CWL函数:

     



      接下来要处理代码行空行和注释行根据/*级各种符号
    for(i = 0; (c = *buf++) != ''&&c>=-1&&c<=255; )
        {
            ++info->nc;
    
            if('
    ' == c)
                ++info->nl;
    
            if (' ' == c || '
    ' == c || '	' == c || ',' == c || ';' == c || ')' == c || '(' == c || '{' == c || '}' == c)
            {
                state = OUT;
                tmp[i] = '';
                compare(word_list, tmp);
                i = 0;
            }
    
            if(isalpha(c) && OUT == state)
            {
                state = IN;
                info->nw+=1;
            }
    
        }
        /*最后一行没有'
    '*/
        ++info->nl;
    
    
    
    
    这些不同的组合,列出一些状态

    并且用strtok函数将源文件根据 来分成不同的字符数组,然后一行行处理就能得到结果。但最后测试出来是错误的结果,后来经过百度发现strtok这个函数在处理两个连续的‘ ’的时候会直接跳过检测,
    导致空行减少的情况,因此需要在判断一下是否用有两个连续的‘ ’如果出现一次则额外的空行+1,等全部处理完之后再把额外的空行加上去
    -s的功能确实一开始不知道怎么处理,但是后来发现*.c这个名称在CMD中能直接解析出来,所以这个功能也算完成了。

    三、代码分析
    int space_state = FALSE;
        while((c = *p1++) != '')
        {
            if('
    ' == c && !extra_state)
            {
                extra_state =TRUE;
                continue;
            }
    
            if('
    ' == c && extra_state)
            {
                extra_space ++;
            }
            if(c != '
    ')
                extra_state = FALSE;
        }
    
    
    
    
     在判断额外的空行的时候也使用了有限状态机,和判断注释行的时候一样,不过注释行情况太多,而且时间关系我没有去优化他们的结构,只是把一个个条件堆起来,所以在这里,就拿这个举例子,一开始
    默认没有到extra的情况,当遇到一个换行符的时候就进入第二种状态,即extra_state为真时,如果直接遇到第二个换行符,额外的空行就会再加1,当他遇到不是换行符的字符时,extra_state回到最初
    的状态。


    四、测试用例
      在这个模块里,根据统计单词数和停用词表,行数和特殊行的关系,是否搜索,是否输出 做出了以下10个测试用例
    start wc.exe wc.exe -w test0.c -o output0.txt
    
    start wc.exe wc.exe -l test0.c -o output1.txt
    
    start wc.exe wc.exe -l -a test0.c -o output2.txt
    
    start wc.exe wc.exe -c test0.c -o output3.txt
    
    start wc.exe wc.exe -w -c test0.c -o output4.txt
    
    start wc.exe wc.exe -w -c -l test0.c -o output5.txt
    
    start wc.exe wc.exe -w -c -l -a test0.c -o output6.txt
    
    start wc.exe wc.exe -s -w -o -c -l -a *.c -o output7.txt
    
    start wc.exe wc.exe -w -c -l -a test0.c  -e stop.txt 
    
    start wc.exe wc.exe -w test0.c -e stop.txt 
    
    
    

    这是测试脚本中的用例,只要打开测试脚本的批处理程序就会执行者10条代码。

    这里放出output7.txt 的结果

    五、总结

      这次的作业让我更加深入的了解了cmd和函数之间的关系,但是花的时间太长了,给的时间又太短了,所以很多细节都没有处理好。































  • 相关阅读:
    DevOps
    DevOps
    微信的NATIVE支付提示201商户订单号重复的解决方案
    phpstorm 破解
    Git忽略已经被版本控制的文件(添加.gitignore不会起作用)
    微信 {"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
    如何用AJax提交name[]数组?
    基于PHP给大家讲解防刷票的一些技巧
    为何GET只发一次TCP连接,POST发两次TCP连接
    IP地址在mysql的存储(IP地址和int的转换)
  • 原文地址:https://www.cnblogs.com/DM-Levey/p/8605876.html
Copyright © 2011-2022 走看看