第二次作业重交

一、项目简介

1、Gitee项目地址:https://gitee.com/xnsy/WC

2、开发语言:C#语言

3、解题思路

刚看完作业要求后,只知道这个程序要完成对文件的统计工作,但是对于程序设计仍然是一头雾水,而后百度了怎么编写wordcount程序后,发现有很多优秀的博客和文章,都详细地写了程序的相关设计包括具体的代码和项目完成截图,因为并没有接触过Java编程,所以我选择了用C#。
题目分析:
1.从程序的流程看,是一个控制台程序
2.要求对文件进行统计字数,涉及到文件读写
3.文件的扩展功能
通过各个方面查资料后我设计了以下四个功能函数
public string Operator(string[] sParameter, string sFilename)//基本功能实现
private void BaseCount(string filename)// 统计基本信息:字符数 单词数 行数
private void SuperCount(string filename) //统计高级信息:空行数 代码行数 注释行数
private string Display()//展示信息

二、设计实现

代码整体主要分为三个类:Main,功能,统计信息,展示

1、Main

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

static void Main(string[] args){string message = ""; // 存储用户命令while (message != "exit"){Console.Write("wc.exe ");// 得到输入命令message = Console.ReadLine();message = message.Trim(' ');message = message.Trim('\t');if (message != "-x"){// 分割命令string[] arrMessSplit = message.Split(' ');int iMessLength = arrMessSplit.Length;string[] sParameter = new string[iMessLength - 1];// 获取命令参数for (int i = 0; i < iMessLength - 1; i++){sParameter[i] = arrMessSplit[i];}// 获取文件名string sFilename = arrMessSplit[iMessLength - 1];// 新建处理类WC newwc = new WC();newwc.Operator(sParameter, sFilename);}else{string[] sParameter = new string[1];sParameter[0] = message;WC newwc = new WC();newwc.Operator(sParameter, "");}}

2、统计

在Operator()方法中,捕捉 "-c"、"-w"、"-l" 命令,通过参数素组的设置调用不同的类方法进行处理;

public string Operator(string[] sParameter, string sFilename){this.sParameter = sParameter;this.sFilename = sFilename;string retrun_str = "";foreach (string s in sParameter){if (s == "-x"){string resultFile = "";OpenFileDialog fd = new OpenFileDialog();fd.InitialDirectory = "D:\\Patch";fd.Filter = "All files (*.*)|*.*|txt files (*.txt)|*.txt";fd.FilterIndex = 2;fd.RestoreDirectory = true;if (fd.ShowDialog() == DialogResult.OK){resultFile = fd.FileName;//Console.WriteLine("文件名:{0}", resultFile);SuperCount(resultFile);BaseCount(resultFile);retrun_str = DisplayAll();}break;}// 遍历文件else if (s == "-s"){try{string[] arrPaths = sFilename.Split('\\');int pathsLength = arrPaths.Length;string path = "";// 获取输入路径for (int i = 0; i < pathsLength - 1; i++){arrPaths[i] = arrPaths[i] + '\\';path += arrPaths[i];}// 获取通配符string filename = arrPaths[pathsLength - 1];//  获取符合条件的文件名string[] files = Directory.GetFiles(path, filename);foreach (string file in files){//Console.WriteLine("文件名:{0}", file);SuperCount(file);BaseCount(file);retrun_str = Display();}break;}catch (IOException ex){//Console.WriteLine(ex.Message);return "";}}// 高级选项else if (s == "-a"){//Console.WriteLine("文件名:{0}", sFilename);SuperCount(sFilename);BaseCount(sFilename);retrun_str = Display();break;}//  基本功能else if (s == "-c" || s == "-w" || s == "-l"){//Console.WriteLine("文件名:{0}", sFilename);BaseCount(sFilename);retrun_str = Display();break;}else{//Console.WriteLine("参数 {0} 不存在", s);break;}}Console.WriteLine("{0}", retrun_str);return retrun_str;}

BaseCount() 方法用以统计指定文件的字符数、单词数以及总行数;

 private void BaseCount(string filename){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', '{', '}', '(', ')', '+' ,'-','*', '='};while ((nChar = sr.Read()) != -1){charcount++;     // 统计字符数foreach (char c in symbol){if (nChar == (int)c){wordcount++; // 统计单词数}}if (nChar == '\n'){linecount++; // 统计行数}}iCharcount = charcount;iWordcount = wordcount + 1;iLinecount = linecount + 1;sr.Close();}catch (IOException ex){Console.WriteLine(ex.Message);return;}}

Display()方法用来打印输出信息;

 private string Display(){string return_str = "";foreach (string s in sParameter){if (s == "-c"){//Console.WriteLine("字 符 数:{0}", iCharcount);return_str += "字符数:" + iCharcount.ToString();}else if (s == "-w"){//Console.WriteLine("单 词 数:{0}", iWordcount);return_str += "单词数:" + iWordcount.ToString();}else if (s == "-l"){//Console.WriteLine("总 行 数:{0}", iLinecount);return_str += "总行数:" + iLinecount.ToString();}else if (s == "-a"){return_str += "空行数:" + iNullLinecount.ToString();return_str += "代码行数:" + iCodeLinecount.ToString();return_str += "注释行数:" + iNoteLinecount.ToString();}}//Console.WriteLine();return return_str;}

3、展示统计完成的信息

private string DisplayAll(){string return_str = "";foreach (string s in sParameter){//Console.WriteLine("字 符 数:{0}", iCharcount);//Console.WriteLine("单 词 数:{0}", iWordcount);//Console.WriteLine("总 行 数:{0}", iLinecount);//Console.WriteLine("空 行 数:{0}", iNullLinecount);//Console.WriteLine("代码行数:{0}", iCodeLinecount);//Console.WriteLine("注释行数:{0}", iNoteLinecount);return_str += "字符数:" + iCharcount.ToString();return_str += "单词数:" + iWordcount.ToString();return_str += "总行数:" + iLinecount.ToString();return_str += "空行数:" + iNullLinecount.ToString();return_str += "代码行数:" + iCodeLinecount.ToString();return_str += "注释行数:" + iNoteLinecount.ToString();}//Console.WriteLine();return return_str;}

三、单元测试

1、黑盒测试

1085706-20180929174713876-322381655.png

(1) 对单词数进行统计

1085706-20180929174804793-864277017.png

(2) 对行数进行统计

1085706-20180929174813385-258392885.png

(3) 对字符进行统计

1085706-20180929174822801-1124822329.png

(4) 对扩展功能的测试

1085706-20180929174833223-1906288594.png

(5) 总测试

1085706-20180929174849327-1287923733.png

void WCTest()对程序进行单元测试

(1)通过字符数:94进行正确测试

1085706-20180929174900386-1697092701.png

(2)通过字符数:100等错误信息测试看测试是否通过

1085706-20180929174910989-1876252087.png

四、总结

刚拿到这个项目的时候其实一头雾水,无从下手,编写代码的过程中也遇到很多的问题,出现无法预料的错误。经常在一个地方卡住卡很久。不过通过这次个人项目,我也收获了很多,比如程序的设计实现需要先设计再去实现,设计和编译一样重要,完成任何一个程序,需要实现设计方案,避免后面的错误和程序不完善等问题。同时,代码的测试也占有相当的比例,通过各方面的测试避免程序出现错误和对用户体验度的完善。最后,完成一个完整的程序的时候,一定的代码功底就显得尤为重要,这是需要不停积累y与练习的。

转载于:https://www.cnblogs.com/longlin123/p/9724989.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习(4):第一个java程序

1第一个java文件 编写一个.java后缀的文件 public class helloworld{ public static void main(String[] args){ System.out.println(“helloworld”); } } 2cmd 编译java javac helloworld 生成class文件使用 Java helloworld 输出helloworld结束 个人练习 public class test…

java学习(5):全局变量和局部变量

public class qulitity{ static int num125; public static void main(String[] args){ System.out.println(“全局变量的值为”num1); int num212; System.out.println(num2); Test(); } public static void Test(){ int num21000; System.out.println(num2); } }

C语言知识点笔记完全整理

这个大长篇相当于是自己对于c语言学习的一个总结&#xff0c;会持续更新完善。 后续会在寒假整理一些经典的例题附带题解&#xff0c;当然希望我学到的东西、总结的经验&#xff0c;能够给后来者提供一个更好的学习途径&#xff0c;从入门到精通而不再是放弃。 也欢迎读者提出…

[HAOI2016]食物链

题目描述 如图所示为某生态系统的食物网示意图&#xff0c;据图回答第1小题现在给你n个物种和m条能量流动关系&#xff0c;求其中的食物链条数。物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a3 b3......am-1 bm-1am bm其中ai bi表示能量从物种ai流向物种bi,注意单独的…

java学习(6):数据类型

public class Shortdata{ public static void main(String[] args){ byte by 45; short sho 32767; System.out.println(“sho的值是”sho); //获取最大值 System.out.println(Byte.MAX_VALUE); System.out.println(Short.MAX_VALUE); //获取最小值System.out.println(Byte.M…

Xcode添加pch文件

1.打开Xcode工程. 在Supporting Files目录下,选择 File > New > File > iOS > Other > PCH File 然后点击下一步&#xff1b; 2.如果项目名称为Demo, PCH 文件的名字为Test.pch,然后创建&#xff1b;3.选择 PCH 文件创建Test.pch文件4.找到 Project > Build …

java学习(7):巩固练习

//任务1 //使用记事本或其他文本编辑器编写一个java控制台程序&#xff0c;定义一个包含main方法的java类&#xff0c;在main方法中使用合适的数据类型定义如下局部变量&#xff0c;标识符要严格遵守java规范。 //学生姓名&#xff1b;学生年龄&#xff1b;学生身高&#xff0c…

java学习(8):巩固练习

//任务2 编写控制台程序将以下给定的整数常量用合适的变量接收并将其10进制值与二进制表示形式分别输出打印在控制台界面 //55&#xff1b;666&#xff1b;1080&#xff1b;2500&#xff1b;78451&#xff1b; public class test02{ public static void main(String[] args){ /…

wordpress安装_WordPress第三课:使用SOFTACULOUS安装WORDPRESS

在精简的过程中&#xff0c;你会发现你更加明确想要什么&#xff01;目标变得明确&#xff0c;生活也将变得清晰。安装WordPress最简单的方法是使用自动安装程序&#xff0c;这是一个特殊的工具&#xff0c;可以在你的网站上安装程序。大多数虚拟主机都会提供一个自动安装程序作…

keepalive日志_12.日志收集项目-数据流图以及nginx安装

数据流图nginx安装中文文档http://tengine.taobao.org/nginx_docs/cn/docs/基础依赖与安装yum -y install gcc gcc-c autoconf pcre pcre-devel make automakeyum -y install wget vim httpd-toolsyum源在官网拷贝vi /etc/yum.repos.d/nginx.repo[nginx-stable]namenginx stabl…

【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例

01 什么是禁忌搜索算法&#xff1f; 1.1 先从爬山算法说起 爬山算法从当前的节点开始&#xff0c;和周围的邻居节点的值进行比较。 如果当前节点是最大的&#xff0c;那么返回当前节点&#xff0c;作为最大值 (既山峰最高点)&#xff1b;反之就用最高的邻居节点来&#xff0c;替…

14. Java基础之泛型

一. 泛型概念的提出&#xff08;为什么需要泛型&#xff09;&#xff1f; 首先&#xff0c;我们看下下面这段简短的代码: 1 public class GenericTest {2 3 public static void main(String[] args) {4 List list new ArrayList();5 list.add("qqyum…

java学习(15):巩固练习

//任务 1 //编写控制台java程序&#xff0c;使用Scanner 对象相关方法从 //控制台接收用户输入如下数据并使用相关的局部变量接收&#xff0c;在控制台打印输出。 //老师的姓名&#xff1b;老师的性别&#xff1b;老师的工资&#xff1b;老师的年龄&#xff1b;工作时长 import…

java学习(16):巩固练习

/任务 2 编写控制台java程序&#xff0c;将以下数据使用合理类型变量进行接收赋值 3.5&#xff1b;185.59&#xff1b;8500.50 要求在控制台打印这些数据并只显示整数部分。/ import java.util.Scanner; public class test02{ public static void main(String[] args){ Scanner…

mac电脑投屏到小米盒子_苹果手机搜不到小米盒子怎么办?

刚买的小米电视盒子迫不及待想投屏&#xff0c;但是手机是苹果系统&#xff0c;都是连得同一wifi&#xff0c;可是手机就是搜索不到小米家的客厅电视&#xff0c;这种情况该怎么办呢&#xff1f;以下小编给大家详细介绍了苹果手机搜不到小米盒子该怎么办。苹果设备中搜不到小米…

Redis实现之对象(三)

集合对象 集合对象的编码可以是intset或者hashtable&#xff0c;intset编码的集合对象使用整数集合作为底层实现&#xff0c;集合对象包含的所有元素都被保存在整数集合里面。举个栗子&#xff0c;以下代码将创建一个图1-12所示的intset编码集合对象&#xff1a; 127.0.0.1:637…

java学习(17):巩固练习

//#任务 3 //#已知有三个人&#xff0c;张无忌&#xff0c;任盈盈&#xff0c;任我行。当前只知道任盈盈的年龄 //#可以被用户从控制台输入&#xff0c;并且用户可以告知任盈盈的年龄比张无忌的年龄小几岁&#xff0c; //#任我行年龄是张无忌和任盈盈年龄和还要大几岁&#xff…

mysql innodb redolog_MySQL · 引擎特性 · InnoDB redo log漫游(转)

前言InnoDB 有两块非常重要的日志&#xff0c;一个是undo log&#xff0c;另外一个是redo log&#xff0c;前者用来保证事务的原子性以及InnoDB的MVCC&#xff0c;后者用来保证事务的持久性。和大多数关系型数据库一样&#xff0c;InnoDB记录了对数据文件的物理更改&#xff0c…

Jenkins配置:添加用户和管理权限

Jenkins配置&#xff1a;添加用户和管理权限 参考文章&#xff1a;http://www.cnblogs.com/zz0412/p/jenkins_jj_14.html 今天给大家说说使用Jenkins专有用户数据库的配置&#xff0c;和一些常用的权限配置。 配置用户注册 在新安装好的jenkins中&#xff0c;默认是没有设置用户…

java学习(18):巩固练习

/任务 4 白大壮和白二壮是双胞胎兄弟&#xff0c; 白大壮的身高增加1厘米正好是白二壮的身高 &#xff0c;白二壮体重正好是妹妹白无瑕体重&#xff0c;编写程序完成白大壮 和白二壮身高的计算并输出&#xff0c;并计算白无瑕的体重输出是多少/ import java.util.Scanner; publ…