WordCount(结对编程)
结队学号:
201631062215、201631062116
项目地址:https://gitee.com/nasi96/codes/0oh63ispudrec8zf49tnq63
一 项目介绍
本次是在滴一次WordCount的基础上,采取结对编程方式进行扩展功能的编写。
二 项目要求
wc.exe -s //递归处理目录下符合条件的文件
wc.exe -a file.c //返回更复杂的数据(代码行 / 空行 / 注释行)
wc.exe -e stopList.txt // 停用词表,统计文件单词总数时,不统计该表中的单词
[file_name]: 文件或目录名,可以处理一般通配符。
其中,
代码行:本行包括多于一个字符的代码。
空 行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
}//注释
在这种情况下,这一行属于注释行。
三 编程情况
1 命名方式不规范
2 代码注释过少,少于百分之20
3 代码格式不规范。
4 代码可读性较差。
四 编程情况与说明
本次为了完成扩展功能重新添加了两个类分别是LineOfCode类与DirectoryList类

1 public class DirectoryList 2 { 3 private static ArrayList directorysList = new ArrayList(); 4 public static ArrayList DirectorysList 5 { 6 get { return DirectoryList.directorysList; } 7 set 8 { 9 DirectoryList.directorysList = value; 10 } 11 } 12 private static ArrayList fileList = new ArrayList(); 13 public static ArrayList FileList 14 { 15 get { return DirectoryList.fileList; } 16 set { DirectoryList.fileList = value; } 17 } 18 public static void GetDirectory(string sourcePath) 19 { 20 if (Directory.Exists(sourcePath)) 21 22 { 23 string[] tmp = Directory.GetFileSystemEntries(sourcePath); 24 for (int i = 0; i < tmp.Length; i++) 25 { 26 if (File.Exists(tmp[i])) 27 { 28 FileList.Add(tmp[i]); 29 } 30 else 31 { 32 if (Directory.GetDirectories(tmp[i]).Length == 0) 33 { 34 DirectorysList.Add(tmp[i]); 35 } 36 } 37 GetDirectory(tmp[i]); 38 } 39 } 40 }
递归处理目录下适合条件的文件

1 public class LineOfCode 2 { 3 public static bool isLine = false; //一行中拥有有效字符时为true,该行可记入代码行数 4 public static bool isCommitLf = false; //注释/*...*/中出现至少一个折行时为true 5 public static int nuines; 6 public static int notlines; 7 public static int LinesOfCode(string filename) 8 { 9 int lines = 0; 10 int nulines=0; 11 int notelines = 0; 12 System.IO.StreamReader sr = System.IO.File.OpenText(filename); 13 string s = sr.ReadToEnd(); 14 sr.Close(); 15 16 for (int i = 0; i < s.Length; i++) 17 { 18 //无效字符 19 if (s[i] == ' ' || s[i] == '\r' || s[i] == '\t') 20 { 21 continue; 22 } 23 //搜索到换行,若该行有有效字符 24 if (s[i] == '\n') 25 { 26 if (isLine) 27 { 28 lines++; 29 isLine = false; 30 } 31 else if(!isLine) 32 nulines++; 33 34 35 continue; 36 } 37 //字符串,占多少行按多少行算 38 if (s[i] == '\"') 39 { 40 while (true) 41 { 42 i++; 43 //如果文件遍历完毕则强行中止 44 if (i >= s.Length) 45 { 46 break; 47 } 48 //再次遇到字符'"'且前方没有或有偶数个'//'时,中止循环并退出 49 if (s[i] == '\"') 50 { 51 int sign = 0, counter = 0; 52 while (true) 53 { 54 sign++; 55 if (i - sign < 0) 56 { 57 break; 58 } 59 else if (s[i - sign] == '\\') 60 { 61 counter++; 62 } 63 else 64 { 65 break; 66 } 67 } 68 if (counter % 2 == 0) 69 { 70 break; 71 } 72 } 73 //字符串中的换行,直接算作一行代码 74 if (s[i] == '\n') 75 { 76 lines++; 77 isLine = true; 78 } 79 } 80 isLine = true; 81 continue; 82 } 83 //遇到形如 /*...*/ 的注释 84 if (s[i] == '/' && i < s.Length - 1) 85 { 86 if (s[i + 1] == '*') 87 { 88 i++; 89 while (true) 90 { 91 i++; 92 //如果文件遍历完毕则强行中止 93 if (i >= s.Length) 94 { 95 break; 96 } 97 if (s[i] == '\n') 98 { 99 notelines++; 100 if (isCommitLf == false) 101 { 102 if (isLine == true) 103 { 104 lines++; 105 isLine = false; 106 } 107 isCommitLf = true; 108 } 109 } 110 if (s[i] == '*' && i < s.Length - 1) 111 { 112 notelines--; 113 if (s[i + 1] == '/') 114 { 115 i++; 116 break; 117 } 118 } 119 } 120 isCommitLf = false; 121 continue; 122 } 123 } 124 //遇到形如 // 的注释 125 if (s[i] == '/' && i < s.Length - 1 && s[i + 1] == '/') 126 { 127 notelines++; 128 if (isLine == true) 129 { 130 lines++; 131 isLine = false; 132 } 133 while (true) 134 { 135 i++; 136 if (i >= s.Length || s[i] == '\n') 137 { 138 break; 139 } 140 } 141 continue; 142 } 143 //该行有了有效字符,算作一行 144 isLine = true; 145 } 146 //最后一行可能没有字符'\n'结尾 147 if (isLine) 148 { 149 lines++; 150 } 151 //return lines; 152 nuines = nulines; 153 notlines = notelines; 154 return lines; 155 156 } 157 } 158 }
统计文件中的代码行 ,空行,注释行
五 测试情况
此次主要对DirectoryList类进行了单元测试
测试用例达到了语句覆盖
六 总结
通过此次项目的结对编程,充分体会到了团队的好处,可以使代码更加完善,可读性还有其他方面更加优秀,并且在结对的过程中通过不断学习可以使我们的一些能力也得到提高.
参考文献:
www.baidu.com