声明:
本次博客部分细节内容参考了
项目背景:
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。
作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:
程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2 个 到 3 个之间。由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。
练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt 中。
项目的完成过程
1.配置环境
安装能进行编码,单元测试,效能分析等功能的工具VS2017,并用已学到的C#语言进行项目的开发。
在此处勾选则可进行进一步开发。
Tips:最后不要将安装路径设置为C盘
配置环境的问题:
配置环境的操作步骤很简单,就需要注意安装路径要有足够的空间去放置VS2017。
2.克隆项目
1.在Github中拷贝本次项目中班级指定的仓库,将指定仓库的内容拷贝到自己的仓库中。
2.安装将仓库内容拷贝到本地的工具Git
Git-windows版本下载地址:点击此处
Tips:按自身电脑操作系统的位数进行选择
下载安装完成后,新建一个文件夹来保存仓库中的文件,打开文件夹,在文件夹空白区域点击右键,选择Git Bash Here,输入git clone + 仓库的地址,可以直接复制下来,但是Git中不能允许直接Ctrl+v进行粘贴,只能通过右键然后paste进行粘贴,输入完成后按回车就可以了
细节步骤如下:
打开文件夹,新建一个文件夹,命名为自己的github用户名
如果是第一次使用 Git,请需要在git命令行中使用如下两条命令配置自己的个人邮箱与 Commit 时的用户名,这里的邮箱和用户名最好与 Github 账号保持一致。
git config --global user.name "你的用户名"
git config --global user.email 你的邮箱号
接下来接连使用
git add .(注意这一个小点)
git commit -m "换成你想命名的分支名称"(如:git commit -m "Hello")
即可利用 Git 记录下所有的改动。
克隆项目的问题:
1.注册和使用Github刚开始有点不熟练
2.利用git进行clone时不知道是什么
3.git命令语句的使用经常出现错误,通过百度相关问题得到解决
3.代码设计:
针对项目的要求进行分析,设计,然后在进行编码,满足项目的需求。
过程:
将编码的路径设置为上一步创建好的文件夹中
代码设计思路:
Step1:利用formula()函数生成一个随机序列的等式,其中运算符的个数也同样是随机的(2-3个)
Step2:将formula()返回的等式传入Solve()函数中进行求解,返回等式+计算结果(如:3*4+5=17),若计算结果为小数或等式包含÷0操作则重新生成
Step3:调用calculator()函数生成指定数量的等式,并通过Fwrite()函数写入到本地文件中
部分代码见下图:
1 //生成等式
2 public static stringformula()3 {4 int opNumber = 0;5 int firstNum = 0;6 int nextNum = 0;7 int opNum = 0;8
9 string result = null;10 Random rd = newRandom();11
12 firstNum = (int)rd.Next(0, 101);13 opNumber = (int)rd.Next(2, 4);14 result +=firstNum;15
16 for (int i = 0; i < opNumber; i++)17 {18 nextNum = (int)rd.Next(0, 101);19 opNum = (int)rd.Next(0, 4);20 result = result + Operator[opNum] +nextNum;21 }22
23 returnresult;24 }
生成等式的函数
1 //求解生成的等式,调用Computer函数
2 public static string Solve(stringmsg)3 {4
5 DataTable dt = newDataTable();6 object ob = null;7 ob = dt.Compute(msg, "");8 //不能出现小数和除0操作,若出现则重新生成
9 while (ob.ToString().Contains(".") || msg.Contains("/0"))10 {11
12 msg =formula();13 ob = dt.Compute(msg, "");14 }15 return msg + "=" +ob.ToString();16 }
求解的函数
1 //写入文件到记事本
2 public static boolFwrite(String msg)3 {4 try
5 {6 StreamWriter sw = new StreamWriter("F:\\result.txt");7 sw.Write(msg);8 sw.Close();9 return true;10 }11 catch
12 {13 Console.WriteLine("保存文本文件出错!");14 return false;15 }16 }
写入文件的函数
这次项目的难点就是生成随机序列的等式,并且计算结果不能为小数,等式中不能包含÷0运算,就需针对可能的结果进行判断处理,直到满足项目的需求。
代码运行结果:
代码能够满足项目的各种需求,达到正常运行的标准,但还需要进行单元测试,进行跟细的分析。
代码设计的问题:
1.在生成随机运算符个数上处理不当,反复修改了很多次
2.在等式求解的过程中,用到很多方法都不合适,对以前学到的知识有所遗忘,需复习数据结构与C#的相关内容
3.两个函数相互调用导致运行出错,stackoverflow,需注意编程的细节问题
4.单元测试
用单元测试来保证代码中的各个类与函数的正确性,从而保证整个项目的稳定性,此次测试运用VS2017搭载的测试环境来进行
1.首先要将所有私有的类和函数都改为共有的(private->public),然后对需要测试的函数或类创建单元测试,类似于C#中组件的调用。
创建成功则会自动添加对类的引用
如果没有完成修改则会弹出如下提示信息
创建好单元测试后,就能对指定函数或类进行测试了,下面对该项目中的Solve()函数进行测试,具体测试代码如下:
接下来,判断函数是否满足测试的代码
观察测试结果,注意提示信息
出现错误,找出原因,对代码进行修改后,继续测试,直到代码准确无误
显示正确信息,则函数通过单元测试,后对其他函数或类进行测试,操作步骤相似,修改测试条件即可.
该项目的所有函数都通过测试
单元测试问题:
1.没有将类和函数改成public就创建单元测试,导致一直出现错误信息
2.对函数的测试,没有满足所有出现的情况,只是简单的测试
3.代码的规范性对单元测试的影响很大
5.基本操作(断点和监视器的使用)
断点和监视器的使用对于程序的调试有着很重要的作用,可以很快很准确的找出程序的错误原因和出现错误的位置,从而根据调试的结果去重新修改程序,满足程序的正确性。
断点使用方法
鼠标点击窗体左边缘,形成一个红色的一点即可
然后点击调试图标或按F5就能开始对程序的调试了
调试过程中会用到这样的一个调试框
,通过逐语句图标使程序一句一句运行,达到调试的效果。观察变量的值是否满足程序设计的要求,找到出现问题的原因。
监视器的使用方法
对需要一直观察的变量,可以通过添加监视的方式,更好的到达调试的效果
随着程序的执行,监视的变量则会一直处于监视的状态,来观察其值的变化
条件断点的使用
能够更加快捷的达到程序员需要看到的结果,从而更快的判断程序是否合理,或者找到错误的原因
基本操作的问题:
1.断点位置的标记的合理性存在问题,需要不断实践,熟练掌握方法
2. 准备观察,调试过程中变量值的变化则是调试的关键
6.回归测试
回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。自动回归测试将大幅降低系统测试、维护升级等阶段的成本。
该项目中,在之前的单元测试过程,就运用到了回归测试,修改源代码之后,对其重新进行单元测试,并且修改后的代码仍然要满足单元测试的正确性,达到回归测试的目的
回归测试问题:
1.养成修改代码之后,就对其重新进行单元测试的习惯,将程序效能优化的修改才是所需要的
7.效能分析
此次的效能分析运用了VS2017自带的性能探查器
选择CPU使用率作为此项目的分析目标
之后就可以对代码进行效能分析了,具体执行图如下
还可查看更为详细的效能分析报告
效能分析会帮助程序员从机器的运行角度方面去思考程序的运行效率,对程序的优化有着重要作用
8.提交代码
在完成项目的源代码与单元测试工作以后,即可将代码上传到Github上,在最初的文件夹目录中打开Git
在使用该命令前,请确保所有本地的改动都已经add并commit了。可以用
git status来检查:
若出现这样的效果图就可以执行 git push命令了,将程序提交到Github中
输入自己的Github的账号密码就可以成功的完成提交了
在完成 push 后,我们就可以开始向源仓库(即阿超的仓库)发起 Pull Request(指发起请求给仓库贡献代码)。打开你 Fork 后的项目主页,如图所示,点击按钮New pull request
此时点击Create pull request 即可发起请求。等待仓库主人阿超通过审核后,你的代码就可以成功合并进阿超的仓库,至此就完成了整个教程。
请求结果如下图:
感悟总结:
呼呼,这次的作业是真的麻烦呀,代码已经好久没敲过了,有点生疏了,数据结构的知识也有点忘记了,然后就是各种翻书找资料,终于把这次的作业做完了,~~ 但是还是有很多收获的,第一次进行这么全面的去完成一个小项目,学会了Github的使用,对代码进行单元测试,回归测试,效能分析,对程序的仔细调试等等,更深入的了解了软件工程这一专业并不只是简单的敲代码,而是一个工程项目,需要计划明确,合理分工才能做出满意的产品。
发现Github还有很多其他大佬分享的源代码,值得去借鉴学习,~~ 下次作业继续加油咯~