1. 程式人生 > >WordCount軟體測試第三次作業

WordCount軟體測試第三次作業

一、專案簡介

  原始碼地址:https://gitee.com/rickeyqi/WordCount.git

       專案需求:對程式設計語言原始檔統計字元數、單詞數、行數,統計結果以指定格式輸出到預設檔案中,可執行程式命名為:wc.exe。

       該程式處理使用者需求的模式為:wc.exe [parameter] [input_file_name],儲存統計結果的檔案預設為result.txt,放在與wc.exe相同的目錄下。

       wc.exe -c file.c     //返回檔案 file.c 的字元數

 

       wc.exe -w file.c     //返回檔案 file.c 的單詞總數

 

       wc.exe -l file.c     //返回檔案 file.c 的總行數

 

       wc.exe -o outputFile.txt     //將結果輸出到指定檔案outputFile.txt

       注:  空格,水平製表符,換行符,均算字元。

                由空格或逗號分割開的都視為單詞,且不做單詞的有效性校驗,例如:thi#,that視為用逗號隔開的2個單詞。

                -c, -w, -l引數可以共用同一個輸入檔案,形如:wc.exe –w –c file.c 。

                -o 必須與檔名同時使用,且輸出檔案必須緊跟在-o引數後面,不允許單獨使用-o引數。 

       解題思路:該需求主要是對檔案進行操作,包括檔案的讀取、寫入、建立等,所以需要熟知檔案的基本操作,查閱相關資料也應向檔案操作方面靠攏。

                         資料統計和處理等作為資料基本操作不需要過多的查閱和修改。

       程式碼思路:要實現上述四個功能,則需要四個獨立的方法來分別實現,主函式根據使用者輸入內容,識別使用者操作型別和檔名稱,再分別對各個操作進行處理。

                         -o操作不能獨立輸入,必須有處理結果才能執行,因此使用者輸入一條命令之後,程式不能立即結束。

二、專案實現

  針對四個功能需求,設計了以下四個方法:

 

//返回檔案字元數
        public static int CodeCount(string FileName)
        {
            int count = 0;
            char[] Code = { ' ', ',', '%', '~', '!', '#', '^', '*', '(', ')', '\t' };

            //讀取檔案
            string[] s = File.ReadAllLines(@"..\Debug\" + FileName, Encoding.Default);
            foreach (string line in s)     //行數
            {
                foreach (Char a in line)   //每行字元數
                {
                    foreach (char b in Code)
                    {
                        if (a == b)
                            count++;
                    }
                }

            }

            return count;
        }

 

//返回檔案單詞數
        public static int WordCount(string FileName)
        {
            int sum = 0;

            //讀取檔案
            string[] s = File.ReadAllLines(@"..\Debug\" + FileName, Encoding.Default);
            foreach (string line in s)
            {
                if (line != null)
                {
                    foreach (Char a in line)
                    {
                        if (a == ' ' || a == ',')
                            sum++;
                    }
                    sum++;
                }
            }
            return sum;
        }
//返回檔案總行數
        public static int LineCount(string FileName)
        {
            //讀取檔案
            string[] s = File.ReadAllLines(@"..\Debug\" + FileName, Encoding.Default);

            return s.Length;

        }
 //將結果輸出到指定檔案
        public static void OutPut(string ParmeterResult, string FileName)
        {
            string[] parResult = { ParmeterResult };

            if (!File.Exists(@"..\Debug\" + FileName))
            {
                //如果檔案不存在,則先新建檔案
                FileStream fs = new FileStream(@"..\Debug\" + FileName, FileMode.Create, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);
                sw.WriteLine(parResult);
                sw.Close();
            }
            else
            {
                FileStream fs = new FileStream(@"..\Debug\" + FileName, FileMode.Append, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);
                sw.WriteLine(parResult);
                sw.Close();
            }

        }

  注:為方便檢視程式處理結果,將資料寫入檔案時,採用的是向後新增的寫入方式,而不是覆蓋寫入方式

 

  Main函式呼叫:

static void Main(string[] args)
        {
            string FileName;      //檔名稱
            string UserWrite;     //使用者輸入內容
            string[] ParName = new string[5];       //操作名稱
            int[] ParmeterResult = new int[5];   //檔案操作的返回結果

            UserWrite = Console.ReadLine();

            string[] AllFileName = new string[50]; //儲存所有輸入過的檔名
            string[] AllParName = new string[50];  //儲存所有操作名
            int i = 0;

            while (UserWrite != "###")
            {
                string[] Parameter = UserWrite.Split(' ');   //檔案執行操作型別

                FileName = Parameter[Parameter.Length - 1];
                AllFileName[i] = FileName;

                for (int j = 0; j < Parameter.Length - 1; j++)
                {

                    if (Parameter[j] == "-c")       //得到字元總數
                    {
                        ParmeterResult[j] = CodeCount(FileName);
                        ParName[j] = "字元數";
                    }
                    else if (Parameter[j] == "-w")     //得到單詞總數
                    {
                        ParmeterResult[j] = WordCount(FileName);
                        ParName[j] = "單詞數";
                    }
                    else if (Parameter[j] == "-l")     //得到總行數
                    {
                        ParmeterResult[j] = LineCount(FileName);
                        ParName[j] = "行數";
                    }
                    else if (Parameter[j] == "-o")     //將結果寫入檔案
                    {
                        for(int k=0;k<=Parameter.Length-1;k++)
                        {
                            OutPut(AllFileName[i-1] + "," + ParName[k] + ":" + ParmeterResult[k], AllFileName[i]);
                            Console.WriteLine(AllFileName[i-1] + "," + ParName[k] + ":" + ParmeterResult[k]);
                        }
                        continue;
                    }
                    Console.WriteLine(FileName + "," + ParName[j] + ":" + ParmeterResult[j]);
                }
                UserWrite = Console.ReadLine();
                i++;
            }

        }

三、專案測試

  目標檔案內容:

  

測試1:

 

 

測試2:

測試3:

 

測試4:

測試5:

測試6:

測試7:

測試8:

 

 

 

四、專案總結

     專案完成了所有基本要求功能,但是程式碼的健壯性有待提高,沒有針對多種輸入進行正確的處理。