第三次结对编程作业

一、地址

 作业链接:  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     }
TopWords

 

十、心得感受

     通过这次作业,对结对编程有了深刻的了解,以前觉得结对编程很奇怪,这次作业之后有了一个大概了解,虽然结对编程不能达到1+1=2,但是在遇到困难的时候,两个人一起解决,很快就能解决问题,1+1<2是因为有时候有分歧,导致浪费时间等。一个人的时候虽然没有交流问题,但是一个人的能力毕竟是有限的,所以有时候,一个合适的结对伙伴可以事半功倍。同时这次作业再一次让我熟悉了C#,知道了怎么在cmd中调用exe,以及传入参数等,花费的时间固然很多,但是收获满满,很开心。

 

posted @ 2019-04-05 18:54  Foreverux  阅读(168)  评论(4编辑  收藏  举报