第一次作业 PSP 代码规范 项目所得

第一次作业

要求:

  1. 截止日期

    2018年3月29日23:59 

    要求

    1. 对源文件(*.txt,*.cpp,*.h,*.cs,*.html,*.js,*.java,*.py,*.php等,文件夹内的所有文件)统计字符数、单词数、行数、词频,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。

    2. 使用性能测试工具进行分析,找到性能的瓶颈并改进

    3. 对代码进行质量分析,消除所有警告

    http://msdn.microsoft.com/en-us/library/dd264897.aspx

    4. 设计10个测试样例用于测试,确保程序正常运行(例如:空文件,只包含一个词的文件,只有一行的文件,典型文件等等)

    5. 使用Github进行代码管理

    6. 撰写博客 

     

    基本功能

    1. 统计文件的字符数(只需要统计Ascii码,汉字不用考虑,换行符不用考虑,'\0'不用考虑)(ascii码大小在[32,126]之间)

    2. 统计文件的单词总数

    3. 统计文件的总行数(任何字符构成的行,都需要统计)(不要只看换行符的数量,要小心最后一行没有换行符的情形)(空行算一行)

    4. 统计文件中各单词的出现次数,输出频率最高的10个。

    5. 对给定文件夹及其递归子文件夹下的所有文件进行统计

    6. 统计两个单词(词组)在一起的频率,输出频率最高的前10个。

    7. 在Linux系统下,进行性能分析,过程写到blog中(附加题) 

    注意:

    a) 空格,水平制表符,换行符,均算字符

    b) 单词的定义:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。

    英文字母:A-Z,a-z

    字母数字符号:A-Z,a-z,0-9

    分割符:空格,非字母数字符号

    例如:”file123”是一个单词,”123file”不是一个单词。file,File和FILE是同一个单词。

    如果两个单词只有最后的数字结尾不同,则认为是同一个单词,例如,windows,windows95和windows7是同一个单词,iPhone4和IPhone5是同一个单词,但是,windows和windows32a是不同的单词,因为他们不是仅有数字结尾不同

    输出按字典顺序,例如,windows95,windows98和windows2000同时出现时,输出windows2000

    单词长度只需要考虑[4, 1024],超出此范围的不用统计。

    c)词组的定义:windows95 good, windows2000 good123,可以算是同一种词组。按照词典顺序输出。三词相同的情形,比如good123 good456 good789,根据定义,则是 good123 good123 这个词组出现了两次。

    两个合法单词之间,出现一个非法字符串,比如:windows2000 abc good123,因为abc按照定义不是单词,因此这个词组其实是windows2000 good123,中间的abc当做分隔符看待。

    good123 good456 good789这种情况,由于这三个单词与good123都是同一个词,最终统计结果是good123 good123这个词组出现了2次。

    两个单词分属两行,也可以直接组成一个词组。统计词组,只看顺序上,是否相邻。

    d) 输入文件名以命令行参数传入。需要遍历整个文件夹时,则要输入文件夹的路径。

    e) 输出文件result.txt

    characters: number

    words: number

    lines: number

    <word>: number

    <word>为文件中真实出现的单词大小写格式,例如,如果文件中只出现了File和file,程序不应当输出FILE,且<word>按字典顺序(基于ASCII)排列,上例中程序应该输出File: 2

    f) 根据命令行参数判断是否为目录

    g) 将所有文件中的词汇,进行统计,最终只输出一个整体的词频统计结果。

准备

  •  学习c++相关语法,常用对象内容。
  •   VS性能分析,寻找linux下性能分析工具。  
  •   github使用

代码规范

  1. 宏定义、类型定义、函数之间,都加上空行。

  2. 除了一元运算符,运算符、变量之间加上空格。

  3. 一个类型不要有两个名称。

  4. 命名不要太过冗余。

  6. 指针名不要用p、ptr、pointer这样空泛的名称,是什么就叫什么。

  7. 判断的时候变量名写左边,常量写右边。

  8. 注释写在函数签名上面。

  9. 任何情况下if、while、for代码块都加上花括号。

  10. 类型名用大写,变量名用小写。

PSP:

进度规划计划用时实际用时
理清逻辑思路 60min 60min
实现文件夹递归遍历 30min

80min

1 没有完全实现导致后来出现bug,加上了修改的时间。

2 linux文件遍历与windows不同。

统计字符以及行数 30min

20min

数目最后仍与助教结果有差异

统计单词数目 70min

360min

使用哈希表后为了按字典顺序输出占用了大量时间

后来为了优化,更改了逻辑又花了很多时间

统计词组数目 40min

30min 

感觉写完判定单词之后很快

代码优化 120min

60min

原本以为要花很多时间,但是应该是自己水平太差了,根本不知到如何优化

linux性能分析 80min

120min

安装Linux以及性能分析软件花费了许多时间

测试细节 40min

60min

构建例子,撰写报告

总时间 470min

790min

项目所得:

  对于c++使用更为熟练了,对其面向对象的特性有了更深的理解,c++绝对不是c加了个class。

  第一次为了性能优化,从代码结构,数据结构选取,算法选取,一直到每一行代码都绞尽脑汁的权衡,这是之前从来没有过的体验。

  linux下性能分析工具的使用。

  GitHub的使用。

posted @ 2018-03-27 07:47  浅踏雪无痕  阅读(223)  评论(1编辑  收藏  举报