一.预计工程设计时间

  明确要求: 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和代码优化。我想这也正是软件工程课的目的,它并不是一门普通的程序设计课或算法课,他要教给我们的是编写软件所要经过的所有必备流程以及必备方法。只有了解了这些流程和方法,才能将我们编写的普通小程序升级为软件。

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

最新文章

  1. javascript基础04
  2. NGUI Table页(UIToggle和UIToggledObjects)
  3. SRM 615 DIV1 500
  4. tapping of data 词义来源
  5. Hadoop 2.6 MapReduce运行原理详解
  6. Java语言基本语法
  7. SQL2008R2日志传送需要注意点
  8. VisualStudio2015内置LocalDB
  9. jquery获取value值
  10. Qualified name lookup
  11. Page的生命周期及相关事件苛
  12. c++ inheritance -- 继承
  13. Even Tree 小议
  14. 对于group by 和 order by 并用 的分析
  15. mysql的执行过程
  16. centos 7创建ss服务(方式二)
  17. 实现两个矩阵相乘的C语言程序
  18. Liunx-常用命令杂烩(5)
  19. 执行 crontab 的计划任务
  20. linux 命令使用方法(随时更新)

热门文章

  1. python - PipeMapRed.waitOutputThreads(): subprocess failed with code 1
  2. [转载]浅析Java中的final关键字
  3. hive环境的搭建
  4. 好!recover-binary-search-tree(难)&amp; 两种好的空间O(n)解法 &amp; 空间O(1)解法
  5. ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能
  6. 为PHP增加PDO-Mysql驱动
  7. Web Api 中使用 PCM TO WAV 的语音操作
  8. UVA 10735 Euler Circuit 混合图的欧拉回路(最大流,fluery算法)
  9. LeetCode: MergekSortedLists
  10. 在Windows下编译FFmpeg详细说明