zoukankan      html  css  js  c++  java
  • 软件工程第一次个人项目——词频统计by11061153柴泽华

    一.预计工程设计时间

       明确要求: 15min;

           查阅资料: 1h;

           学习C++基础知识与特性: 4-5h;

           主函数编写及输入输出部分: 0.5h;

           文件的遍历: 1h;

           编写两种模式的词频统计函数: 1.5h;

           单词排序部分: 0.5h;

           程序调试与测试: 1-2h; 

           程序优化:2h;

           预计总共时间:12-13h;

    二.实际工程完成时间

           明确要求: 15min;

           查阅资料: 1.5h;

           学习C++基础知识与特性: 7h;

           主函数编写及输入输出部分: 0.5h;

           文件的遍历: 0.5h;

           编写两种模式的词频统计函数: 1h;

           单词排序部分: 1h;

           程序调试与测试: 2h; 

           程序优化:3h;

           实际总共完成时间:17h

    三.程序优化

           由于是第一次使用vs2012,因此对它的操作还没有很熟悉。刚开始分析程序采样时,总是显示数据无法采样,后来上网查询原因后,的只是由于自己的测试用例太小了,因此找同学借了一个大小为10M左右的英文小说文件夹来测试。

           文件夹截图如下所示:

          

           性能分析报告:无任何警告或错误

          

          

           总体上来说,程序的时间效率还是有些低,希望这次作业后能和老师和同学们讨论关于这道题时间复杂度最低的算法,互相促进,共同进步。

       

      

        通过以上两张图,我们可以发现main函数的主要耗时是花费在WordCounter函数上了,占到了99.8%,而WordCounter函数中的绝大多数时间则是花费在了operator>>上,即大量的字符操作处理上。因此下一步的优化重点可以放在简化字符操作处理上面,现在暂时还没有想到更好的方法。

        这次排序中用到的是<algorithm.h>下的sort函数,只要定义好了其中的比较规则cmp函数,就可以按照自己的意愿排序wordmap中的单词。存储单词及其个数时用到的是map关联容器,这种C++特有的数据结构大大的简化了插入操作,更新操作的实现,也使后续的排序工作方便了许多。

        文件的遍历输入采用的方法是使用system函数输入命令行,这样就可以递归地得到某目录下的所有需要的文件。该命令行为

                  

    dir filepath*.txt filepath*.cs filepath*.cpp filepath*.h /b /s


        其中filepath指代的是命令行中输入的目录。(切记一定要以\结尾)

        文件的输出则是使用的pair变量迭代器挨个取map中的元素进行打印。

    四.测试用例

        1.空文件夹进行边界测试

        2.大容量文件夹,进行压力测试

        3.多层文件夹嵌套测试

        4.文件中存在特殊字符测试

        5.简单模式下对形如File,file等字符串的个数统计与大小比较

        6.复杂模式下所要求的比较,例如windows7,windows8,windows

        7.空文件进行边界测试

        8.支持读文件类型后缀名测试

        9.字典序测试

        10.不合法单词是否被统计测试

    五.感悟与收获

        这次词频统计程序作业是我第一次接触C++编程,还好有过C和Java的程序设计经验,因此学习的时候只是看了一下C++特有的数据结构和语法,然后就可以开始编程了。

        这次作业带给我的最大感悟就是不要把计划想得太理想。因为在现实实现的过程中,你可能会遇到各种意想不到的突发情况,因此你在事先计划的时候,一定要留出一定的余量并且做好良好的心理准备。这次作业时写代码其实并不是最耗费时间的一项工作,最耗费时间的反而是完成代码后的debug和代码优化。我想这也正是软件工程课的目的,它并不是一门普通的程序设计课或算法课,他要教给我们的是编写软件所要经过的所有必备流程以及必备方法。只有了解了这些流程和方法,才能将我们编写的普通小程序升级为软件。

       还有一点,就是要常常吸取别人好的想法。比如编写这次作业时,文件的遍历处理过程当然可以使用深度优先搜索或广度优先搜索来完成,但是,如果你使用一行命令行代码的话,你会发现这将大大减小你的编码难度以及减少你程序的运行时间。这种好想法可能你永远也不会想到,因此多多倾听别人的想法,必然是有着大大的益处。

       

  • 相关阅读:
    数组——遍历
    数组常用方法——汇总
    箭头函数
    overflow:auto产生的滚动条在安卓系统下能平滑滚动,而在ios下滚动不平滑
    浅谈过载保护
    tornado中使用torndb,连接数过高的问题
    如何开启并查看博客园MetaWeblog接口的xml-RPC协议访问地址
    aardio陷阱(转)
    aardio获取公网IP地址代码
    sql常用函数学习笔记整理
  • 原文地址:https://www.cnblogs.com/Colin-Chai/p/software_engineering_homework1.html
Copyright © 2011-2022 走看看