一、源代码地址
https://github.com/EzioBBD/WordCount
二、个人开发流程
三、解题思路
1.程序采用C#语言,因为C#有着丰富的类库,且对于字符串操作简单。
2.程序的核心是用正则表达式做格式控制,解决了很多棘手的问题。(详见http://www.runoob.com/regexp/regexp-syntax.html)
3.对命令行语言逐条分析,接着对文件进行读取,写入等操作
4.大量使用LIst<>泛型容器,存取中间过程要保存的信息
四、关键代码实现
1.-c -w -l -a功能的实现
1 //获取字符数 2 static string GetCharNum(string fileName) 3 { 4 string text = File.ReadAllText(fileName); 5 return fileName + ",字符数:" + text.Length.ToString() + "\r\n"; 6 } 7 //获取单词数 8 static string GetWordNum(string fileName) 9 { 10 string[] text = File.ReadAllLines(fileName); 11 int wordNum = 0; 12 foreach (string line in text) 13 { 14 if (Regex.IsMatch(line, @"^\s*$")) 15 continue; 16 string removed = Regex.Replace(line, @"^\s*|\s*$", ""); 17 string[] words = removed.Split(new char[] { ' ', ','}); 18 19 if (stopList.Count == 0) 20 wordNum += words.Length; 21 else 22 foreach (string word in words) 23 if (!stopList.Contains(word)) 24 ++wordNum; 25 } 26 return fileName + ",单词数:" + wordNum.ToString() + "\r\n"; 27 } 28 //获取行数 29 static string GetLineNum(string fileName) 30 { 31 string[] text = File.ReadAllLines(fileName); 32 return fileName + ",行数:" + text.Length.ToString() + "\r\n"; 33 } 34 //获取代码行/空行/注释行 35 static string GetMoreInfo(string fileName) 36 { 37 int codeLine = 0, blankLine = 0, noteLine = 0; 38 string[] text = File.ReadAllLines(fileName); 39 foreach (string line in text) 40 { 41 if (Regex.IsMatch(line, @"^\s*{?\s*$")) 42 ++blankLine; 43 else if (Regex.IsMatch(line, @"^}?//")) 44 ++noteLine; 45 else 46 ++codeLine; 47 } 48 return fileName + ",代码行/空行/注释行:" + codeLine.ToString() + "/" 49 + blankLine.ToString() + "/" + noteLine.ToString() + "\r\n"; 50 }
2.递归处理目录下的所有符合的文件
1 static void DisposeAllFile(string path, string pattern) 2 { 3 DirectoryInfo root = new DirectoryInfo(path); 4 foreach(FileInfo file in root.GetFiles()) 5 if (Regex.IsMatch(file.Name, pattern)) 6 files.Add(file.FullName); 7 foreach (DirectoryInfo directory in root.GetDirectories()) 8 DisposeAllFile(directory.FullName, pattern); 9 }
五、测试用例实现
1.基本功能测试
例如: wc.exe -c -w -l test.c -o output.txt
wc.exe -c test.c
wc.exe -w -l test.c
wc.exe -w -l -c test.c
wc.exe -l -w test.c
2.扩展功能测试
例如: wc.exe -s *.c
wc.exe -a *.c
wc.exe -s -w -a *.c
wc.exe -s -l -a *.c -e stoplist.txt
wc.exe -s -c -l -w -a *.c -e stoplist.txt -o output.txt
3.导致程序高风险的地方
a.输入一个不存在的文件名
b.-e和-o单独存在,不关联任何文件,例如:wc.exe -s -w -a *.c -e
六、参考文献
正则表达式的使用:http://www.runoob.com/regexp/regexp-syntax.html