软件工程-个人项目

软件工程-个人项目

1.相关

github地址

2·PSP表格

3.解题思路

·需求

既然是软件工程实践,那最重要的就是明确需求。刚开始大致看了二十分钟需求,大致将软件分为三个模块。

·统计字符和行数都不难,要注意的是对空格回车的处理。

·计算单词的问题,重点在单词的判定,因为的题目的要求实在很有意思。

·至于排序和统计的需求,表示是最难的,到现在还没有调好orz。

·学习&回顾

表示现在的泪都是在补前面的债。庆幸有这种机会吧,值得一提的是大致又完整地复习了一边文件读取。

4.设计实现

表示今天软工理论课上老师说得十分有道理,要先设计好来,在开始写代码的时候效率才会高。当初就大致想了想一共三个模块,每个模块大致会有什么函数,然后就一把梭了,结果是浪费了很多时间。吸取教训!

关键函数自然是要画出流程图的了,比如单词判定中的函数,当时想着用正则做,但是没有实现的能力(似乎没有认真去看文档,因为刚好想到了自动机,感谢编译原理)

【假装这里有图片】可惜图画在ipad上,时间已经不允许我来贴图了(稍后更新)

5.改进&分析

作为一个自觉能写得出来就已经庆幸的弱鸡,觉得我自己能改进的应该就是把 cout改进成printf了。

性能分析如下

6.代码说明

用自动机实现单词的识别是个不错的选择,还有一种思路是正则表达式(下次可以试试)。

int is_word(int state, char input, int * count)//通过自动机实现单词筛选
{
	switch (state)
	{
	case Begin:
		if (isspace(input) || (!(input >= '0') && !(input <= '9'))) return Begin;

		if (isalpha(input)) return L2;
		if ((input >= '0'&&input <= '9')) return Wrong;

	case Wrong:

		if (isspace(input) || (!(input >= '0') && !(input <= '9'))) return Begin;
		else return Wrong;

	case L2:
		if ((input >= '0'&&input <= '9')) return Wrong;
		if (isalpha(input)) return L3;
		else return Begin;

	case L3:
		if ((input >= '0'&&input <= '9')) return Wrong;
		if (isalpha(input)) return L4;
		else return Begin;

	case L4:
		if ((input >= '0'&&input <= '9')) return Wrong;
		if (isalpha(input)) return Final;
		else return Begin;

	case Final:
		if (isalnum(input)) return Final;
		else { (*count)++; return Begin; }
	}
	return ERROR;
}

通过参考网上的博客,词频统计可采用哈希表来实现,再加上一个队列就可以排出前十名。【还有部分bug】

7.感想

·开发之前要先设计好框架

·阅读文档的能力很关键

·代码能力急需提高

原文地址:https://www.cnblogs.com/wuji-walden/p/9637890.html