结对编程-wc.exe

 学号:

   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# 语言的规范:简版, 讨论版

 

posted @ 2018-10-21 20:25  那厮  阅读(110)  评论(0编辑  收藏  举报