1. 程式人生 > >結對編程-wc.exe

結對編程-wc.exe

src info 能夠 程序 pat false list pen 空格

學號:

   201631062215201631062116

項目地址:https://gitee.com/nasi96/codes/0oh63ispudrec8zf49tnq63

項目介紹

本次是在滴一次WordCount的基礎上,采取結對編程方式進行擴展功能的編寫。

在擴展功能中,用戶通過輸入命令行的方式與程序實現交互。並且在基本功能的基礎上新增了2個命令參數實現統計所有文件名是txt文件的字符數與單詞數的統計。實現文件空行數、代碼行數、註釋行數以及字符數和單詞數的統計。

項目要求

wc.exe -s //遞歸處理目錄下符合條件的文件

wc.exe -a file.c //返回更復雜的數據(代碼行

/ 空行 / 註釋行)

wc.exe -e stopList.txt // 停用詞表,統計文件單詞總數時,不統計該表中的單詞

[file_name]: 文件或目錄名,可以處理一般通配符。

其中

代碼行:本行包括多於一個字符的代碼。

空行:本行全部是空格或格式控制字符,如果包括代碼,則只有不超過一個可顯示的字符,例如{”。

註釋行:本行不是代碼行,並且本行包括註釋。一個有趣的例子是有些程序員會在單字符後面加註釋:

}//註釋在這種情況下,這一行屬於註釋行。

編程情況

1 命名方式不規範

2 代碼註釋過少,少於百分之20

3 代碼可讀性較差

編程情況與說明

本次為了完成擴展功能重新添加了兩個類分別是LineOfCode類與DirectoryList

技術分享圖片
public class DirectoryList
    {
        private static ArrayList directorysList = new ArrayList();
        public static ArrayList DirectorysList
        {
            get { return DirectoryList.directorysList; }
            set
            {
                DirectoryList.directorysList 
= value; } } private static ArrayList fileList = new ArrayList(); public static ArrayList FileList { get { return DirectoryList.fileList; } set { DirectoryList.fileList = value; } } public static void GetDirectory(string sourcePath) { if (Directory.Exists(sourcePath)) { string[] tmp = Directory.GetFileSystemEntries(sourcePath); for (int i = 0; i < tmp.Length; i++) { if (File.Exists(tmp[i])) { FileList.Add(tmp[i]); } else { if (Directory.GetDirectories(tmp[i]).Length == 0) { DirectorysList.Add(tmp[i]); } } GetDirectory(tmp[i]); } } } DirectoryList
DirectoryList

遞歸處理目錄下適合條件的文件

技術分享圖片
public  class LineOfCode
    {
        public static bool isLine = false;  //一行中擁有有效字符時為true,該行可記入代碼行數
        public static bool isCommitLf = false; //註釋/*...*/中出現至少一個折行時為true
        public static int nuines;
        public static int notlines;
        public static int LinesOfCode(string filename)
        {
            int lines = 0;
            int nulines=0;
            int notelines = 0;
            System.IO.StreamReader sr = System.IO.File.OpenText(filename);
            string s = sr.ReadToEnd();
            sr.Close();

            for (int i = 0; i < s.Length; i++)
            {
                //無效字符
                if (s[i] ==   || s[i] == \r || s[i] == \t)
                {
                    continue;
                }
                //搜索到換行,若該行有有效字符
                if (s[i] == \n)
                {
                    if (isLine)
                    {
                        lines++;
                        isLine = false;
                    }
                    else if(!isLine)
                           nulines++;


                    continue;
                }
                //字符串,占多少行按多少行算
                if (s[i] == \")
                {
                    while (true)
                    {
                        i++;
                        //如果文件遍歷完畢則強行中止
                        if (i >= s.Length)
                        {
                            break;
                        }
                        //再次遇到字符‘"‘且前方沒有或有偶數個‘//‘時,中止循環並退出
                        if (s[i] == \")
                        {
                            int sign = 0, counter = 0;
                            while (true)
                            {
                                sign++;
                                if (i - sign < 0)
                                {
                                    break;
                                }
                                else if (s[i - sign] == \\)
                                {
                                    counter++;
                                }
                                else
                                {
                                    break;
                                }
                            }
                            if (counter % 2 == 0)
                            {
                                break;
                            }
                        }
                        //字符串中的換行,直接算作一行代碼
                        if (s[i] == \n)
                        {
                            lines++;
                            isLine = true;
                        }
                    }
                    isLine = true;
                    continue;
                }
                //遇到形如 /*...*/ 的註釋
                if (s[i] == / && i < s.Length - 1)
                {
                    if (s[i + 1] == *)
                    {
                        i++;
                        while (true)
                        {
                            i++;
                            //如果文件遍歷完畢則強行中止
                            if (i >= s.Length)
                            {
                                break;
                            }
                            if (s[i] == \n)
                            { 
                                    notelines++;
                                if (isCommitLf == false)
                                {
                                    if (isLine == true)
                                    {
                                        lines++;
                                        isLine = false;
                                    }
                                    isCommitLf = true;
                                }
                            }
                            if (s[i] == * && i < s.Length - 1)
                            {
                                notelines--;
                                if (s[i + 1] == /)
                                {
                                    i++;
                                    break;
                                }
                            }
                        }
                        isCommitLf = false;
                        continue;
                    }
                }
                //遇到形如 // 的註釋
                if (s[i] == / && i < s.Length - 1 && s[i + 1] == /)
                {
                    notelines++;
                    if (isLine == true)
                    {
                        lines++;
                        isLine = false;
                    }
                    while (true)
                    {
                        i++;
                        if (i >= s.Length || s[i] == \n)
                        {
                            break;
                        }
                    }
                    continue;
                }
                //該行有了有效字符,算作一行
                isLine = true;
            }
            //最後一行可能沒有字符‘\n‘結尾
            if (isLine)
            {
                lines++;
            }
            //return lines;
            nuines = nulines;
            notlines = notelines;
            return lines;
            
        }
    }
}

LineOfCode
LineOfCode

統計文件中的代碼行 ,空行,註釋行

測試情況

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

技術分享圖片

測試用例達到了語句覆蓋

技術分享圖片

技術分享圖片

六、 總結

  通過本次項目中對wc.exe的結對編程,我更加知道了團隊合作的重要性,不只是在編程方面,更是在項目的其他方面,各方面的協作能夠節省大量的時間,以及可以使得代碼更加的完整,錯誤率被大大地減少,使得代碼更加的完善,可讀性也更加優秀。並且這樣的結對編程,更加符合標準的項目開發過程,開發過程中的錯誤可以及時的被發現然後解決,而且不會影響日後的編程。很棒!

參考文獻:

  www.baidu.com

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

結對編程-wc.exe