结对编程

一、博客开头

二、描述结对过程

三、分工及计划开发安排

结对编程_第1张图片

四、解题思路描述

首先分析项目的功能要求,可以发现主要要攻克的难点如下:
1)控制台指令的分解
解决方法:我们对main函数的入口进行操作,对字符串组类型的args()进行for嵌套循环匹配命令符,从而实现控制台命令分解的效果。
2)文件的读取与存储
解决方法:要解决读取文件的问题,查阅资料后我们使用StreamReader来完成txt文件的读取。在这个过程中我们同时发现ReadLine()能完成逐行的读取,因此使用一个while循环就能直接把有效行数统计出来。
3)统计文件的字符数、统计文件的单词总数、统计文件的有效行数、统计文件中各单词的出现次数等基本功能开发
解决方法:统计文件的字符数,经查阅我们发现使用 Regex.Matches(text, @"\w").Count;能计算出英文和数字的字符数,由于一个文件(如英文文章)里可能还有别的标点符号,因此类似的使用这个函数也将其他的标点符号匹配上进行Count计算,最后相加求出字符总数。
而对于统计文件的单词总数,由于题目给的约束条件比较多,使用正则表达式能很好的解决这个问题,我们写出了符合题目要求的表达式来表示单词,从而通过叠加来求出单词总数。
然后,统计文件中各单词的出现次数,这个问题我们分了两步来解决,首先要将文本内容进行分割,凡是遇到标点符号和空格、回车的地方,就进行中断,从而切割出一个一个单词,经查阅,使用Split和Trim能完成分割操作。分割之后根据正则表达式将符合条件的单词加入List集合中,使用ContainsKey统计所有单词及其词频。
最后就是将频率最高的单词优先输出,对于这样的排序问题,也是查了很久的资料发现Dictionary能完成对次数降序的操作,而且还能按字典顺序进行排序,因此结合着数组的使用,完成了排序的功能。
4)词组的统计、自定义输出等扩展功能的开发
解决方法:两个拓展功能只需要在基础功能的类里修改接口传参即可实现。

五、实现过程

针对以上功能需求分析设计脚本结构如下:
结对编程_第2张图片

基础功能流程图如下:
结对编程_第3张图片

扩展功能流程图如下:
结对编程_第4张图片

六、具体代码

展示部分具体代码:
//统计行数
public int lineCount(string path)
{
int line = 0;
string text;
StreamReader sR = new StreamReader(path, Encoding.UTF8);
while ((text = sR.ReadLine()) != null)
{
line++;
}
sR.Close();
Console.WriteLine("================基础功能================");
mycount2.storeTest("================基础功能================",opath);
Console.WriteLine("行数:" + line);
mycount2.storeTest("行数:" + line,opath);
return line;
}

    //统计字符总数
    public int charCount(string path)
    {
        int chars = 0;
        string text;
        StreamReader sR = new StreamReader(path, Encoding.UTF8);
        while ((text = sR.ReadLine()) != null)
        {
            chars += Regex.Matches(text, @"\w").Count;//匹配字母,数字,_
            chars += Regex.Matches(text, @"\s").Count;//匹配空格,水平制表符
            chars += Regex.Matches(text, @"\n").Count;//匹配换行符
            chars += Regex.Matches(text, @"\?").Count;//匹配?
            chars += Regex.Matches(text, @"\,").Count;//匹配逗号
            chars += Regex.Matches(text, @"\.").Count;//匹配.
            chars += Regex.Matches(text, @"\!").Count;//匹配!
            chars += Regex.Matches(text, @"\-").Count;//匹配-
            chars += Regex.Matches(text, @"\(").Count;//匹配(
            chars += Regex.Matches(text, @"\)").Count;//匹配)
        }
        sR.Close();
        Console.WriteLine("字符总数:" + chars);
        mycount2.storeTest("字符总数:" + chars, opath);
        return chars;
    }

    //统计单词总数
public int wordCount(string path)
{
    int words = 0;
    string wordtype = @"[a-zA-Z]{4,}[a-zA-Z0-9]*";
    string text;
    StreamReader sR = new StreamReader(path, Encoding.UTF8);
    while ((text = sR.ReadLine()) != null)
    {
        words += Regex.Matches(text, wordtype).Count;
    }
    sR.Close();
    Console.WriteLine("单词总数:" + words);
    mycount2.storeTest("单词总数:" + words, opath);
    return words;
}

七、单元测试与性能分析

测试部分我们用《茶花女》前四章节作为待处理文本,分别测试基础功能与拓展功能,结果如下:
结对编程_第5张图片

结对编程_第6张图片

系统性能如下:
结对编程_第7张图片

八、总结与收获

在本次结对编程中两个人的任务分配并不是对等的,由于时间原因,我完成了大约三成的部分(两个拓展功能与命令的分解),另一个同学完成了其他的百分之70,在某种意义上讲,结对编程只是分担了独立完成的重负,并未起到1+1>2的情况。希望随着默契度和技术的增长,结对编程的效果更加突出。

你可能感兴趣的:(结对编程)