1.GitHub地址

      https://github.com/noblegongzi/WordCount

2.PSP表格

PSP2.1 PSP 阶段 预估耗时 (分钟) 实际耗时 (分钟)
Planning 计划 30 50
· Estimate · 估计这个任务需要多少时间 600 840
Development 开发 600 840
· Analysis · 需求分析 30 40
· Design Spec · 生成设计文档 20 30
· Design Review · 设计复审 10 20
· Coding Standard · 代码规范 300 360
· Design · 具体设计 20 90
· Coding · 具体编码 300 720
· Code Review · 代码复审 60 120
· Test · 测试 20 30
Reporting 报告 30 60
· Test Report · 测试报告 20 20
· Size Measurement · 计算工作量 5 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 10 10
  合计 600 840

3.解题思路

  这个项目需要解决的是几大问题,第一是对文档的操作,我在学习编码对这一块没有上心,所以拿到任务后先自己复习了下C++对文档的操作方法。其次是该问题最重要的部分,即如何将一连串字符串分解成单个单词,并对其计数,这个通过if语句对字符串中的字符进行甄别,看是否是特殊的几个分词符就行了。但是我听同学说可以用正则表达式,代码书写更简单,有机会我会改进。  

  还有个最难的问题是我在谋划之初没有想到的,就是对输入的命令进行分析,首先要判断输入的命令是否正确,因为有了前面把字符串分成一个一个单词的经验,所以这里我是采取依次甄别每个单词的方法,用编译原理所学的自顶向下的分析方法来判断命令的正确性,顺便得到命令的结果组成,从而轻易判断用户输入的文件名是什么。在确定命令正确之后,进而分析命令的要求。由于确定了命令的正确性,这里对命令的分析就简单些,只要找到命令的关键字眼,就可以判定命令的意图,从而执行相关的操作。这里使用C++中String类的find()函数,查找诸如-c,-w,-l,-o等关键词汇。

4.程序实现过程

  首先我先完成对文档的输入输出,通过编译程序写好file.c文件,做好实现程序的准备工作。

  其次,我实现了程序的基本功能,即对现有的file.c文件进行字符单词行数计数。

  再则,我实现对命令的正确性判断,确保程序的正常运行。

  然后,我对命令的内容进行分析,从而根据各项命令完善程序功能,使前后台对接。

  最后是对程序输出的排版进行规范,及代码复审。

5.关键代码展示

1)对命令行进行分析确保命令正确,并识别出用户提供的文件名。

 

 

if (order1.find("wc.exe")!=string::npos)
        {
            if (order2.find("-c") != string::npos || order2.find("-w") != string::npos || order2.find("-l") != string::npos )
                if (order3.find("-c") != string::npos || order3.find("-w") != string::npos || order3.find("-l") != string::npos )
                    if (order4.find("-c") != string::npos || order4.find("-w") != string::npos || order4.find("-l") != string::npos)
                    {
                        filename = order5;
                        if (order6.find("-o") != string::npos)
                            outputfilename = order7;
                    }
                    else 
                    { 
                        filename = order4; 
                        if (order5.find("-o") != string::npos)
                            outputfilename = order6;
                    }
                else
                {
                    filename = order3;
                    if (order4.find("-o") != string::npos)
                        outputfilename = order5;
                }
            else
            {
                cout << "命令错误,请重新输入:\n";
            }
        }
        else
        {
            cout << "命令错误,请重新输入:\n";
        }//确定命令输入无误。

 

 

2)对用户提供的文件进行统计,得到关键数据

fin.open(filename);
        cout << "文件中内容如下:"<<endl;
        while (fin.get(ch))
        {
            cout << ch;
            charnumber++;
            if (ch == ' ' || ch == ',' || ch == '\n' || ch == '\t'&&prech != 32 && prech != ','&&prech != '\n'&&prech != '\t')
            {
                wordnumber++;
            }
            if (ch == '\n')
            {
                linenumber++;
            }
            prech = ch;
        }
        cout << endl;
        if (charnumber == 0)
        {
            wordnumber = 0;
            linenumber = 0;
        }
            //统计字符数,单词数,行数。


        if (ch != ' ' || ch != ',' || ch != '\n' || ch != '\t')
        {
            wordnumber++;
        }
        fin.close();

 


3)对命令进行分析,确定程序具体实行哪些操作

 

if (order.find("-c") != string::npos)
        {
                coutchar(filename, charnumber);
        }
        if (order.find("-w") != string::npos)
        {
                coutword(filename, wordnumber);
        }
        if (order.find("-l") != string::npos)
        {
                coutline(filename, linenumber);
        }
        fin.open("result.txt");
        while (fin.get(ch))
        {
                cout << ch;
        }
            fin.close();
        if(order.find("-o") != string::npos)
        {
            output(outputfilename, charnumber, wordnumber, linenumber);
        }
        //执行命令

 

 

 

6.测试设计过程

测试用例:将所有可能的命令格式输入,分别测试。修改file.c文件内容再次进行测试。

程序高风险:输入文件名过长会导致string超出范围,程序崩溃。

7.参考文献

《C++ Primer Plus》。

 

版权声明:本文为zhushiyuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhushiyuan/p/WordCount.html