软件工程个人项目--Word frequency program

(一)工程设计时间预计

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
++对文件的操作有了更深的了解。 总之通过这一次练习,巩固了很多之前学过的知识,也学到了一些新的知识,希望能够在今后的课程中学到更多新的知识。

 

转载于:https://www.cnblogs.com/hjk-buaa/p/3327771.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值