zoukankan      html  css  js  c++  java
  • 软件工程个人项目--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
    ++对文件的操作有了更深的了解。 总之通过这一次练习,巩固了很多之前学过的知识,也学到了一些新的知识,希望能够在今后的课程中学到更多新的知识。
  • 相关阅读:
    SQL多表查询:内连接、外连接(左连接、右连接)、全连接、交叉连接
    PL/SQL Developer基本用法
    Oracle中存储过程与函数的区别
    C#反射动态调用dll中的方法
    WebClient模拟发送Post请求
    C#字符串、字节数组和内存流间的相互转换
    C#调用WebService
    VS2008安装SP1补丁后智能提示从中文变为英文的解决办法
    C#流总结(文件流、内存流、网络流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter)
    VS2008创建单元测试
  • 原文地址:https://www.cnblogs.com/hjk-buaa/p/3327771.html
Copyright © 2011-2022 走看看