zoukankan      html  css  js  c++  java
  • 福大软工1816

    福大软工1816 - 第二次作业

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

    1.PSP表格

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

    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文件里面的非法字符等全部转换为空格
    • 字符统计模块:统计文件中出现的字符
    • 行数统计模块:统计文件中的行数综合
    • 单词统计模块:统计文件中的单词出现次数并输出频率前十的单词,频率相同按照字典序输出

    程序流程图

    关键函数展示

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

    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.计算模块接口部分的性能改进

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

    还在学习中......

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

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

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

    7.心得体会

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

  • 相关阅读:
    刚开始用springboot踩的好多坑!!!
    AngularJS学习(一)
    linux上的第一个c语言程序
    设计模式——6大设计原则
    C# List的深复制
    C# XML 操作
    C#多线程学习
    实现树形结构
    观察者模式
    python3.3 MD5
  • 原文地址:https://www.cnblogs.com/linshen/p/9637797.html
Copyright © 2011-2022 走看看