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

WordCount(結對)

合作者: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.運算子、空行測試,發現空行算作了一個單詞

 

擴充套件功能,測試正常

四、效能測試

  

通過顯示後臺執行時間發現單一命令的執行逐漸加快 ,三條命令同時執行的時間也遠小於分別執行的時間相加。於是在命令執行的基礎上加上文字的輸出,發現文字寫入用時最多。

 

再經過兩次測試發現程式有後臺儲存功能,記錄了執行的資訊,第二次執行時讀取了執行過的結果,所以時間加快了很多。

五、結論

 本次作業是在上次作業的基礎上完成的,不僅實現了拓展功能,更是讓我們兩個人協作完成,通過這次作業讓我學會了如何與他人更好地協作完成任務,為我以後更好地融入工作團隊打下了基礎