软件工程-个人项目
1.相关
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.感想
·开发之前要先设计好框架
·阅读文档的能力很关键
·代码能力急需提高