• Project: Individual Project


    一、预计用时:

    (1)明确要求:15min;

    (2)文件的遍历:1h;

    (3)Simple mode 词频统计:0.5h;

    (4)extend mode 词频统计:1h;

    (5)对单词词频排序输出:0.5h;

    (6)测试与调试:2h;

    (7)程序优化:2h;

     

    二、实际用时:

    (1)遍历文件夹:本来以为这部分不会很难,结果自己动手的时候才发现对于递归遍历子目录一筹莫展,最终还是参考的网上的数据,用时比较久,4h

    (2)Simple词频统计:在这部分中,首先将合法的单词提取了出来,花了1.5h,然后进行统计,花费了0.5h

    (3)Extend词频统计:统计部分,比较难的是提取单词,提取出来以后,统计变得非常容易,只不过是增加了扩展模式对于是否是同一个单词的判断,花费了1h

    (4)排序与输出:花费了40分钟

    (5)测试与调试:3h;

    在调试阶段,才发现一开始自己的想法中有许多不成熟的地方,比如说没有考虑到文件读取到末尾时,对于文件到了末尾没有采取判断措施,从而在词频统计时出了错,经过单步调试才发现了错误;其中也有花括号太多(眼花缭乱)配对错误导致bug百出等等;

    在这部分花了比较久的时间,但是经过自己的调试,发现了自己先前许多不成熟的想法,我会从中吸取经验教训,这对于今后的编程有很大的警示作用。

    经过自己的调试将错误一个一个的找出并最终成功运行,带来了非常大的成就感。

    (6)程序优化:3h;

    三、程序优化

    因为第一次接触VS以及程序优化,所以走了很多弯路;

    一开始,我拿简单的测试用例来进行程序分析,发现总是显示采集不到数据,在向别人讨教后,我改用网上下载的英文小说,扩充了样本量,这才开始了我的代码优化之旅~

    性能分析如下:

     
     
     
    词频统计花费的代价最大;
     
    为了优化性能,一开始我想到了改变排序算法;但是测试下来后发现效果不大(如图)
    后来,在浏览了其他同学的博客后,我学会了使用map进行词频统计,援引同学博客:“C++里面你可以是用一个东西叫做map(在map头文件中)。用map可以实现一个“数组” arr,这个数组的下表就是单词,保存的内容就是单词出现的次数。比如有一个单词叫buaa,那么通过map定义的“数组”,你可以实现arr["buaa"]++;这个操作。这个“数组”叫做map容器,可以当数组一样使用。定义一个map容器很简单:map的用法建议参考C++ primer。
    map<string,int> wordMap;

      还有一个问题是怎么样保存应该输出哪个单词,在这里我是用了另一个map<string, string>保存的。就是所有的单词全换成小写,作为下标。对于某个单词输出的时候,输出的值是该单词在第二个map对应的单词,以及第一个map里对应的次数。”

    地址:http://www.cnblogs.com/Z-XML/p/3329234.html

    我一开始是开数组实现的,现在使用了map后,经过测试,运行效率提高了不少(较之刚才),但不知道有没有更好地方法,希望作业提交上去之后,会有大神提出指导意见帮助我进一步改进代码。

    四、测试用例

     
     1、空文本
     
     
    运行结果如下:
    2、多种后缀格式
     
    运行结果
    测试用例:
    运行结果:
     
    其他类似,不再赘述浪费空间;
    3、简单模式大小写测试(含排序)
    用例:
     
    结果:
    4、扩展模式下的大小写测试;
    测试用例:
    结果:
     
    5、字典序测试
    用例:
     
    结果:
     
    6、单词格式测试:
    用例:
    结果:
    7、多个子目录下有文件
    结果:
    8、扩展模式下多个子目录下有文件
    同上(不再赘述);
     
     
    9、测试结尾空格以及回车对程序运行的影响:
    结果:
     
    10、压力测试
    运行结果:
    五、收获
       从这一次的软件工程作业中,我学到了很多。
       首先就是做一项工作,预期的时间跟实际完成的时间相比有很大差距,有时候,我们在动手前,往往将事物美好化了,觉得一切都很轻易就可以完成,然而当自己亲手去完成,去实践时,才发现处处有问题。所以说,在今后的学习生活中,要多动手,多实践,才能发现更多的不足,不断进步。
       其次,在这次的作业中,我懂得了向别人学习的重要性。在这一次的作业中,需要进行优化,我之前没有接触过优化,所以思维比较狭隘,没有分散思考。一开始,我想可能需要改进的是排序算法,但是我发现改进了算法以后几乎没有提高多少。我很苦恼,不知道该从什么地方下手。向同学请教后,才明白C++还有诸如map容器之类的,用起来比开数组方便多了。相信伴随着今后的课程,我能够在动手实践中学到更多的东西。我觉得结果固然重要,在过程中学习到的知识、拓宽的视野同样让我受益颇丰
        当然,我知道自己还有很多不足的地方,我会在今后的课程中能够向老师、助教和同学不断学习,不断进步!
  • 相关阅读:
    Spring IoC容器初的初始化过程
    IoC容器初始化过程
    花了一个星期,我终于把RPC框架整明白了!
    RPC简介及框架选择
    ORM框架的前世今生
    什么是索引?Mysql目前主要的几种索引类型
    面试官:谈谈你对Mysql的MVCC的理解?
    sql server 获取数据字段(表的字段和类型信息)
    YAML
    Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
  • 原文地址:https://www.cnblogs.com/scse11061160/p/3337756.html
Copyright © 2020-2023  润新知