第三次结对编程作业
一、地址
作业链接: | https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2882 |
GIT仓库地址: | https://github.com/Foreverux/WordCount |
结对人员: | 蒋庆-201731062117 ; 张文豪-201731062119(博客链接),作业链接 |
二、结对照片
我和我的结对伙伴(张文豪)在寝室敲代码的情景:
三、结对的PSP表格
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
20 |
20 |
· Estimate |
· 估计这个任务需要多少时间 |
800 |
950 |
Development |
开发 |
750 |
600 |
· Analysis |
· 需求分析 (包括学习新技术) |
60 |
80 |
· Design Spec |
· 生成设计文档 |
30 |
20 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
60 |
50 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
20 |
20 |
· Coding |
· 具体编码 |
200 |
220 |
· Code Review |
· 代码复审 |
20 |
20 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
50 |
40 |
Reporting |
报告 |
10 |
20 |
· Test Report |
· 测试报告 |
10 |
10 |
· Size Measurement |
· 计算工作量 |
30 |
20 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 |
20 |
|
合计 |
800 |
950 |
四、解题思路
1、首先分析题意,可以分为四个类分别设计:
一、读取用户指定的txt文件。
二、统计TXT文件中字符个数(不包括中文字符,即ASCII值中)
三、统计txt中的有效行数(空格,制表符,回车符为空白字符)
四、统计全部单词个数
五、统计单词出现次数频率最高的10个并统计频数
六、将输出信息保存到TXT文件
2、简要思路:
首先将读取文件的每一数据都保存到一个字符串中,然后其余类基于此调用。分别统计字符数,单词数,有效行、单词
个数和单词出现次数频率最高的10个并统计频数共创立6个类,创建接口。在主函数中分别调用。
五、设计实现过程及代码复审
1、首先设计read()方法,返回保存的txt的字符串,然后分别设计CountCharacters()记录字符的总数,ValidLine()记录有效行数,IsWord()判断是否符合单词,CountWords()记录单词的总个数,TopnWords()记录频率最高的n个单词及频数。最后二人整合设计接口主函数调用,以及异常处理。
2、设计“CountWords()记录单词的总个数”的时候最为复杂,基本思路是:先按空格符、换行符等把字符串分割开, 然后Isword()判断每部分是否是单词,计数并保存单词。
导图如下:
3、代码复审:代码复审过程,我们互相发现了各自的问题,例如个别地方没有遵守变量命名规则,函数命名规则等。好的是大部分地方都很好,换行,缩进等都做得很好。代码合并后,发现问题:在有输入的时候,很多语句都写在了类里面,实际调用很麻烦,所以之后就有改进了代码。
六、代码规范
部分代码规范如下具体(参考《现代软件工程讲义 3 代码规范与代码复审》一文):
(1)缩进:因为都是用的VS2017,所以我们统一使用TAB键,更方便,也可以统一整齐。
(2)断行与空白的{ }行:保证每行一句代码,‘ { ’ ‘ } ’独占一行,便于确定括号的完整对照性。
(3)大小写问题:所有单词的第一个字母都大写,如果是组合单词,第二个单词首字母大写,如:MaxNumber
(4)注释:每个函数,类都要注释,并且注释放在函数头。注释统一用中文书写,更方便伙伴阅读理解,
七、程序改进
1、两点主要改进:
其一:在类里的方法有多次在另一个类调用的情况,我们考虑了执行的次数与界面的观赏性,将部分
语句修改移动到主函数执行一次,避免了重复执行。
其二:起初在字典序头疼了很久,使用了多个for循环与if语句,后来查到了C#中有专门提供的Dictionary
函数,大大方便了程序的可行性。
2、改进后效能分析图:
八、单元测试
1、测试Countwords():
2、测试IsWord():
3、所有测试通过:
4、在cmd命令行窗口运行如图:
九、代码说明
1、Read():获取指定路径txt文件的字符串
1 public class Read 2 { 3 public string Read1(string path) 4 { 5 string s = System.IO.File.ReadAllText(path); 6 return s; 7 } 8 }
2、统计TXT文件中字符个数(不包括中文字符)
1 public class CountCharacters 2 { 3 public int Countcharacters(string str) 4 { 5 ValidLine validLine = new ValidLine(); 6 int i, count,line; 7 count = 0; 8 line = 0; 9 for (i = 0; i < str.Length; i++) 10 { 11 if (str[i] >= 0 && str[i] <= 127) 12 { 13 if (str[i] == '\n') 14 { 15 line++; 16 } 17 count++; 18 } 19 } 20 count = count - line; 21 return count; 22 } 23 }
3、统计单词出现次数前n的单词
1 public class TopWords 2 { 3 //建立字典,存放单词及其频数并按频数排序 4 public Dictionary<string, int> Gethotstring(string[] s) 5 { 6 for (int i = 0; i < 1000; i++) 7 { 8 i *= 2; 9 } 10 Dictionary<string, int> HOT = new Dictionary<string, int>(); 11 for (int i = 0; i < s.Length; i++) 12 { 13 if (HOT.ContainsKey(s[i])) 14 { 15 HOT[s[i]]++; ; 16 } 17 else 18 { 19 HOT[s[i]] = 1; 20 } 21 } 22 return HOT.OrderByDescending(r => r.Value).ToDictionary(r => r.Key, r => r.Value); 23 24 } 25 //返回频数前10的单词 26 public string Toptenwords(string[] str) 27 { 28 Dictionary<string, int> MEWHOT = Gethotstring(str); 29 string output = null; 30 //遍历字典 31 int size = 0; 32 foreach (KeyValuePair<string, int> kvp in MEWHOT) 33 { 34 size++; 35 if (size > 10) break; 36 output += kvp.Key + " (" + kvp.Value.ToString() + ")"; 37 output += "\r\n"; 38 } 39 return output; 40 } 41 //返回频数前n的单词 42 public string Topnwords(string[] str,int n) 43 { 44 Dictionary<string, int> MEWHOT = Gethotstring(str); 45 string output = null; 46 //遍历字典 47 int size = 0; 48 foreach (KeyValuePair<string, int> kvp in MEWHOT) 49 { 50 size++; 51 if (size > n) break; 52 output += kvp.Key + " (" + kvp.Value.ToString() + ")"; 53 output += "\r\n"; 54 } 55 return output; 56 } 57 58 }
十、心得感受
通过这次作业,对结对编程有了深刻的了解,以前觉得结对编程很奇怪,这次作业之后有了一个大概了解,虽然结对编程不能达到1+1=2,但是在遇到困难的时候,两个人一起解决,很快就能解决问题,1+1<2是因为有时候有分歧,导致浪费时间等。一个人的时候虽然没有交流问题,但是一个人的能力毕竟是有限的,所以有时候,一个合适的结对伙伴可以事半功倍。同时这次作业再一次让我熟悉了C#,知道了怎么在cmd中调用exe,以及传入参数等,花费的时间固然很多,但是收获满满,很开心。