结对编程

【作业信息】

Q A
作业所属课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign/
作业要求 https://www.cnblogs.com/harry240/p/11524113.html
我的博客 https://www.cnblogs.com/BigTent/p/11663799.html
队友博客 https://www.cnblogs.com/lwcblogs/p/11656751.html
GitHub地址 https://github.com/Luo-Star/WordCount.git

结对过程及照片

结对过程

这次结对编程非常荣幸能够和编程大佬罗伟诚组队。我在群里面问了一下有没有人还没组队,然后他就回我了,问我要不要组队,我说要得,然后我们就正式结对。确定结对之后为了以后更好的沟通合作,我们先是制定了编码规范,然后就开始写代码,罗伟诚对于编程非常积极,我们三下五除二就把程序编好了,跟他合作也非常愉快。

编码规范

1.命名规范:总体采用驼峰命名法,类名首字母大写,变量和方法名首字母小写,常量全部大写,禁止拼音命名。
2.布局:采用vs自动缩进,大括号不于代码同行,注释单独在一行,位于注释部分的上方。
3.接口:方法的形参和传输的参数命名相同,必要时在上方备注参数类型
4.代码规范:
适当使用空行,来增加代码的可读性
方法的命名,一般将其命名为动宾短语,一个方法只完成一个任务
常用缩进和换行,使代码层次清晰,明了
对泛型进行循坏时,尽量foreach
缩进和间隔:缩进用TAB,不用 SPACES
注释需和代码对齐
避免写太长的方法。一个典型的方法代码在1~25行之间。

结对编程照片

PSP表格

PSP2.1 Personal Software Process Stages 估耗时(分钟) 实际耗时(分钟)
·Planning ·计划 40 55
·Estimate · 估计这个任务需要多少时间 90 90
·Development ·开发 60 75
· Analysis · 需求分析 (包括学习新技术) 30 35
· Design Spec · 生成设计文档 15 18
· Design Review · 设计复审 (和同事审核设计文档) 20 20
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 5 5
· Design · 具体设计 30 40
· Coding · 具体编码 120 150
· Code Review · 代码复审 40 60
· Test · 测试(自我测试,修改代码,提交修改) 50 70
·Reporting ·报告 100 120
· Test Report · 测试报告 50 55
· Size Measurement · 计算工作量 20 20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 15 10
___ 合计 685 823

解题思路描述

-对于这种类型的编程我也是第一次接触,首先百度这种程序该怎么写。知道这种程序的写法后就开始想算法。首先确定功能,在博客要求中功能已经列举的很详细经过我们整理,主要要以下功能
1.统计文件字符
这个功能比较好实现,因为Windows自带的函数库就可以解决。这个功能的要求是统计所有字符,包括空格,换行,所以我们只需要读取文件,把内容转化为字符串,然后再用CharactersNum()方法就可以统计所有的字符数
2.统计单词数
对于这个功能,我们首先想到的是计算文本里面的空格数。但是题目要求:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。所以这里需要用到正则表达式进行限制。按行读取文本,存入集合中,再用正则表达式进行筛选。
3.统计行数
这个也简单,直接统计换行符即可
4.统计单词频率
在统计单词数的基础上,将确定为单词的字符串存入一个集合中,然后再从第一个单词开始进行匹配,并计数。
5.写入文件
首先输入文件路径,然后用StreamWriter()创建一个对象,再用里面的write方法,就可以将内容写入文件。
6.筛选定长单词
在统计单词个数的基础上,将确定为单词的字符串存入一个列表中,然后依次遍历每个单词,再用string.len()可以得到每个单词的长度,然筛选出指定长度的单词即可

实现过程

首先类的设计就两个,第一个数函数类,第二个方法类。主函数类调用方法,而方法类中包含了所有需要用到的方法。方法类就七个函数,其中有一个公共方法getDic 这个方法用于获得字典,存入字典中的是长度大于四且不以数
字开头的单词以及他们出现的次数,这个方法会返回一个Hashtable,方法getWordFre()方法将字典按照单词出现的次数进行排序,并返回一个动态数组。
其他的,可以直接调用,getWordFre这个方法利用返回的数组进行相应功能的实现。
流程图

单元测试

部分测试代码

测试结果
测试文件

如图所示,结果符合预期。
单元测试2

测试文件

结果

测试文件

代码互审

代码互审我们进行得比较模糊,就是每个人完成了一个功能模块,再交给另一个人测试,审核,看看有没有错误,或者有没有更好的算法。
刚开始我们都不知道用正则表达式,我也是通过百度才了解正则表达,然后我们就改进了以前写的算法,大幅度缩短了代码量而且出错率低

性能测试及改进

性能分析如图所示

性能分析是我们完成代码之后一起做的,所以这张图是和罗伟诚一样的。
这里的代码改进主要有两点,第一点使用字典,第二点使用正则表达式。
刚开始写代码的时候,首先想到的使用数组,或者字符串类型封装的一
写方法。但是这样编写起来代码冗长,而且容易出错,最后我们采用了
比较高效的正则表达式和字典。

代码说明

1.获取字典
提取文本中的单词并放入列表中,同时统计出每个词词频放到Hashtable中,最后返回一个Hashtable

2.计算单词频率
getWordFre(string pathName, ref Hashtable wordList)将传递过来的wordList进行按频率排序,并将Hashtable转换成动态数组并返回

3. 将结果写入文件
首先输入文件路径,然后用StreamWriter()创建一个对象,再用里面的write方法,就可以将内容写入指定文件。

public void write(string outputPath, ref Hashtable wordList, int lines, int words, int characters, int wordsOutNumFla, int wordsOutNum, int m, string inputPath)
{
getFile Wordlist = new getFile();
ArrayList keysList = new ArrayList();
ArrayList keysList1 = new ArrayList();

        keysList1 = Wordlist.getPhrase(inputPath, outputPath, ref wordList, m);
        keysList = Wordlist.getWordFre(outputPath, ref wordList);
        StreamWriter sw = new StreamWriter(outputPath);
        sw.WriteLine("characters:{0}", characters);
        sw.WriteLine("words:{0}", words);
        sw.WriteLine("lines:{0}", lines);
        if (wordsOutNumFla == 1)
        {
            wordsOutNum = wordsOutNum;
        }
        else
            wordsOutNum = 10;
        for (int i = 0; i < wordsOutNum; i++)
        {
            sw.WriteLine("<{0}>:{1}", keysList[i], wordList[keysList[i]]);
        }
        sw.WriteLine("以下是长度为{0}的词组:\n", m);
        foreach (string j in keysList1)
        {
            sw.WriteLine("<{0}>:{1}", j, 1);
        }
        sw.Flush();
        sw.Close();
    }

4.统计行数
按行读取,每读取一行加一,最后得出行数

5.统计单词数,读取文件,用正则表达式进行筛选

6.统计字符数,这个比较简单,按行读取文件,累加每行的长度即可

7.获取定长单词数量

感想总结

首先看到题目要求的时候就觉得脑壳大,想了半个小时才把逻辑相同。然后在编写代码的时候也比较头疼,因为我是第一次接触这种命令行的程序。以前写的都先运行程序,然后再一个一个输入参数运行。通过罗伟诚的科普,我才知道,原来主函数的参数 args[]数组是用来存放吗命令的。我让罗伟诚写了一段,示范给我看一下,这才理解了。这次的结对编程,不仅体验到了两个写代码的优越性,还让我学会了使用字典和正则表达式。最后感谢罗伟诚的合作和帮助。

posted @ 2019-10-12 20:41  NewHaker  阅读(152)  评论(1编辑  收藏  举报