福大软工1816 · 第二次作业 - 个人项目

Github项目地址:(https://github.com/913680749/personal-project/tree/master/Cplusplus/031602133)

1.PSP 表

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

2. 解题思路

  总的功能大致就是统计单词,字符和行数还要输出最高频的10个。统计的功能可能不会太难实现,但是输出最高频的10个单词和以命令行运行并输入到文件有点小烦。以前都没遇见过,又要去自学新的东西了。上网搜了些资料,加上室友的帮助也总算完成了。计数部分没什么,关键是利用freopen函数进行文件的输入与输出,还有map函数的应用,算是解决了最头疼的问题。

[freopen参考资料] (https://blog.csdn.net/imxiangzi/article/details/45916875)
[map函数参考资料] (https://blog.csdn.net/gududanxing/article/details/11069919)

3.设计实现

>Charconversion()函数用于实现英文的大小写转换
>Countchar()函数用于实现有效字符统计
>Countword()函数用于实现有效单词统计
>Scan()和Print()函数则分别实现文件的输入和输出
>Countmaxword()函数用于实现最大频数词的统计输出

4.性能改进

做出这题来感觉都不容易了,改进的话有余力再说吧,带一张运行结果图

5.部分代码说明


void Wordinsert(string s)                   /*  向字典树里面插入单词  */
{   
	int len = s.size(), flg;
	node *p;
	p = &root;
	rep(i, 0, len)
	{
		flg = Charconversion(s[i]);
		if (p->next[flg] == NULL)
		{
			p->next[flg] = new node(); p->next[flg]->gs = 0;
		}
		p = p->next[flg];
		if (i == len - 1) { p->gs++; }
	}
}

利用字典树不仅可以节约空间还可以大幅度缩短时间复杂度


int Countword()
{
	int tp = 0;
	rep(i, 0, linenum)
	{
		bool f = 1; int lim = line[i].size();
		rep(j, 0, lim)
		{
			if (is_efct_char(line[i][j]))
			{
				string str = ""; str += line[i][j];
				rep(k, j + 1, lim)
				{
					if (is_efct_char(line[i][k]))str += line[i][k], j = k;
					else { j = k;  break; }
				}
				bool f = 0;; int siz = str.size() - 1;
				rep(k, 0, siz) {
					if (str[k] >= '0'&&str[k] <= '9' && (str[k + 1]<'0' || str[k + 1]>'9'))f = 1;
				}
				if (!f)                   /*  对其是否是有效单词进行判断  */
				{                                                           
					tp++;
					Wordinsert(str);                      /* 利用前面的插入函数向字典树中插入单词,字典树不仅可以节约空间还可以大幅度缩短时间复杂度 */ 
				}
			}
		}
	}
	return tp;
}

原本没有引用字典树只用map函数的时候编完以后运行会比较耗费时间,在查阅资料和舍友的提议下借鉴并使用了字典树,勉强算是一个亮点吧。

6.单元测试

7.代码覆盖率

整体看来覆盖率是挺高的,甚是欣慰。

8. 心得体会

 老实说,已经开始后悔没退选了,个人编程基础可以说相当的不咋地,做这一个作业都累了半死,对接下来的日子感到深深的担忧。不过总的来说的话感觉我花的编码时间比较久。而且如果直接一整套代码打下来我应该也不至于用这么久,但是又要封装,又要单元测试啥七的八的都要去学,也花了不少时间。而且之前也没用过github,操作啥的都会比较生疏。
posted @ 2018-09-11 23:21  影子Tq  阅读(171)  评论(1编辑  收藏  举报