结对编程-wc.exe
结对学号:
201631062215、201631062116
项目地址:https://gitee.com/nasi96/codes/0oh63ispudrec8zf49tnq63
一 、项目介绍
本次是在滴一次WordCount的基础上,采取结对编程方式进行扩展功能的编写。
在扩展功能中,用户通过输入命令行的方式与程序实现交互。并且在基本功能的基础上新增了2个命令参数;实现统计所有文件名是txt文件的字符数与单词数的统计。实现文件空行数、代码行数、注释行数以及字符数和单词数的统计。
二 、项目要求
wc.exe -s //递归处理目录下符合条件的文件
wc.exe -a file.c //返回更复杂的数据(代码行 / 空行 / 注释行)
wc.exe -e stopList.txt // 停用词表,统计文件单词总数时,不统计该表中的单词
[file_name]: 文件或目录名,可以处理一般通配符。
其中:
代码行:本行包括多于一个字符的代码。
空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
}//注释,在这种情况下,这一行属于注释行。
三 、编程情况
1 命名方式不规范
2 代码注释过少,少于百分之20
3 代码可读性较差
四、编程情况与说明
本次为了完成扩展功能重新添加了两个类分别是LineOfCode类与DirectoryList类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class DirectoryList { private static ArrayList directorysList = new ArrayList(); public static ArrayList DirectorysList { get { return DirectoryList.directorysList; } set { DirectoryList.directorysList = value; } } private static ArrayList fileList = new ArrayList(); public static ArrayList FileList { get { return DirectoryList.fileList; } set { DirectoryList.fileList = value; } } public static void GetDirectory(string sourcePath) { if (Directory.Exists(sourcePath)) { string[] tmp = Directory.GetFileSystemEntries(sourcePath); for (int i = 0; i < tmp.Length; i++) { if (File.Exists(tmp[i])) { FileList.Add(tmp[i]); } else { if (Directory.GetDirectories(tmp[i]).Length == 0) { DirectorysList.Add(tmp[i]); } } GetDirectory(tmp[i]); } } } DirectoryList
递归处理目录下适合条件的文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class LineOfCode { public static bool isLine = false; //一行中拥有有效字符时为true,该行可记入代码行数 public static bool isCommitLf = false; //注释/*...*/中出现至少一个折行时为true public static int nuines; public static int notlines; public static int LinesOfCode(string filename) { int lines = 0; int nulines=0; int notelines = 0; System.IO.StreamReader sr = System.IO.File.OpenText(filename); string s = sr.ReadToEnd(); sr.Close(); for (int i = 0; i < s.Length; i++) { //无效字符 if (s[i] == ' ' || s[i] == '\r' || s[i] == '\t') { continue; } //搜索到换行,若该行有有效字符 if (s[i] == '\n') { if (isLine) { lines++; isLine = false; } else if(!isLine) nulines++; continue; } //字符串,占多少行按多少行算 if (s[i] == '\"') { while (true) { i++; //如果文件遍历完毕则强行中止 if (i >= s.Length) { break; } //再次遇到字符'"'且前方没有或有偶数个'//'时,中止循环并退出 if (s[i] == '\"') { int sign = 0, counter = 0; while (true) { sign++; if (i - sign < 0) { break; } else if (s[i - sign] == '\\') { counter++; } else { break; } } if (counter % 2 == 0) { break; } } //字符串中的换行,直接算作一行代码 if (s[i] == '\n') { lines++; isLine = true; } } isLine = true; continue; } //遇到形如 /*...*/ 的注释 if (s[i] == '/' && i < s.Length - 1) { if (s[i + 1] == '*') { i++; while (true) { i++; //如果文件遍历完毕则强行中止 if (i >= s.Length) { break; } if (s[i] == '\n') { notelines++; if (isCommitLf == false) { if (isLine == true) { lines++; isLine = false; } isCommitLf = true; } } if (s[i] == '*' && i < s.Length - 1) { notelines--; if (s[i + 1] == '/') { i++; break; } } } isCommitLf = false; continue; } } //遇到形如 // 的注释 if (s[i] == '/' && i < s.Length - 1 && s[i + 1] == '/') { notelines++; if (isLine == true) { lines++; isLine = false; } while (true) { i++; if (i >= s.Length || s[i] == '\n') { break; } } continue; } //该行有了有效字符,算作一行 isLine = true; } //最后一行可能没有字符'\n'结尾 if (isLine) { lines++; } //return lines; nuines = nulines; notlines = notelines; return lines; } } } LineOfCode
统计文件中的代码行 ,空行,注释行
五 测试情况
此次主要对DirectoryList类进行了单元测试
测试用例达到了语句覆盖
六、 总结
通过本次项目中对wc.exe的结对编程,我更加知道了团队合作的重要性,不只是在编程方面,更是在项目的其他方面,各方面的协作能够节省大量的时间,以及可以使得代码更加的完整,错误率被大大地减少,使得代码更加的完善,可读性也更加优秀。并且这样的结对编程,更加符合标准的项目开发过程,开发过程中的错误可以及时的被发现然后解决,而且不会影响日后的编程。很棒!
参考文献:
www.baidu.com
C# 语言的规范:简版, 讨论版