1. 程式人生 > >軟體工程第一次作業(WC)

軟體工程第一次作業(WC)

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#語法花費了太多時間,導致沒有時間學習如何進行單元測試。完成專案後必須花費時間把單元測試做了,為下次的專案做充足的準備,不能在把絕大部分時間用來學習上了。