结对编程
一、博客开头
二、描述结对过程
三、分工及计划开发安排
四、解题思路描述
首先分析项目的功能要求,可以发现主要要攻克的难点如下:
1)控制台指令的分解
解决方法:我们对main函数的入口进行操作,对字符串组类型的args()进行for嵌套循环匹配命令符,从而实现控制台命令分解的效果。
2)文件的读取与存储
解决方法:要解决读取文件的问题,查阅资料后我们使用StreamReader来完成txt文件的读取。在这个过程中我们同时发现ReadLine()能完成逐行的读取,因此使用一个while循环就能直接把有效行数统计出来。
3)统计文件的字符数、统计文件的单词总数、统计文件的有效行数、统计文件中各单词的出现次数等基本功能开发
解决方法:统计文件的字符数,经查阅我们发现使用 Regex.Matches(text, @"\w").Count;能计算出英文和数字的字符数,由于一个文件(如英文文章)里可能还有别的标点符号,因此类似的使用这个函数也将其他的标点符号匹配上进行Count计算,最后相加求出字符总数。
而对于统计文件的单词总数,由于题目给的约束条件比较多,使用正则表达式能很好的解决这个问题,我们写出了符合题目要求的表达式来表示单词,从而通过叠加来求出单词总数。
然后,统计文件中各单词的出现次数,这个问题我们分了两步来解决,首先要将文本内容进行分割,凡是遇到标点符号和空格、回车的地方,就进行中断,从而切割出一个一个单词,经查阅,使用Split和Trim能完成分割操作。分割之后根据正则表达式将符合条件的单词加入List集合中,使用ContainsKey统计所有单词及其词频。
最后就是将频率最高的单词优先输出,对于这样的排序问题,也是查了很久的资料发现Dictionary能完成对次数降序的操作,而且还能按字典顺序进行排序,因此结合着数组的使用,完成了排序的功能。
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;
}
七、单元测试与性能分析
测试部分我们用《茶花女》前四章节作为待处理文本,分别测试基础功能与拓展功能,结果如下:
系统性能如下:
八、总结与收获
在本次结对编程中两个人的任务分配并不是对等的,由于时间原因,我完成了大约三成的部分(两个拓展功能与命令的分解),另一个同学完成了其他的百分之70,在某种意义上讲,结对编程只是分担了独立完成的重负,并未起到1+1>2的情况。希望随着默契度和技术的增长,结对编程的效果更加突出。
原文地址:https://www.cnblogs.com/JoneAndMe/p/11671954.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 微信小程序开发实战(27):录音
- 微信小程序开发实战(28):播放、暂停、停止声音
- 微信小程序开发实战(29):控制背景音乐
- 面试:如何从 100 亿 URL 中找出相同的 URL?
- Spring Boot+Gradle+ MyBatisPlus3.x搭建企业级的后台分离框架
- 不要再对类别变量进行独热编码了
- 面试Java基础问题汇总
- K8s集群上使用Helm部署2.4.6版本Rancher集群
- 一个工作三年的同事,居然还搞不清深拷贝、浅拷贝...
- 太有意思了,教你实现实现王者荣耀团战!
- 动画:什么是基数排序?
- 一个有意思的分钱模拟问题
- 如何快速的开发一个完整的直播购物源码,基础篇
- 「拥抱开源」Nacos 实战篇
- 仅2M!免费软件又一次干掉了付费版