第三次作业
学号:201631062520 201631062203
队友博客链接:
http://www.cnblogs.com/rickeyqi/p/9826132.html
一、项目简介
源代码地址:https://gitee.com/rickeyqi/WordCount.git
项目需求:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,可执行程序命名为:wc.exe。
该程序处理用户需求的模式为:wc.exe [parameter] [input_file_name],存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。
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参数。
解题思路:该需求主要是对文件进行操作,包括文件的读取、写入、创建等,所以需要熟知文件的基本操作,查阅相关资料也应向文件操作方面靠拢。
数据统计和处理等作为数据基本操作不需要过多的查阅和修改。
代码思路:要实现上述四个功能,则需要四个独立的方法来分别实现,主函数根据用户输入内容,识别用户操作类型和文件名称,再分别对各个操作进行处理。
-o操作不能独立输入,必须有处理结果才能执行,因此用户输入一条命令之后,程序不能立即结束。
二、项目实现
针对四个功能需求,设计了以下四个方法:
//返回文件字符数 public static int CodeCount(string FileName) { int count = 0; char[] Code = { ' ', ',', '%', '~', '!', '#', '^', '*', '(', ')', '\t' }; //读取文件 string[] s = File.ReadAllLines(@"..\Debug\" + FileName, Encoding.Default); foreach (string line in s) //行数 { foreach (Char a in line) //每行字符数 { foreach (char b in Code) { if (a == b) count++; } } } return count; }
//返回文件单词数 public static int WordCount(string FileName) { int sum = 0; //读取文件 string[] s = File.ReadAllLines(@"..\Debug\" + FileName, Encoding.Default); foreach (string line in s) { if (line != null) { foreach (Char a in line) { if (a == ' ' || a == ',') sum++; } sum++; } } return sum; }
//返回文件总行数 public static int LineCount(string FileName) { //读取文件 string[] s = File.ReadAllLines(@"..\Debug\" + FileName, Encoding.Default); return s.Length; }
//将结果输出到指定文件 public static void OutPut(string ParmeterResult, string FileName) { string[] parResult = { ParmeterResult }; if (!File.Exists(@"..\Debug\" + FileName)) { //如果文件不存在,则先新建文件 FileStream fs = new FileStream(@"..\Debug\" + FileName, FileMode.Create, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(parResult); sw.Close(); } else { FileStream fs = new FileStream(@"..\Debug\" + FileName, FileMode.Append, FileAccess.Write); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(parResult); sw.Close(); } }
注:为方便查看程序处理结果,将数据写入文件时,采用的是向后添加的写入方式,而不是覆盖写入方式
Main函数调用:
static void Main(string[] args) { string FileName; //文件名称 string UserWrite; //用户输入内容 string[] ParName = new string[5]; //操作名称 int[] ParmeterResult = new int[5]; //文件操作的返回结果 UserWrite = Console.ReadLine(); string[] AllFileName = new string[50]; //存储所有输入过的文件名 string[] AllParName = new string[50]; //存储所有操作名 int i = 0; while (UserWrite != "###") { string[] Parameter = UserWrite.Split(' '); //文件执行操作类型 FileName = Parameter[Parameter.Length - 1]; AllFileName[i] = FileName; for (int j = 0; j < Parameter.Length - 1; j++) { if (Parameter[j] == "-c") //得到字符总数 { ParmeterResult[j] = CodeCount(FileName); ParName[j] = "字符数"; } else if (Parameter[j] == "-w") //得到单词总数 { ParmeterResult[j] = WordCount(FileName); ParName[j] = "单词数"; } else if (Parameter[j] == "-l") //得到总行数 { ParmeterResult[j] = LineCount(FileName); ParName[j] = "行数"; } else if (Parameter[j] == "-o") //将结果写入文件 { for(int k=0;k<=Parameter.Length-1;k++) { OutPut(AllFileName[i-1] + "," + ParName[k] + ":" + ParmeterResult[k], AllFileName[i]); Console.WriteLine(AllFileName[i-1] + "," + ParName[k] + ":" + ParmeterResult[k]); } continue; } Console.WriteLine(FileName + "," + ParName[j] + ":" + ParmeterResult[j]); } UserWrite = Console.ReadLine(); i++; } }
三、项目测试
目标文件内容:
测试1:
测试2:
测试3:
测试4:
测试5:
测试6:
测试7:
测试8:
四、项目总结
第一次两个团队合作,在合作初期因为分工等发生过分歧,但项目的完美结束,需要一个团结奋进的队伍,后期两人合作没有太大问题,基本要求功能已经完成,多种输入处理方法还不全面。