第一次作业 PSP 代码规范 项目所得
第一次作业
要求:
-
截止日期
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的使用。