第三次作业WordCount拓展

(1)合作者:201631062323徐建敏        201631062223 林布尔

(2)代码地址:https://gitee.com/xjm861710023/wordcount_development

(3)本次作业链接地址:https://edu.cnblogs.com/campus/xnsy/2018softwaretest2398/homework/2187

一、拓展代码

(1)主函数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace wc
{
    class Program
    {
        static void Main(string[] args)
        {
            string msg = "";    //输入字符串
            WC wordcount = new WC(); //引用WC类
            Char[] c = {' '};//分隔符
            while (msg != "exit")
            {
                msg = Console.ReadLine();    //输入操作字符串
                string[] msgSplit = msg.Split(c, StringSplitOptions.RemoveEmptyEntries);//将字符串按空格分割
                wordcount.Operator(msgSplit);
            }
        }
    }
}

(2)WC类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace wc
{
    public class WC
    {
        public string filename;    // 文件名
        public string[] filenames;   //多个文件名
        public string stopwordfile;    //停用词文件名
        public string[] msgSplit; //所有参数数组
        public string outfile;   //输出文件名
        public string str;       //输出字符串
        public int iccount;      // 字符数
        public int iwcount;      // 单词数
        public int ilcount;      // 总行数
        public int inulllinecount;  //空行数
        public int icodelinecount;  //代码行数
        public int inotelinecount;  //注释行数
        //引入输入字符串,并对字符串进行处理
        public void Operator(string[] msgSplit)
        {
            this.msgSplit = msgSplit;    //引入操作数组
            int Length;
            Length = msgSplit.Length;
            foreach (string s in msgSplit)
            {
                if (s == "-e")
                {
                    Length = Length - 2;
                }
                else if (s == "-o")
                {
                    Length = Length - 2;
                }
            }
            this.filename = msgSplit[Length - 1];//获取文件名
            if (msgSplit[0] == "wc.exe")
            {
                foreach (string s in msgSplit)
                {
                    if (s == "-s")
                    {
                        //获取所有后缀名符合的文件
                        string fileDir = Environment.CurrentDirectory;
                        filenames = Directory.GetFiles(fileDir, filename);
                    }
                    else if (s == "-e")
                    {
                        //获取停用词表文件
                        for (int i = 0; i < msgSplit.Length; i++)
                        {
                            if (msgSplit[i] == "-e")
                            {
                                stopwordfile = msgSplit[i + 1];
                            }
                        }
                    }
                }
                if (filenames == null)
                {
                    SuperCount(filename);
                    BaseCount(filename, stopwordfile);
                    Display(filename);
                }
                else
                {
                    for (int i = 0; i < filenames.Length; i++)
                    {
                        SuperCount(filenames[i]);
                        BaseCount(filenames[i], stopwordfile);
                        Display(filenames[i]);
                    }
                }
            }
            else
            {
                Console.WriteLine("输入指令不存在!请重新输入。。。");
            }
        }
        // 统计基本信息:字符数 单词数 行数
        public void BaseCount(string filename,string stopwordfile)
        {
            try
            {
                // 打开文件
                FileStream file = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
                StreamReader sr = new StreamReader(file);
                int nChar;
                int charcount = 0;
                int wordcount = 0;
                int linecount = 0;
                //定义一个字符数组
                char[] symbol = { ' ', '\t','\r', ',', '.', '?', '!', ':', ';', '\'', '\"', '\n', '{', '}', '(', ')', '<','>','+' ,'-','*', '='};
                while ((nChar = sr.Read()) != -1)
                {
                    charcount++;     // 统计字符数
                    if (nChar == '\n')
                    {
                        linecount++; // 统计行数
                    }
                }
                sr.Close();
                file = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
                sr = new StreamReader(file);
                string words = sr.ReadToEnd();
                string[] word = words.Split(symbol, StringSplitOptions.RemoveEmptyEntries);//将文件内所有单词分割
                if (stopwordfile != null)
                {
                    //有停用词表
                    FileStream stopfile = new FileStream(stopwordfile, FileMode.Open, FileAccess.Read, FileShare.Read);
                    StreamReader stopsr = new StreamReader(stopfile);
                    string stopwords = stopsr.ReadToEnd();
                    string[] stopword = stopwords.Split(symbol, StringSplitOptions.RemoveEmptyEntries);//将停用词表内所有单词分割
                    foreach (string s in word)
                    {
                        foreach (string stop in stopword)
                        {
                            if (s != stop)
                            {
                                wordcount++;//统计单词数
                            }
                        }
                    }
                    stopsr.Close();
                }
                else
                {
                    //没有停用词表
                    wordcount = word.Length;
                }
                sr.Close();
                iccount = charcount;
                iwcount = wordcount;
                ilcount = linecount + 1;
            }
            catch (IOException ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
        }
        // 统计代码行 空行 注释行 
        public void SuperCount(string filename)
        {
            try
            {
                // 打开文件
                FileStream file = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
                StreamReader sr = new StreamReader(file);
                String line;
                int nulllinecount = 0;
                int codelinecount = 0;
                int notelinecount = 0;
                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++;
                    }
                }
                inulllinecount = nulllinecount;
                icodelinecount = codelinecount;
                inotelinecount = notelinecount;
                sr.Close();
            }
            catch (IOException ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
        }
        // 打印信息
        public void Display(string filename)
        {
            //将操作命令以-c,-w,-l的顺序输出
            foreach (string s in msgSplit)
            {
                if (s == "-c")              //遍历第一次找-c命令,有的话输出字符数
                {
                    Console.WriteLine(filename + ",字符数:{0}", iccount);
                    str = filename + ",字 符 数:" + iccount + "\r\n";
                    File.AppendAllText("result.txt", str, Encoding.Default);
                }
            }
            foreach (string s in msgSplit)
            {
                if (s == "-w")             //遍历第二次找-w命令,有的话输出单词数
                {
                    Console.WriteLine(filename + ",单词数:{0}", iwcount);
                    str = filename + ",单 词 数:" + iwcount + "\r\n";
                    File.AppendAllText("result.txt", str, Encoding.Default);
                }
            }
            foreach (string s in msgSplit)
            {
                if (s == "-l")              //遍历第三次找-l命令,有的话输出行数
                {
                    Console.WriteLine(filename + ",行 数:{0}", ilcount);
                    str = filename + ",总 行 数:" + ilcount + "\r\n";
                    File.AppendAllText("result.txt", str, Encoding.Default);
                }
            }
            foreach (string s in msgSplit)
            {
                if (s == "-a")            //遍历第四次找-a命令,有的话输出代码行/空行/注释行
                {
                    Console.WriteLine(filename + ",代码行/空行/注释行:{0}/{1}/{2}", icodelinecount, inulllinecount, inotelinecount);
                    str = filename + ",代码行/空行/注释行:" + icodelinecount + '/' + inulllinecount + '/' + inotelinecount + "\r\n";
                    File.AppendAllText("result.txt", str, Encoding.Default);
                }
            }
            foreach (string s in msgSplit)
            {
                if (s == "-o")               //遍历第四次找-o命令,有的话将结果存入输出文件
                {
                    this.outfile = msgSplit[msgSplit.Length - 1];   //引入输出文件名
                    foreach (string st in msgSplit)
                    {
                        if (st == "-c")          //遍历第一次找-c命令,有的话将字符数存入输出文档
                        {
                            str = filename + ",字 符 数:" + iccount + "\r\n";
                            File.AppendAllText("" + outfile + "", str, Encoding.Default);
                        }
                    }
                    foreach (string st in msgSplit)
                    {
                        if (st == "-w")           //遍历第二次找-w命令,有的话将单词数存入输出文档
                        {
                            str = filename + ",单 词 数:" + iwcount + "\r\n";
                            File.AppendAllText("" + outfile + "", str, Encoding.Default);
                        }
                    }
                    foreach (string st in msgSplit)
                    {
                        if (st == "-l")            //遍历第三次找-l命令,有的话将行数存入输出文档
                        {
                            str = filename + ",总 行 数:" + ilcount + "\r\n";
                            File.AppendAllText("" + outfile + "", str, Encoding.Default);
                        }
                    }
                    foreach (string st in msgSplit)
                    {
                        if (st == "-a")          //遍历第四次找-a命令,有的话将代码行/空行/注释行存入输出文档
                        {
                            str = filename + ",代码行/空行/注释行:" + icodelinecount + '/' + inulllinecount + '/' + inotelinecount + "\r\n";
                            File.AppendAllText("" + outfile + "", str, Encoding.Default);
                        }
                    }
                }
            }
            Console.WriteLine();
        }
    }
}

(3)单元测试代码

using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;

namespace TestWC
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestBaseCount()
        {
            //测试统计字符数,单词书,行数
            wc.WC wordcount = new wc.WC();
            string filename = "F://徐建敏//wc//wc//bin//Debug//file1.c";
            string stopwordfile = "F://徐建敏//wc//wc//bin//Debug//stop.txt";
            wordcount.BaseCount(filename, stopwordfile);
            int ccount = wordcount.iccount;
            int wcount = wordcount.iwcount;
            int lcount = wordcount.ilcount;
            Assert.AreEqual(87, ccount);
            Assert.AreEqual(10, wcount);
            Assert.AreEqual(7, lcount);
        }
        [TestMethod]
        public void TestOperator()
        {
            //测试对输入字符串进行引入并处理
            wc.WC wordcount = new wc.WC();
            string[] msgSplit = { "wc.exe", "-c", "-w", "-l", "F://徐建敏//wc//wc//bin//Debug//file1.c"};
            wordcount.Operator(msgSplit);
            string filename = wordcount.filename;
            string stopword = wordcount.stopwordfile;
            string[] filenames = wordcount.filenames;
            Assert.AreEqual("F://徐建敏//wc//wc//bin//Debug//file1.c", filename);
            Assert.AreEqual(null, stopword);
            Assert.AreEqual(null, filenames);
        }
        [TestMethod]
        public void TestSuperCount()
        {
            //测试统计代码行 空行 注释行
            wc.WC wordcount = new wc.WC();
            string filename = "F://徐建敏//wc//wc//bin//Debug//file1.c";
            wordcount.SuperCount(filename);
            int codecount = wordcount.icodelinecount;
            int nullcount = wordcount.inulllinecount;
            int notecount = wordcount.inotelinecount;
            Assert.AreEqual(4, codecount);
            Assert.AreEqual(2, nullcount);
            Assert.AreEqual(1, notecount);
        }
        [TestMethod]
        public void TestDisplay()
        {
            //测试输出
            wc.WC wordcount = new wc.WC();
            string[] msg={"wc.exe","-c","F://徐建敏//wc//wc//bin//Debug//file1.c"};
            wordcount.msgSplit = msg;
            string filename = "F://徐建敏//wc//wc//bin//Debug//file1.c";
            wordcount.Display(filename);
            string result = wordcount.str;
            Assert.AreEqual("F://徐建敏//wc//wc//bin//Debug//file1.c,字 符 数:0\r\n", result);
        }
    }
}

二、拓展功能展示

 

 

三、静态代码检查

四、单元测试

五、个人总结

通过这次作业,学会了使用VS自带的单元测试工具。同时,结队编程互相讨论,互相提供灵感,对编程的帮助很大。但是实在没有找到静态代码测试工具,只能看VS自带的错误提示,没有学习到静态代码工具的使用,有一些遗憾。

posted @ 2018-10-20 22:47  徐建敏  阅读(124)  评论(0编辑  收藏  举报