福大软工1816 - 第二次作业

福大软工1816 - 第二次作业

github项目地址:https://github.com/Travaill/personal-project

1.PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划
· Estimate· 估计这个任务需要多少时间600685
Development开发
· Analysis· 需求分析 (包括学习新技术)2020
· Design Spec· 生成设计文档2020
· Design Review· 设计复审55
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)1010
· Design· 具体设计3030
· Coding· 具体编码420480
· Code Review· 代码复审105
· Test· 测试(自我测试,修改代码,提交修改)2030
Reporting报告
· Test Repor· 测试报告6060
· Size Measurement· 计算工作量6020
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划205
合计675685

2.需求分析

输入文件名以命令行参数传入。例如我们在命令行窗口(cmd)中输入:

WordCount.exe input.txt

统计input.txt中的以下几个指标

  • 统计文件的字符数:
    • 只需要统计Ascii码,汉字不需考虑
    • 空格,水平制表符,换行符,均算字符
  • 统计文件的单词总数,单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
    • 英文字母: A-Z,a-z
    • 字母数字符号:A-Z, a-z,0-9
    • 分割符:空格,非字母数字符号
    • 例:file123是一个单词, 123file不是一个单词。file,File和FILE是同一个单词
  • 统计文件的有效行数:任何包含非空白字符的行,都需要统计。
  • 统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词。
  • 按照字典序输出到文件result.txt:例如,windows95,windows98和windows2000同时出现时,则先输出windows2000
    • 输出的单词统一为小写格式
  • 输出的格式为
characters: number
words: number
lines: number
<word1>: number
<word2>: number
...

3.计算模块接口的设计与实现过程

代码主要模块

  • 预处理模块:将一份txt文件里面的非法字符等全部转换为空格
  • 字符统计模块:统计文件中出现的字符
  • 行数统计模块:统计文件中的行数综合
  • 单词统计模块:统计文件中的单词出现次数并输出频率前十的单词,频率相同按照字典序输出

程序流程图

1093854-20180913122949475-1354680627.jpg

关键函数展示

在判断合法单词的时候利用了正则表达式

vector<pair<string, int>> CountWord() //调用这个函数把文字传进来。
{
    ifstream in("temp.txt");
    ostringstream tmp;
    tmp << in.rdbuf();
    string str = tmp.str();
    map<string, int> result;
    regex repPattern("[a-zA-Z]{4,}[a-z0-9A-Z]*");
    // 声明匹配结果变量
    match_results<string::const_iterator> rerResult;
    // 定义待匹配的字符串
    string strValue = str;
    while (regex_search(strValue, rerResult, repPattern))
    {
        result[rerResult[0]]++;
        strValue = rerResult.suffix().str();
    }
    vector<pair<string, int>> resultvec(result.begin(), result.end());
    sort(resultvec.begin(), resultvec.end(), CmpByValue());
    return resultvec;
}

4.计算模块接口部分的性能改进

1093854-20180913130443162-1291746786.png

5.计算模块部分单元测试展示

还在学习中......

6.计算模块部分异常处理说明

  • 当要输入的文件名不存在时

     FILE *fp;
        fp = fopen(filename,"rt"); 
        if(fp==NULL)
        {
          printf("文件名或文件地址输入错误\n");
        }

7.心得体会

太久没打C语言了,代码的实现过程变成异常痛苦,花了太多的时间在实现代码上,然后做封装等等,但是目前的代码规范让自己还不是很满意,例如变量名注释返回值等还有很多可以改进的地方,特别是异常处理,由于直接开始实现代码,没有提前想到这个部分,所以后续添加异常处理的时候就变得特别困难。

转载于:https://www.cnblogs.com/linshen/p/9637797.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值