第二次作业重交

代码地址

第二次作业重交

一、作业内容

根据WordCount的需求描述,先编程实现,再编写单元测试,最后撰写博客。至少完成需求中的基本功能。

二、需求说明

WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。

2.1 基础功能

wc.exe -c file.c //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的单词总数
wc.exe -l file.c //返回文件 file.c 的总行数
wc.exe -o outputFile.txt //将结果输出到指定文件outputFile.txt
注意:
空格,水平制表符,换行符,均算字符。
由空格或逗号分割开的都视为单词,且不做单词的有效性校验,例如:thi#,that视为用逗号隔开的2个单词。
-c, -w, -l参数可以共用同一个输入文件,形如:wc.exe –w –c file.c 。
-o 必须与文件名同时使用,且输出文件必须紧跟在-o参数后面,不允许单独使用-o参数。

2.2 扩展功能

wc.exe -s //递归处理目录下符合条件的文件
wc.exe -a file.c //返回更复杂的数据(代码行 / 空行 / 注释行)
wc.exe -e stopList.txt // 停用词表,统计文件单词总数时,不统计该表中的单词
[file_name]: 文件或目录名,可以处理一般通配符。
其中,
代码行:本行包括多于一个字符的代码。
空 行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
}//注释
在这种情况下,这一行属于注释行。
-e 必须与停用词文件名同时使用,且停用词文件必须紧跟在-e参数后面,不允许单独使用-e参数。
stopList.txt中停用词可以多于1个,单词之间以空格分割,不区分大小写,形如:
while if switch
则while,if,switch作为3个停用词,在单词统计的时候不予考虑。停用词表仅对单词统计产生影响,不影响字符和行数的统计。

三、解题过程

解题思路

根据题目要求所知,需要读取一个文件中的内容,然后再计算文件内容的字符数,单词数,行数等,再将结果输出到另一个即result文件中。
所以要考虑文件的读取和输出,对单词数,字符数,行数如何计算,还有命令的输入和读取。

主函数Main

主要负责基本功能的实现,在基本功能中,用户通过输入命令行的方式与程序实现交互,并判断命令是否有效。

static void Main(string[] args)
        {
            string strcomm = Console.ReadLine();   //读入文件
            ProcessingData wc = new ProcessingData();
            string[] sArray = strcomm.Split(new char[2] { ' ', '-' }, StringSplitOptions.RemoveEmptyEntries);//去空格截取各个字符串信息
            for (int i = 1; i < sArray.Length - 1; i++)
            {
                switch (sArray[i])
                {
                    //Convert .ToInt32 (
                    case "c":
                        Console.WriteLine(sArray[sArray.Length - 1] + "  字符数:" + wc.cProsess(sArray[sArray.Length - 1]));
                        break;
                    case "w":
                        Console.WriteLine(sArray[sArray.Length - 1] + "  单词数:" + wc.wProsess(sArray[sArray.Length - 1]));
                        break;
                    case "l":
                        Console.WriteLine(sArray[sArray.Length - 1] + "  行数:" + wc.lProsess(sArray[sArray.Length - 1]));
                        break;
                    case "o":
                        Console.WriteLine(wc.oProcess(sArray[sArray.Length - 1]));
                        break;
                    default:
                        Console.WriteLine("输入的指令 -" + sArray[i] + " 有误!");
                        break;
                }
            }
            Console.ReadKey();
        }

字符数,单词数,总行数计算

public int cProcess(string fstr)
        {
            string str = openFile(fstr);
            int charCount = 0;//记录字符个数

            foreach (char c in str)
            {

                if (c == ' ' || c == '\t' || c == '\n')
                {
                    break;
                }
                else
                {
                    charCount++;
                }
            }
            StreamWriter sw = new StreamWriter("result.txt", true);
            sw.WriteLine(fstr + "  字符数: " + Convert.ToString(charCount));
            sw.Close();
            return charCount;
        }
public int wProcess(string wstr)
        {
            string str = openFile(wstr);
            int count = 0;//记录单词个数
            bool flag = true;
            foreach (char s in str)//遍历字符串,
            {
                if (s != ' ' && s != '\n' && flag  == true)
                {
                    count++;
                    flag  = false;
                }
                else if ((s == ' ' || s == '\n') && flag  == false)
                {
                    flag = true;
                }
            }
            StreamWriter sw = new StreamWriter("result.txt", true);
            sw.WriteLine(wstr + "  单词数:" + Convert.ToString(count - 1));//
            sw.Close();
            return count ;
        }
public int lProcess(string lstr)
        {
            string str = openFile(lstr);
            int count = 0;//记录行数
            foreach (char s in str)
            {
                if (s == '\n')
                {
                    count++;
                }
            }
            StreamWriter sw = new StreamWriter("result.txt", true);
            sw.WriteLine(lstr + "   行数: " + Convert.ToString(count - 1));
            sw.Close();
            return count + 1;
        }

输入,输出

public string openFile(string fstr)
        {

            FileStream fs = new FileStream(@fstr, FileMode.Open);//初始化文件流
            byte[] array = new byte[fs.Length];//初始化字节数组
            fs.Read(array, 0, array.Length);//读取流中数据到字节数组中
            fs.Close();//关闭流
            string str = Encoding.UTF8.GetString(array);
            return str;

        }
public bool oProcess(string oFile)
        {
            string str = openFile("result.txt");//打开结果保存文件

            StreamWriter sw = new StreamWriter(oFile, true);
            sw.WriteLine(str);
            sw.Close();
            return true;
        }

四、运行截图

五、总结

刚拿到这个项目的时候其实一头雾水,无从下手,编写代码的过程中也遇到很多的问题,出现无法预料的错误。经常在一个地方卡住卡很久。不过通过这次个人项目,我也收获了很多,比如程序的设计实现需要先设计再去实现,设计和编译一样重要,完成任何一个程序,需要实现设计方案,避免后面的错误和程序不完善等问题。

posted @ 2018-09-29 20:16  吴天ss  阅读(158)  评论(0编辑  收藏  举报