在奋斗了24+小时之后,终于完成了软件工程第一次项目。中间有很多曲折,也收获了很多经验。
预计完成时间:复习C++(一小时);构思(半小时);编码(四小时);调试(二小时);其他(半小时)。合计(八小时)。
实际完成时间:复习C++(两小时);构思(半小时);编码(三小时);调试(五小时+);优化(三小时)。合计(十三小时+)。
首先是审题方面。
这个要求里面最需要注意的有三点:
1、单词的构成,前三个必须是字母,后面可以接任意多的字母或数字,其他字符均视为分隔符。
2、忽略大小写
3、123file里的file不能算为一个单词,所以在用正则表达式的时候需要特别注意。
其次是软件的初步构思。
这里我思考了如下几点
1、首先是语言的选择,C++和C#。这两种语言我都没有系统的用过,暑假的时候自学过C#,上学期也阅读过《C++编程思想》,但最终还是选择了与C语言相近的C++。
2、其次是面向过程还是面向对象。这个程序有三个部分,但三个部分不会同时运行,而是根据命令行参数输入的不同来决定运行哪一个部分。所以我选择了面向对象的程序设计。将程序的三个部分分别写入三个类,根据命令行输入的不同来new相应的对象。这样设计程序相对条理清晰,也减少了出错的几率。
注:这三个部分其实有很多功能是一样的,可以考虑将类划分开来,合并相同的部分,减少代码重复,减轻编码工作量。(不过我还没这样做,实在是没精力修改了)
3、再者是文件的扫描。之前使用java语言的时候,有文件类可以直接用,相当方便。但是当我开始写程序的时候发现c++并没有这样的类,所以经过各种百度和询问同学,使用了_finddata_t这个强大的结构体。(虽然我还没完全弄明白这个结构体的功能)这样一来就可以递归文件目录进行文件扫描。
4、然后是单词读入。大致分为两种方法,一种是逐个字符读入,另一种是读入全部字符然后进行分析。我个人倾向于后者,因为这样批量处理效率高,代码简洁。
5、最后是结果存储的数据结构。一种是线性表,一种是二叉树。但程序涉及查找有无相同元素,所以二叉树会节省很多时间。
下面是程序测试结果,我先测试了vs的安装目录。
性能分析如下:
由于我没有使用哈希表,所以程序效率并不太高,但也还能接受。
编码过程中遇到的问题:
1、初始化的问题,任何对象在使用之前最好初始化,避免程序崩溃。
2、建立二叉树的问题。这个问题我不止一次犯过。(应该好好反思)就是递归建立的时候,新建立的节点没有接到树根上。所以导致程序崩溃。
3、关于程序效率的问题。最开始我用的vector来存的数据,在测试数据量较大时,耗时明显过长。后来改为用二叉树存储,效率明显提升。
学到了什么:
1、编程之前对程序应有整体的构想。
2、应养成良好的编程习惯,降低代码出错率。
3、应在数据结构和算法上对程序进行优化。