• 福大软工1816 · 第二次作业


    github的地址

    [https://github.com/Cai-WB/personal-project/tree/master/Cplusplus/031602301/src/Project1]

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

    解题思路描述

    拿到这个题目,第一个感觉就是what???怎么看不懂啊,但是静下心来慢慢的分析题目的要求,发现小要求真多。对于第一个要求,统计字符的个数,采取读行的方法,每次读取一行(相当于段落数,这时题目要求我们求取的文件段落数也一并解觉了),统计该行的字符数,然后重复该步骤直至读完文件。对于第二个要求,统计单词的个数,采用正则表达式的思想,匹配到合适的字符串,统计合适的字符串的个数,把这些字符串放到集合里面。然后遍历集合,找出频率最高的十个字符串,然后输出。

    设计实现过程

    在设计代码的过程中,我设计了两个类,一个是File类用来实现文件的一些相关读写操作,里面构造了若干个函数,比如文件的输入或者输出,另一个countWord类用来实现单词的分类和判断,依据正则表达式的思想设计算法,分割单词,将其放入集合中,统计出现的次数

    性能分析


    代码分析

    该函数是整个代码的核心段,主要用来实现对单词的判断,分割,统计。

    void File::Wordscount(string filename)
    {
    	ifstream cinfile(filename, ios::in | ios::_Nocreate);
    	smatch m;
    	string s, s1;
    	regex danci("[a-zA-Z]{4}[0-9a-zA-Z]*");
    	while (getline(cinfile, s))
    	{
    		while (regex_search(s, m, danci))
    		{
    			s1 = m.str();
    			transform(s1.begin(), s1.end(), s1.begin(), tolower);
    			words.push_back(s1);
    			wordscount++;
    			s = m.suffix().str();
    		}
    	}
    	cinfile.close();
    	List::iterator i, j;
    	if (!words.empty())
    	{
    		words.sort();
    		string s;
    		int temp;
    		for (i = words.begin(); i != words.end(); ++i)
    		{
    			countWord *w = new countWord;
    			s = *i;
    			w->name = s;
    			temp= 1;
    			for (j = ++i; j != words.end(); ++j)
    			{
    				if (s == *j)
    					temp ++;
    				else
    					break;
    			}
    			w->count = temp;
    			i = --j;
    			words_count.push_back(*w);
    		}
    		words.unique();
    	}
    }
    

    还有一些函数是文件的输入输出,在这里不做具体的展示。

    代码覆盖率

    如图所示

    之所以有这样的代码覆盖率,可能是因为文件的输入输出错误或者文件中没有重复的单词

    心得体会

    在用c++写之前,我先是尝试用java写的,主要是考虑到java中有一个map集合,可以很好的适应这个题目,但是到最后运行的时候结果老是出错,在分割单词的时候出现了问题(可能我学艺不精),能正常实现的功能是读出文档的字符数,段落数。后来随着截止时间的迫近,才采用c++来写的,(但是那个java的代码我是不会放弃的,不写完整有点不甘心,助教学姐有没有帮忙看代码的功能啊)。但是C++的过程也是不容易的,课堂上我们学习的时候并没有学的这么深,像正则表达式,文件的输入输出,都是临时才学的,慢慢的理解。经过这一次的作业,发现自己还要学的还要很多很多,构建之法这本书刚到手不久,只看了一点点,以前就老是觉得代码很重要,但其实对于一道题目,前期的思考和后期的测试,debug所要花费的时间更多,如何提高代码的性能也是值得考虑的,不单单只是能出结果就可以。通过这次的作业,发现自己身上的很多不足,以后还是要好好的努力的,争取提高。

  • 相关阅读:
    Linux下的lds链接脚本简介
    Fedora下载地址
    SkyEye的使用
    shell变量详解
    Linux shell 脚本攻略之正则表达式入门
    Linux shell 脚本攻略之统计文件的行数、单词数和字符数
    Linux shell 脚本攻略之创建不可修改文件
    Linux shell 脚本攻略之生成任意大小的文件
    Linux shell 脚本攻略之批量重命名
    Linux shell 脚本攻略之文件查找与文件列表
  • 原文地址:https://www.cnblogs.com/caiwb/p/9631849.html
Copyright © 2020-2023  润新知