WordCount(結對)
阿新 • • 發佈:2018-10-31
合作者:201631062314,201631062214
碼雲地址:https://gitee.com/dsjyun/Word-Count-three
一、程式碼互審:
第一次都是實現了基本功能,沒有完成擴充套件功能,這次還有個高階功能,於是討論了後續功能如何實現。
我們的意見基本一致,認為高階功能需要窗體來實現比較簡單,於是決定用C#語言來實現。
二、部分程式碼
using System; using System.Diagnostics; namespace WordCount { class program {主函式,效能測試static void Main(string[] args) { Console.Write("wc.exe -c file.c\t返回檔案 file.c 的字元數\n" + "wc.exe -w file.c\t返回檔案 file.c 的單詞總數\n" + "wc.exe -l file.c\t返回檔案 file.c 的總行數\n" + "wc.exe -a file.c\t返回更復雜的資料(程式碼行/空行/註釋行)\n" + "wc.exe -o output.txt\t將結果輸出到指定檔案output.txt\n" + "wc.exe -e stopList.txt\t停用詞表,統計檔案單詞總數時,不統計該表中的單詞\n" + "wc.exe -s\t迴圈執行所有.c檔案\n"); Wordcount wc = new Wordcount(); while (true) { Console.WriteLine("--------------------------"); Console.WriteLine("輸入命令:"); string str = Console.ReadLine(); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 開始監視程式碼執行時間 wc.ExecutiveCommand(str); stopwatch.Stop(); // 停止監視 TimeSpan timespan = stopwatch.Elapsed; // 獲取當前例項測量得出的總時間 string hours = timespan.TotalHours.ToString("#0.00000000 "); // 總小時 string minutes = timespan.TotalMinutes.ToString("#0.00000000 "); // 總分鐘 string seconds = timespan.TotalSeconds.ToString("#0.00000000 "); // 總秒數 string milliseconds = timespan.TotalMilliseconds.ToString("#0.00000000 "); // 總毫秒數 Console.Write("執行時間 "+timespan); } } } }
using System; using System.IO; using System.Text; using System.Diagnostics; namespace WordCount { class Wordcount { int charNum = 0; int wordNum = 0; int lineNum = 0; string strResult = ""; string[] stopWord; public void ExecutiveCommand(string strCommand) { string[] strOperate = strCommand.Split(' '); string fileName = "file.c";//預設操作檔案 //獲取.c操作檔案 for (int i = 0; i < strOperate.Length; ++i) { if (strOperate[i] != "-c" && strOperate[i] != "-w" && strOperate[i] != "-l" && strOperate[i] != "-a" && strOperate[i] != "-o" && strOperate[i] != "-e" && strOperate[i] != "-s" && System.IO.Path.GetExtension(strOperate[i]).Equals(".c")) { fileName = strOperate[i]; } } //迴圈操作 for (int i = 0; i < strOperate.Length; ++i) { if (strOperate[i].Equals("-c")) { charNum = GetCharNum(fileName); SaveResult(fileName + ",字元數:" + charNum); } else if (strOperate[i].Equals("-w")) { wordNum = GetWordNum(fileName); SaveResult(fileName + ",單詞數:" + wordNum); } else if (strOperate[i].Equals("-l")) { lineNum = GetRowNum(fileName); SaveResult(fileName + ",行數:" + lineNum); } else if (strOperate[i].Equals("-a")) { SaveResult(fileName + ",程式碼行數:" + GetCodeRowNum(fileName)); SaveResult(fileName + ",空白行數:" + GetBlankRowNum(fileName)); SaveResult(fileName + ",註釋行數:" + GetNoteRowNum(fileName)); } else if (strOperate[i].Equals("-o")) { OutputResult(strOperate[i + 1]); } else if (strOperate[i].Equals("-e")) { GetStopList(strOperate[i + 1]); } else if (strOperate[i].Equals("-s")) { ExeAllFile(); } } } //獲取字元數 public int GetCharNum(string fileName) { // 開啟檔案 FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); // 讀取檔案的 byte[] byte[] bytes = new byte[fileStream.Length]; fileStream.Read(bytes, 0, bytes.Length); fileStream.Close(); string strfile = Encoding.UTF8.GetString(bytes);// 位元組向字串轉化 return strfile.Length - GetRowNum(fileName) + 1;//換行符佔兩個字元 } //獲取單詞數 public int GetWordNum(string fileName) { // 開啟檔案 FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); // 讀取檔案的 byte[] byte[] bytes = new byte[fileStream.Length]; fileStream.Read(bytes, 0, bytes.Length); fileStream.Close(); string strfile = Encoding.UTF8.GetString(bytes);// 位元組向字串轉化 int wNum = 0; string strword = ""; strfile += '\n';//在最後新增換行符 for (int i = 1; i < strfile.Length; ++i) { if (strfile[i].Equals(' ') || strfile[i].Equals(',') || strfile[i].Equals('\n')) { if (strfile[i - 1].Equals(' ') == false && strfile[i - 1].Equals(',') == false && strfile[i - 1].Equals('\n') == false) { ++wNum; //停用詞 if (stopWord != null) { strword = strword.ToLower(); for (int j = 0; j < stopWord.Length; ++j) { if (strword == stopWord[j]) { --wNum; } } } strword = ""; } } else { strword += strfile[i];//記錄單詞 } } return wNum; } //獲取行數 public int GetRowNum(string fileName) { StreamReader sr = new StreamReader(fileName, Encoding.Default); int rNum = 0; while (sr.ReadLine() != null) { ++rNum; } return rNum; } //獲取程式碼行/空行/註釋行 public int GetCodeRowNum(string fileName) { StreamReader sr = new StreamReader(fileName, Encoding.Default); string str; int codeNum = 0; int noteNum = 0; int blankNum = 0; while ((str = sr.ReadLine()) != null) { noteNum = 0; blankNum = 0; for (int i = 0; i < str.Length; ++i) { if (i < str.Length - 1 && str[i].Equals('/') && str[i + 1].Equals('/')) {//註釋點 noteNum = i; break; } if (str[i].Equals(' ') || str[i].Equals('\t') || str[i].Equals('{') || str[i].Equals('}')) {//空白數 ++blankNum; } } if (noteNum != 0 && noteNum > blankNum) { ++codeNum; } else if (noteNum == 0 && blankNum < str.Length) { ++codeNum; } } return codeNum; } public int GetBlankRowNum(string fileName) { StreamReader sr = new StreamReader(fileName, Encoding.Default); string str; int num = 0; int noteNum = 0; int blankNum = 0; while ((str = sr.ReadLine()) != null) { noteNum = 0; blankNum = 0; for (int i = 0; i < str.Length; ++i) { if (i < str.Length - 1 && str[i].Equals('/') && str[i + 1].Equals('/')) {//註釋點 noteNum = i; break; } if (str[i].Equals(' ') || str[i].Equals('\t') || str[i].Equals('{') || str[i].Equals('}')) {//空白數 ++blankNum; } } if (noteNum != 0 && noteNum == blankNum) { ++num; } else if (str.Length == 0 || noteNum == 0 && blankNum == str.Length) { ++num; } } return num; } public int GetNoteRowNum(string fileName) { StreamReader sr = new StreamReader(fileName, Encoding.Default); string str; int noteNum = 0; while ((str = sr.ReadLine()) != null) { for (int i = 0; i < str.Length; ++i) { if (i < str.Length - 1 && str[i].Equals('/') && str[i + 1].Equals('/')) {//註釋點 ++noteNum; break; } } } return noteNum; } //寫入結果 public void OutputResult(string fileName) { FileStream fileStream = new FileStream(fileName, FileMode.Create); StreamWriter sw = new StreamWriter(fileStream); //開始寫入 sw.WriteLine(strResult); //清空緩衝區 sw.Flush(); //關閉流 sw.Close(); fileStream.Close(); } //輸出並存結果 public void SaveResult(string str) { Console.WriteLine(str); strResult += str + "\r\n"; } //獲取停用單詞 public void GetStopList(string fileName) { StreamReader sr = new StreamReader(fileName, Encoding.Default); string strfile = sr.ReadToEnd(); strfile = strfile.ToLower(); stopWord = strfile.Split(' '); for (int i = 0; i < stopWord.Length; ++i) { Console.Write(stopWord[i] + "\t"); } Console.WriteLine(); } //迴圈處理目錄下所有.c檔案 public void ExeAllFile() { string rootPath = Directory.GetCurrentDirectory();//當前路徑 DirectoryInfo sfolder = new DirectoryInfo(rootPath); foreach (FileInfo file in sfolder.GetFiles("*.c")) { SaveResult("\n"); SaveResult(file.Name + ",字元數:" + GetCharNum(file.Name)); SaveResult(file.Name + ",單詞數:" + GetWordNum(file.Name)); SaveResult(file.Name + ",總行數:" + GetRowNum(file.Name)); SaveResult(file.Name + ",程式碼行數:" + GetCodeRowNum(file.Name)); SaveResult(file.Name + ",空白行數:" + GetBlankRowNum(file.Name)); SaveResult(file.Name + ",註釋行數:" + GetNoteRowNum(file.Name)); } } } }主程式
三、基本功能與擴充套件功能的測試:
1.數字、單詞、標點符號測試正常
2.運算子、空行測試,發現空行算作了一個單詞
擴充套件功能,測試正常
四、效能測試
通過顯示後臺執行時間發現單一命令的執行逐漸加快 ,三條命令同時執行的時間也遠小於分別執行的時間相加。於是在命令執行的基礎上加上文字的輸出,發現文字寫入用時最多。
再經過兩次測試發現程式有後臺儲存功能,記錄了執行的資訊,第二次執行時讀取了執行過的結果,所以時間加快了很多。
五、結論
本次作業是在上次作業的基礎上完成的,不僅實現了拓展功能,更是讓我們兩個人協作完成,通過這次作業讓我學會了如何與他人更好地協作完成任務,為我以後更好地融入工作團隊打下了基礎