C# WC軟件工程做業--花生米

WC我的軟件工程

1. github項目地址

https://github.com/Sranmi/WC.gitgit

2. 項目要求

wc.exe 是一個常見的工具,它能統計文本文件的字符數、單詞數和行數。這個項目要求寫一個命令行程序,模仿已有wc.exe 的功能,並加以擴充,給出某程序設計語言源文件的字符數、單詞數和行數。
實現一個統計程序,它能正確統計程序文件中的字符數、單詞數、行數,以及還具有其餘擴展功能,並可以快速地處理多個文件。github

3.預計耗費時間

4.解題思路

根據題目要求,要實現的內容大體以下:編程

(1) 基本功能
  • -c 統計字符數
  • -w 統計單詞數
  • -l 統計行數c#

    (2)擴展功能
  • -s 遞歸處理目錄下符合條件的文件
  • -a 統計代碼行、空行、註釋行
  • 支持各類文件函數

    (3 )高級功能
  • -x 顯示圖形界面選擇單個文件,並顯示全部統計信息
  • 基本的Windows GUI 程序操做
  • 經過圖形界面展示文件信息工具

5.設計實現過程

  • 創建c# window窗體應用項目
  • 完善窗口界面
  • 編寫兩個類:一個做爲執行流程函數,另中一個用於寫計算函數
    計算字符數 CharCount
    單詞數 WordCount
    行數 LineCount
    代碼行、空行、註釋行 SuperCount
    總執行流程 Operator
    選擇文件 OpenFile
    執行一次後清除數據 CleanData
    用窗口輸出字符串功能以及按鈕點擊功能展現計算結果
    確認計算按鈕 button2_Click
    文件選擇按鈕 button1_Click

6.代碼說明

下面用擴展功能的supercount舉例說明,其餘計算函數大體相同,都須要打開數據流。測試

/// <summary>
        /// 擴展功能:統計代碼行、空行、註釋行
        /// </summary>
        /// <param name="sr"></param>
        /// <param name="notelinecount"></param>
        /// <param name="nulllinecount"></param>
        /// <param name="codelinecount"></param>
        public void SuperCount (string filename, ref int notelinecount,ref int nulllinecount,ref int codelinecount,ref string showdata)
        {
            //文件流打開文件讀取字符
            FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
            StreamReader sr = new StreamReader(fs);
            string line;
            while((line =sr.ReadLine ())!=null )
            {
                line = line.Trim(' ');
                line = line.Trim('\t');
                //空行
                if(line ==""||line .Length <=1)//代碼中單括號爲空行
                {
                    nulllinecount++;
                }
                //註釋行
                else if(line.Substring (0,2)=="//"||line .Substring (1,2)=="//")
                {
                    notelinecount++;
                }
                //代碼行
                else
                {
                    codelinecount++;
                }
            }
            //讀取完需關閉數據流
            sr.Close();
            //在字符串showdata增長計算結果
            showdata += "代碼行:" + codelinecount.ToString() + "\n" + "空行:" + nulllinecount.ToString() + "\n" + "註釋行:" + notelinecount.ToString() + "\n";
        }

打開文件選擇窗口,而且設置爲單選。this

private void OpenFile()
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.InitialDirectory = "D:\\";
            ofd.Filter = "全部文件|*.*|文本文件|*.txt";
            ofd.RestoreDirectory = true;
            ofd.Multiselect = false;//一次只能選擇單個文件
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                filename = ofd.FileName;
            }
        }

每次計算完後要清除數據,不然計算結果會累加上一次的數據。命令行

/// <summary>
        /// 輸出一次數據後 將數據清零
        /// </summary>
        private void ClearData()
        {
            this.charcount = 0;
            this.wordcount = 0;
            this.linecount = 0;
            showdata = null;
        }

界面「肯定「按鈕,執行函數,以字符串的形式窗口輸出數據結果,計算結束清除數據。設計

private void button2_Click(object sender, EventArgs e)
        {
            Operator();
            if (showdata != null)
                MessageBox.Show(showdata);
            ClearData();
        }

參數的判斷流程,當參數爲-x時要跳出循環,由於-x參數只能單獨存在。

/// <summary>
        /// 查詢總操做流程
        /// </summary>
        private void Operator()
        {
            //讀取用戶輸入的文件名和參數(其中多個參數以空格分開)
            filename = textBox2.Text;
            parameter = textBox1.Text.Split(' ');
            foreach (var s in parameter)
            {
                if (s != "-c" && s != "-w" && s != "-l" && s != "-s" && s != "-a" && s != "-x")
                {
                    MessageBox.Show("參數輸入有誤,請從新輸入,注意多參數之間必須用空格隔開");
                    break;
                }
                //參數-x輸出圖形界面選擇文件並讀取文件名
                if (s == "-x")
                {
                    OpenFile();
                }
                //判斷文件是否存在
                if (File.Exists(filename))
                {
                    Function fc = new Function();
                    if (s == "-c" || s == "-x")
                    {
                        fc.CharCount(filename, ref charcount, ref showdata);
                    }
                    if (s == "-w" || s == "-x")
                    {
                        fc.WordCount(filename, ref wordcount, ref showdata);

                    }
                    if (s == "-l" || s == "-x")
                    {
                        fc.LineCount(filename, ref linecount, ref showdata);

                    }
                    if (s == "-a" || s == "-x")
                    {
                        fc.SuperCount(filename, ref notelinecount, ref nulllinecount, ref codelinecount, ref showdata);
                    }
                }
                else
                {
                    MessageBox.Show("文件名不存在,請從新輸入");
                    break;
                }
                //參數爲"-x"時只能單獨使用,跳出循環
                if (s == "-x")
                    break;
            }
        }

7.測試運行

WC窗口界面

測試文本

輸入數據,支持多參數輸入

彈出結果

當輸入係數或者文件目錄有誤

當輸入-x或者點擊三點按鈕時,彈出文件選擇窗口,選擇文件後,全部數據隨即輸出。

計算擴展-a功能

8.項目小結

項目過程當中遇到的困難:
1.項目是要用命令行的形式仍是window窗口應用來實現,最後選擇了視覺上較美觀的window窗口應用。
2.構思基本功能函數結構時,三個函數分開的話,數據流須要分別執行,但函數能夠單獨計算,最後選擇了單獨計算。
3.參數判斷時,循環遇到-x時要跳出,以及要如何實現計算函數的運行,最後以計算函數爲出發點,符合條件的函數即執行。
4.數據結果該如何呈現,彈出另一個窗口相比直接輸出messagebox較難,最後用字符串在messagebox上執行。
5.運行計算第二次時,發現數據呈疊加狀態,即添加一個數據清空函數CleanData。

總結:經過此次我的完成的項目,瞭解了我的軟件工程的設計流程,以及編程過程遇到的問題要在實踐中逐步完善。軟件工程每一個流程的預計時間和設計,到具體的操做和實現,經過查找相關資料,對我此次的軟件工程起到了很大的做用。

相關文章
相關標籤/搜索