(一)工程设计时间预计
1.代码编写:1小时30分钟
(1)文件夹的遍历以及筛选;
(2)文件夹的读取,以及对读取字符的操作。
(3)所得结果排序,以及文件输出。
2.程序调试:1小时
(1)编写数据。
(2)测试以及调试。
3.程序优化:1小时;
程序优化主要通过以下几个方面: (1)排序的优化; (2)存储数据的优化:通过开更大的空间以换取时间上的优化; (3)查找算法的优化;
预计总时间:3小时30分钟
(二)工程所用实际时间
1.代码编写:2小时30分钟
(1)文件夹的遍历以及筛选:1小时30分钟;
(2)文件夹的读取,以及对读取字符的操作:1小时;
(3)所得结果排序,以及文件输出:30分钟;
2.程序调试:1小时
(1)编写数据:15分钟;
(2)测试以及调试:45分钟;
3.程序优化:1小时;
程序优化主要通过以下几个方面: (1)排序的优化; (2)存储数据的优化:通过开更大的空间以换取时间上的优化; (3)查找算法的优化;
实际所用总时间:4小时30分钟。
(三)关于实际时间比预计时间长的分析
在这一次的程序编写过程中,代码编写实际所用时间比预计时间多了1个小时,这一个小时主要多在文件夹的遍历以及筛选这一部分上,
由于平时c++用的比较少,所以对于c++的文件操作不太了解,在文件夹的遍历以及筛选这一部分上遇到了很大的问题,
通过查阅《c++prime》,在网上搜索相关答案,以及请教同学顺利的解决了这个问题,虽然在这一部分比预计多花了很多时间,
但是通过这一过程,让我对c++对文件的操作有了更深的了解。
(四)程序优化
1.代码优化分析
通过分析,代码主要分为两部分进行优化: (1)记录一个单词,与之前所记录的单词进行比较,这一部分的优化是整个程序性能提升的最重要部分。 (2)记录完所有单词之后,进行排序,排序算法可以进行优化。
2.可优化部分代码:
(1)单词查找部分代码
1 if (y6==1) //为拓展 2 { 3 while ((y2<m) && (x3==0)) //x3标志是否已经匹配 4 { 5 if (a[y2]==a[m]) 6 { 7 x4=0; 8 for (y3=0;y3<=a[m];y3++) //不区分大小写比较 9 { 10 ch1=hjk[m][y3];ch2=hjk[y2][y3]; 11 if (hjk[m][y3]<=90) ch1=hjk[m][y3]+32; 12 if (hjk[y2][y3]<=90) ch2=hjk[y2][y3]+32; 13 if (ch1!=ch2) x4=1; 14 } 15 16 if (x4==0) //找到匹配 17 { 18 x3=1; 19 if (hjk[m]<hjk[y2]) {hjk[y2]=hjk[m];b[y2]=b[y2]+1;} 20 else {b[y2]=b[y2]+1;} 21 m--; 22 } 23 } 24 y2++; 25 } 26 } 27 else //不是拓展 28 { 29 len1=hjk[m].length (); 30 while ((y2<m) && (x3==0)) 31 { 32 len2=hjk[y2].length(); 33 if (len1==len2){ 34 x4=0; 35 for (y3=0;y3<len1;y3++) //不区分大小写比较 36 { 37 ch1=hjk[m][y3];ch2=hjk[y2][y3]; 38 if (hjk[m][y3]<=90) ch1=hjk[m][y3]+32; 39 if (hjk[y2][y3]<=90) ch2=hjk[y2][y3]+32; 40 if (ch1!=ch2) x4=1; 41 } 42 if (x4==0) //找到匹配 43 { 44 x3=1; 45 if (hjk[m]<hjk[y2]) {hjk[y2]=hjk[m];b[y2]=b[y2]+1;} 46 else {b[y2]=b[y2]+1;} 47 m--; 48 } 49 } 50 y2++; 51 }
(2)排序代码
1 for (i=1;i<=m-1;i++) 2 for (j=i+1;j<=m;j++) 3 if (b[i]<b[j]) 4 { 5 xy=b[i]; 6 b[i]=b[j]; 7 b[j]=xy; 8 sw=hjk[i]; 9 hjk[i]=hjk[j]; 10 hjk[j]=sw; 11 } 12 else 13 { 14 if (b[i]==b[j]) 15 { 16 if (hjk[i]>hjk[j]) 17 { 18 xy=b[i]; 19 b[i]=b[j]; 20 b[j]=xy; 21 sw=hjk[i]; 22 hjk[i]=hjk[j]; 23 hjk[j]=sw; 24 } 25 } 26 }
3.优化方法
将记录单词的方式变为有序的记录,这样查找时可以根据当前单词的ASCII码值进行快速的查找,而不必从头到尾逐一查找,
并且由于是有序的存储,在之后的排序过程中省去了字典序的排序,只需要将频率高的单词移动至输出的前端即可。
4.优化前后性能对比
(1)所使用的测试用例:
(2)优化前分析报告
(3)优化后分析报告
(4)优化分析
可以看到,同用一个测试用例,优化前后效率有较大的差距,优化前需要22秒左右,优化后只需要10秒,同时可以认定越大的测试用例优化效果越明显。
(五)所使用的测试用例
(1)测试空文件夹
(2)测试有相同单词的文件
(3)测试有文件中包含文件的文件
(4)测试有不符合后缀的文件
(5)测试-e中数字不同,单词相同的文件
(6)测试-e中大小写不同的文件
(7)测试字母+数字+字母+数字的文件
(8)大规模数据监测 (9)大规模数据监测 (10)大规模数据监测
(六)收获与感想
在这次软件工程作业中,回顾了很多c++的相关知识,尤其是c++的字符串操作和文件操作,在文件夹的遍历以及筛选这一
部分上遇到了很大的问题,通过查阅《c++prime》,在网上搜索相关答案,以及请教同学顺利的解决了这个问题,虽然在这一
部分比预计多花了很多时间,但是通过这一过程,让我对c++对文件的操作有了更深的了解。 总之通过这一次练习,巩固了很多之前学过的知识,也学到了一些新的知识,希望能够在今后的课程中学到更多新的知识。