个人第四次作业-结对编程
一.Fork仓库的地址和伙伴的地址
github项目地址 | https://github.com/sunnyyyt/WordCount |
---|---|
结对伙伴作业地址 | https://www.cnblogs.com/zxx-xxx/p/11656666.html |
结对伙伴学号 姓名 | 201731062601 周小萱 |
二.psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 1540 | 1750 |
Estimate | 估计这个任务需要多少时间 | 1540 | 1750 |
Development | 开发 | 450 | 540 |
Analysis | 需求分析 (包括学习新技术) | 40 | 60 |
Design Spec | · 生成设计文档 | 60 | 40 |
Design Review | · 设计复审 (和同事审核设计文档) | 50 | 60 |
Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 40 |
Design | · 具体设计 | 50 | 70 |
Coding | · 具体编码 | 480 | 550 |
Code Review | · 代码复审 | 50 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 130 |
Reporting | 报告 | 100 | 100 |
Test Report | · 测试报告 | 40 | 30 |
Size Measurement | · 计算工作量 | 40 | 50 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 40 |
合计 | 1540 | 1750 |
三.项目代码设计包括测试代码部分设计
1.项目实现的基础功能:
- 统计文件的字符数:
- 只需要统计Ascii码,汉字不需考虑
- 空格,水平制表符,换行符,均算字符
- 英文字母:A-Z,a-z
- 字母数字符号:A-Z,a-z,0-9
- 分割符:空格,非字母数字符号
- 统计文件的单词总数,单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。
- 统计文件的有效行数:任何包含非空白字符的行,都需要统计。
- 统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词。
- 按照字典序输出到文件txt:例如,windows95,windows98和windows2000同时出现时,则先输出windows2000
新增功能: - 词组统计:能统计文件夹中指定长度的词组的词频
- 自定义输出:能输出用户指定的前n多的单词与其数量
2.项目设计思路
仔细梳理了作业要求后我们列出了几个所需的函数要求:
函数:1.统计字符 2.统计行数 3.统计单词 4.建立单词字典 5.字典中的单词排序 6.打开文件
主要函数的逻辑思路如下:
逻辑思路:
先要成功打开文件才能实现功能
具体实现各个函数的功能
建立单词词典:判断是否满足单词的条件(长度大于三,是否以数字开头)
建立完成后,调用统计单词函数通过对字典value值的来统计单词数,并对单词进行排序
输出到文件。
3.项目流程图
在整理清楚这次项目的逻辑思路之后,我们根据整体画出了整个项目的项目逻辑流程图。
4.c#代码规范(和队友共同规定项目的解题代码规范)
四.代码解析部分
1.统计字符数方法
ps:在统计字符的时候,我们最开始是用的File Stream的Read方法,通过判断返回结果是否返回-1来统计,后来发现其实可以直接用Ascll码还更加的简单。考虑到后面的函数结构以及传参方便所以采用了这种方式
2.统计行数方法
ps:统计行数的时候,因为是通过判断换行符的方法来判断行数,然后文本在转换成字符串的时候,空行变成了换行符,这样的话就统计了两次,于是就加上了一个判断,判断是否连续两次出现换行符。
3.统计单词数方法
最开始不知道应该怎么统计,也是查找资料和博客才学会了要用字典的方法来进行统计
参考链接https://www.cnblogs.com/gengaixue/p/4002244.html
参考链接https://www.cnblogs.com/wt-vip/p/5997094.html
4.频率次数排序方法
5.写入文件方法
因为上次作业也涉及到了写入文件,所以这次就比较熟悉。
6.执行结果
五.测试代码部分设计及展示。
在写接口封装前我们对项目代码各个函数书写了相应的测试代码,对于每个函数我们自定义了一个字符串的方式来测试函数功能,其实也可以通过传入路径的方式来测试,测试的方式很多,我们选择了即简便又快捷的方式来测试代码过程,然后测试也都通过了,然后将函数分别进行了接口封装。改进后的测试代码截图如下:
在接口封装部分,我们把整个代码分成了两个类,主类和计算单词的类,总共有一个主函数,五个功能函数 CountChar函数、CountLines函数、CountWords函数、GetDic函数、SortWord函数,在还没有分离出来时,主函数里面的内容比较多,导致代码的运行效率不高,之后在分离出来之后主函数就会简便很多,继而也会提高代码的运行效率。
新增功能部分:
六.计算模块部分异常处理说明
七.项目性能分析报告
在最开始进行接口封装之前,主函数的消耗要大很多,因为基本上功能部分都需要在主函数中引用,之后我们将各个函数进行分离出来后,减轻了主函数在cpu,内存方面的消耗。
八.结对的过程
本次结对编程选择的是跟室友一起结对,因为对彼此比较熟悉,所以一起结对编程较为方便。在这次的结对编程过程中,我门本身对c#代码不大熟悉,所以我们两个要完成所有功能是有一定的难度,中途我们也查找了很多资料,也问了室友相关的c#代码问题,然后在接口部分我们也查找了很多资料,这次项目的完成过程也是比较曲折的,但是还好最后通过两个人的共同努力将项目作业完成,两个人分工合作,先规定代码规范,然后再各自书写相应的代码,然后再汇总起来,过程中遇到困难互相帮助,互相鼓舞,提高了各自得团队合作能力,是很好的一次项目作业体验,也证实了有时候1+1是真的大于2的。