1. 程式人生 > >WordCount(結對程式設計)

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         }
DirectoryList

  遞迴處理目錄下適合條件的檔案

  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 }
LineOfCode

 統計檔案中的程式碼行 ,空行,註釋行

  五 測試情況

此次主要對DirectoryList類進行了單元測試

        測試用例達到了語句覆蓋

    

    

 

  六 總結

通過此次專案的結對程式設計,充分體會到了團隊的好處,可以使程式碼更加完善,可讀性還有其他方面更加優秀,並且在結對的過程中通過不斷學習可以使我們的一些能力也得到提高.

參考文獻:

  www.baidu.com

  C# 語言的規範:簡版, 討論版