第三次作业

 

github地址 https://github.com/shenyaxin/WordCount.git
结对伙伴作业地址  

 

 

 

 

一.结对过程

  1.结对过程

  在知道要完成结对编程这个作业的时候,已经和现在的结对伙伴组好了队,我们根据代码要求,分工合作了这个任务。分工大概是按照能力大小来分的,现在看来,在我们所预期的时间内,几乎刚刚好完成这个作业。

  在第一步中,我完成了统计单词和字符的模块,她完成了统计行数的模块,我们互相审查了对方的代码,修正了一些小细节并合并了代码,封装由我的伙伴完成。在第三部功能新增中,我们各完成了其中的一般。

  这是我们在一起讨论时候的照片:

            

  这是预期的花费时间:

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

 30

 30

· stimate

· 估计这个任务需要多少时间

 400

 500

Development

开发

 200

 300

· Analysis

· 需求分析 (包括学习新技术)

 100

 150

· Design Spec

· 生成设计文档

 30

 30

· Design Review

· 设计复审 (和同事审核设计文档)

 30

 30

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 30

 30

· Design

· 具体设计

 40

 40

· Coding

· 具体编码

 200

 200

· Code Review

· 代码复审

 30

30

· Test

· 测试(自我测试,修改代码,提交修改)

 30

 30

Reporting

报告

 60

 60

· Test Report

· 测试报告

 30

 30

· Size Measurement

· 计算工作量

 10

 10

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 10

 10

 

合计

 1230

 1480

                                                                                                                                                                      

二.编写代码

  2.1代码要求

  输入文件名以命令行参数传入。统计input.txt中的以下几个指标

  1)统计文件的字符数

    只需要统计Ascii码,汉字不需考虑

    空格,水平制表符,换行符,均算字符

  (2)统计文件的单词总数,单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。统计文件中各单词的出现次数,最终只输出频率最高的10个。频率相同的单词,优先输出字典序靠前的单词。按照字典序输出到文件txt:例如,windows95,windows98和windows2000同时出现时,则先输出windows2000     输出的单词统一为小写格式

    英文字母:A-Z,a-z 

    字母数字符号:A-Z,a-z,0-9

    分割符:空格,非字母数字符号

    例:file123是一个单词,123file不是一个单词。file,File和FILE是同一个单词

  (3)统计文件的有效行数:任何包含非空白字符的行,都需要统计。

 

   2.2设计思路

  拿到题目后,首先想到将统计要求分类,分为字符,单词和行数的统计,我和我的伙伴分好任务后,(我的任务为单词和字符),首先想到字符可以用字符串的形式来统计,但是单词几乎没有思路,在网上查找后,发现单词和字符都可以用正则表达式来统计,在粗略的了解了正则表达式后,决定用正则表达式来统计。

  2.3设计过程

  首先在主函数中设定输入文件名,然后传参到各个函数中,我们确定只有一个类,设定三个函数,将统计单词量与输出单词合并为一个函数,所以三个函数分别实现单词,字符,和行数。主要采用的是正则表达式来实现的单词和字符统计。这三个类各自编写好后,合并两人代码实现封装时再细化函数功能。

  2.4流程图

  

三.关键代码

  1.统计词组

            StreamReader reader = new StreamReader(File_name, Encoding.Default);
            String path = null;
            string si = null;
            while ((path = reader.ReadLine()) != null)
            {
                si += (path + "\n");
            }

            string[] words = Regex.Split(si, @"\W+");
            foreach (string word in words)
            {
                if (ss.ContainsKey(word))
                {
                    ss[word]++;
                    num++;
                }
                else
                {
                    ss[word] = 1;
                    num++;
                }
            }

  2.字典类

 

Dictionary<string, int> ss = new Dictionary<string, int>();
            string[] Word1 = new string[num];
            int[] Word1_n = new int[num];
            int i = 0;
            foreach (KeyValuePair<string, int> entry in ss)//统计单词总量
            {


                Word1[i] = entry.Key;
                Word1_n[i] = entry.Value;
                i++;
            }

  3.正则表达式

 

 num = Regex.Matches(str, @"\d").Count;
            num = num + Regex.Matches(str, @"\s").Count;
            num = num + Regex.Matches(str, @"\w").Count;
            Console.WriteLine("字符数为:" + num);

 

四.测试过程

   4.1代码互审

  在代码互审过程中,首先发现在判断字符个数时出现了遗漏,没有将空格等也算入字符计算。其次是在文件名的输入,以及扩展新功能时与新功能链接使用的问题上,从一开始简单的输入文件名到我们加入了循环。行数判断后来才加入循环,使空白行不算入行数。

  4.2建立单元测试

  4.3 统计字符数类测试

  4.4统计单词与词频类测试

  4.5效能分析

  不是很懂效能分析怎么变成这样的,但是我弄了很多遍都还是这样的,还有很多要学习的,推测占用最多的是含循环的那个函数。但循环已经优化了,所以不多讨论了。

 

 

五.代码规范链接

    https://blog.csdn.net/qq_31606375/article/details/77783328

六.总结

    结对编程在分工好了的时候,相较于单人编程来说较省时间,但是当其中一人遇到瓶颈时,两个人的进度都会卡住,但是总体来说,还是感受到了1+1>2的效果,收货了很多,在讨论中也学到了不少东西,对于以后和团队的沟通交流肯定是有很大进步的。另外一个收货就是字典类和正则表达式的学习。对于正则表达式,参考了这个博客,写的很详细,帮助很大:https://blog.csdn.net/saccharine/article/details/53032062.

 

  

posted @ 2019-04-05 02:12  小豆沙  阅读(188)  评论(1编辑  收藏  举报