个人作业总结
沈三景
PB15061249
个人作业
实验要求
- 对源文件(.txt,.cpp,.h,.cs,.html,.js,.java,.py,*.php等,文件夹内的所有文件)统计字符数、单词数、行数、词频,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
- 使用性能测试工具进行分析,找到性能的瓶颈并改进。
- 对代码进行质量分析,消除所有警告。
- 设计10个测试样例用于测试,确保程序正常运行(例如:空文件,只包含一个词的文件,只有一行的文件,典型文件等等)。
- 使用Github进行代码管理。
- 撰写博客 。
前期准备
需求分析
- 该实验要求跨平台(Linux和Windows),所以代码要求有可移植性。
- 需要对整个文件夹的内容遍历、统计、计数,所以要选择合适的数据结构,加快运行速度。本实验最佳的数据结构为unordered_map(我用了map)。
- 需要用VS分析热行,提高代码执行效率。
代码规范
- 用有意义的变量名,如在统计字符数时定义的函数变量名为count_character,读入所有文件的函数名为GetAllFiles
- 在复杂的嵌套中要加上注释end if/for/while
- ‘{’和‘}’单独占一行
- 缩进为一个tab键
- 头文件均用#include
PSP表格
PSP2.1 |
任务内容 |
计划完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
30 |
30 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
30 |
30 |
Development |
开发 |
700 |
795 |
Analysis |
需求分析 (包括学习新技术) |
30 |
15 |
Design Spec |
生成设计文档 |
30 |
5 |
Design Review |
设计复审 (和同事审核设计文档) |
30 |
5 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
30 |
20 |
Design |
具体设计 |
40 |
40 |
Coding |
具体编码 |
400 |
600 |
Code Review |
代码复审 |
40 |
10 |
est |
测试(自我测试,修改代码,提交修改) |
40 |
100 |
Reporting |
报告 |
240 |
120 |
Test Report |
测试报告 |
60 |
80 |
Size Measurement |
计算工作量 |
30 |
10 |
Postmortem & Process Improvement Plan |
事后总结 ,并提出过程改进计划 |
150 |
30 |
Summary |
合计 |
970 |
945 |
设计思路
- 将文件的路径名保存在一个vector中
- 读取vector。中的每个路径对应的文件,用getline,同时统计行数,将结果存储在map >键为文件名,值为一个vector,里面按行存储了文件的内容。
- 统计字符数,ASCII码在32到126之间,即对m->second[i][j]进行遍历,若在32到126之间则加一。
- 统计单词数,单词的定义是以四个英文单词开头的字母数字符号,单词以分隔符分割,不区分大小写。即先找到两个相邻的分隔符,在判断加在中间的是否满足单词的定义。
- 统计单词频率,构造一个队列,里面存当前出现频率最高的单词,以及单词数。
- 统计词组频率,构造一个队列,里面存当前出现频率最高的词组,以及词组数。 -
代码实现
性能分析
- 字符串的链接str1 = str1 + str2占用太多时间,后来在同学的提醒下,在结合上网查的一些资料后,将代码改为str1 += str2
- 调用热键发现sameword花费太多时间,细看sameword发现大多数时间花在大小写转换上,现在任然不清楚有什么方法能够改善大小写转换所需时间,我用的函数为transform
测试样例
测试了十个样例,发现都是正确的(但是和老师给的测试集在字符数、行数、单词数上都有差距,至今不清楚原因),测试的样例包括了空文件,只包含一个词的文件,只有一行的文件,典型文件等等。
跨平台移植
这边参考了刘泽同学的博客(他的博客上有错误,现在应该已经改正了。)
总结
这次实验坑巨多,时间非常紧张,最后差点心态爆炸,但是与此同时也收获了许多新的知识,特别是代码调试和代码优化方面的技巧,学会了如何使用热键(虽然代码优化的很渣),学会了如何用github进行代码管理。最重要的一点是熟悉了整个软件开发的流程,从需求分析到编程,再到debug和优化。收获了许多。