Github項目地址:https://github.com/3116005131/3116005131.git PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘) Planning 計劃 · Estimate · 估計這個任務需要多少時 ...
Github項目地址:https://github.com/3116005131/3116005131.git
PSP2.1 |
Personal Software Process Stages |
預估耗時(分鐘) |
實際耗時(分鐘) |
Planning |
計劃 |
20 | 15 |
· Estimate |
· 估計這個任務需要多少時間 |
5 | 5 |
Development |
開發 |
660 | 1045 |
· Analysis |
· 需求分析 (包括學習新技術) |
300 | 660 |
· Design Spec |
· 生成設計文檔 |
100 | 120 |
· Design Review |
· 設計覆審 (和同事審核設計文檔) |
20 | 15 |
· Coding Standard |
· 代碼規範 (為目前的開發制定合適的規範) |
10 | 30 |
· Design |
· 具體設計 |
60 | 20 |
· Coding |
· 具體編碼 |
120 | 180 |
· Code Review |
· 代碼覆審 |
20 | 10 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
30 | 10 |
Reporting |
報告 |
100 | 120 |
· Test Report |
· 測試報告 |
30 | 40 |
· Size Measurement |
· 計算工作量 |
30 | 40 |
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出過程改進計劃 |
40 | 40 |
total |
合計 |
780 | 1180 |
解題思路:統計文件的字元數量,首先我要學慣用C#讀取文件,因為之前只是做過處理基本數據類型的一些類和方法。所以估計在這方面的學習要花費大量的時間。學習的方法是先,上網查找,在其他人代碼中,當需要調用文件的讀寫操作,他們是用什麼函數,方法實現的。發現代碼中出現FileStream類,然後就查找書本---《C#程式設計教程》,系統的學習FileStream類,以及與其一起使用的StreamReader類。學習後發現。由於只翻閱了一本參考書籍就找到了需要學習的內容,並有詳細的介紹,故能快速的掌握,節省了不少學習的時間。在開始編程時,又遇到了第二個問題,設計文檔雖然寫好,由於太久沒使用C#語言編程,但是不斷的出現語法錯誤。導致不得不停下來,把C#的面向對象編程部分開完,並開了一個新建的命令行視窗項目來練習C#的語法。編譯成功後,完成了三個基本功能,打算做下一步的單元測試,可發現單元測試必須是公共類或公共方法,而我把代碼全都寫在了main函數中,為實現單元測試不得,把代碼寫到類wc中。
設計實現過程:由於統計字元器,還算是邏輯簡單的程式,所以打算只用一個公共類完成功能,使用預設的創造函數,輸入函數,處理函數,輸出函數。為了使代碼更簡潔,加多了一個執行函數調用另外三個函數。使main函數中更簡潔。由於邏輯都比較簡單,基本都是使用if的二分支選擇語句,所以沒有畫流程圖。
代碼說明
public class wc { string path; //需統計文件的路徑 char[] types = { 'c', 'C', 'w', 'W', 'l', 'L' }; //目前所能統計的類型(字元,單詞,行數) int n; //統計結果 char[] type; //當前統計的類型 public void NCount() //統計方法 { GetMessage(); Count(); Show(); } public void GetMessage() //輸入信息 { ...... } public void Count() //統計數量 { ...... } public void Show() //輸出結果 { ...... } }
輸入函數
1 public void GetMessage() //輸入信息 2 { 3 Console.Write("WC.exe -"); 4 string Message = Console.ReadLine(); 5 string[] CategoryInfomation = Message.Split(' '); 6 path = CategoryInfomation[1]; 7 type = CategoryInfomation[0].ToCharArray(); 8 }
處理函數
1 public void Count() //統計數量 2 { 3 int c=0, w=0, l=0;//字元數,單詞數,行數 4 int WFlag=0; //單詞標識符 5 FileStream fs = null; 6 StreamReader reader = null; 7 try 8 { 9 fs = new FileStream(path, FileMode.Open, FileAccess.Read); 10 reader = new StreamReader(fs); 11 reader.BaseStream.Seek(0, SeekOrigin.Begin); 12 int i = reader.Read(); 13 while (i!=-1) 14 { 15 c++; 16 if ((i<=90&&i>=65)||(i>=97&&i<=122)) 17 { 18 if (WFlag == 0) 19 { 20 w++; 21 WFlag = 1; 22 } 23 24 } 25 else WFlag = 0; 26 char character = (char)i; 27 if (character == '\n') 28 { 29 l++; 30 } 31 i = reader.Read(); 32 } 33 } 34 catch (Exception) //path輸入有誤 35 { 36 Console.WriteLine("輸入的地址有誤,找不到該文件"); 37 } 38 finally 39 { 40 if(reader!=null)reader.Close(); 41 if(fs!=null)fs.Close(); 42 } 43 if (type[0] == 'c' || type[0] == 'C') 44 { 45 n = c; 46 } 47 else if (type[0] == 'w' || type[0] == 'W') 48 { 49 n = w; 50 } 51 else if (type[0] == 'l' || type[0] == 'L') 52 { 53 n = l; 54 } 55 }
輸出函數
1 public void Show() //輸出結果 2 { 3 if (type[0] == 'c' || type[0] == 'C') 4 { 5 Console.WriteLine("字元數為{0}", n); 6 } 7 else if (type[0] == 'w' || type[0] == 'W') 8 { 9 Console.WriteLine("單詞數為{0}", n); 10 } 11 else if(type[0] == 'l' || type[0] == 'L') 12 { 13 Console.WriteLine("行數為{0}", n); 14 } 15 else 16 { 17 Console.WriteLine("Word count does not support this type of statistics."); //輸入的參數有誤,n=0 18 } 19 }
測試運行
項目小結:這次能成功完成作業,幸好因為WC需要實現的基本功能邏輯簡單,只要掌握基本的語法就能完成。也多虧所有使用到的類的使用都能在一本書中全部找到,不然恐怕是完成不了項目。由於學習C#語法花費了太多時間,導致沒有時間學習如何進行單元測試。完成項目後必須花費時間把單元測試做了,為下次的項目做充足的準備,不能在把絕大部分時間用來學習上了。