GIT地址 | 我的GIT地址 |
---|---|
GIT用户名 | linlsj |
学号后五位 | 62311 |
博客地址 | 我的博客主页 |
作业链接 | 我的作业链接 |
环境配置过程
关于此次作业我选择Visual Studio 2015这个工具,根据个人需求,我在微软官网上面下载了Visual Studio 2015的镜像文件。解压过后,内部文件如图所示:
双击vs_community.exe文件进行安装,通过设置安装路径等一系列操作过后(这里,个人建议将vs安装到硬盘中,不要安装到系统盘中,因为vs这个软件还是挺大的),进入到选择安装模块的界面,如下图
这里根据个人需求选择相应的模块就好,当然我在这里选择全部安装(即安装所有模块)。在等待四五个小时后vs2015就安装完成了,此时你就可以打开vs2015进行界面、背景等开发环境的主题属性的设置。
代码设计思路
代码实现背景
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:
- 程序接收一个命令行参数
n
,然后随机产生n
道加减乘除(分别使用符号+-*/
来表示)练习题,每个数字在0
和100
之间,运算符在2
个到3
个之间。 - 由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现
3÷5+2=2.6
这样的算式。 - 练习题生成好后,将生成的
n
道练习题及其对应的正确答案输出到一个文件subject.txt
中。 当程序接收的参数为
4
时,以下为一个输出文件示例。13+17-1=29
11*15-5=160
3+10+4-16=1
15÷5+3-2=4
这次阿超选择使用他最拿手的 C# 语言来完成这样的需求,工欲善其事必先利其器,第一步就需要先安装一个好用的 IDE ,在这里我选择使用vs2015。
代码设计思路
- 根据需求分析,程序需要接收一个参数
n
,用来确定题目的数量我们选择使用int n = Convert.Toint32(Console.ReadLine())
这一语句实现参数n
的获取,然后定义一些接下来会用到的变量。 - 由于涉及到四则运算,因此我选择创建一个长度为4 的字符数组用来存放运算符
char[] op = {'+', '-', '*', '/'};
。 - 根据题目要求,需要随机产生 n道加减乘除的练习题,其中涉及到了随机数的生成,故又创建随机生成函数对象
Random dt = new Random();
。 由于c#中的
Random
函数生成的是伪随机数,为了解决这一问题,我选择用a = rd.Next(0,100); c = rd.Next(2,4);
这样的方式生成真正的随机数,避免生成伪随机数(通过使用不同的范围来强制生成不同的随机数)。题目的储存,我选择用字符串的形式储存,使用c#中字符串的拼接特性以及循环结构
1. str = Convert.ToString(a); 2. for (int j = 0; j < c; j++) { m = rd.Next(0, 4); b = rd.Next(0, 100); str += op[m] + Convert.ToString(b); }
实现题目的储存。接下来需要计算结果,当时首先想到的是分割字符串生成字符数组然后进行计算,后面考虑到实现的难度比较大,因此放弃了这一做法,然后通过网络寻找c#的计算方法,终于找到了
DataTable
这一个模块,可以通过使用其中的Compute
方法完成字符串中的加减乘除的运算,方法实现DataTable dt = new DataTable(); end = dt.Compute(str,"")
其中end
的数据类型是object
,通过使用end
来存储最后的运算结果。阿超的孩子刚上小学一年级,还没有接触过分数,他并不知道小数(分数)的形式,以及根据运算规则,除数不能为
0
,还需满足运算结果不能出现负数。因此需要判断题目是否满足要求if (end.ToString().Contains(".") || str.Contains("/0") || int.Parse(end.ToString()) < 0) continue;
如果包含,则使用
continue
语句跳过后续操作。题目以及答案的问题已经解决了,接下来就涉及到文件的操作,使用一个字符串将整个题目的信息都储存进去
st = str.Replace("/", "÷") + "=" + end.ToString();
,由于小学一年级,没有接触过/
这种除号,我选择用÷
替换掉/
,然后使用StreamWriter
模块进行对.txt
的操作StreamWriter streamWriter = new StreamWriter("test.txt", true); streamWriter.WriteLine(st); streamWriter.Close();
实现将题目输出到文件中的操作。
具体代码实现
代码运行结果
GitHub
GitHub的使用
首先在GitHub网站首页注册一个GitHub账号。使用该账号登录成功后,进入阿超的仓库中,进行克隆操作。进入阿超的仓库后,点击右上角的 Fork ,将阿超的四则运算库拷贝到自己的同名仓库中,如下图所示:
拷贝成功后,不难发现我们有了一个同名仓库,如果你电脑上面还没有Git,那么你可以选择点击图片中右侧的绿色按钮,进行Git的下载安装。
打开Git Bash,输入git clone ,敲击回车,等待响应,然后就完成克隆了。
接下来由于首次使用Git,因此我们需要配置自己的个人邮箱与Commit名(注:这里的邮箱和用户名最好和GitHub账号一致)
配置完成后,接下来可以使用
git add .
以及git commit -m "我们命名的分支"
进行文件保存工作。在完成Git仓库的保存工作后,我们可以通过
git status
命令查看当前仓库状态。接着我们使用
git push
提交命令将文件提交到GitHub中去,会弹出下列登录界面,登录过后即可传送文件。然后等待文件上传,你的邮箱会收到邮件通知。此时完成上传操作。
GitHub使用过程中的问题
Git在之前就已经配置好了,但是从来没有使用过,还是比较陌生的。困住我的还是Git的本地项目的上传,刚开始没有idb_rsa.pub文件,因此在GitHub上面一完成不了SSH keys的创建。后面通过百度,使用$ssh-keygen -t rsa -C "你的邮箱名"
命令完成了该文件的创建,如果没设置ssh keys,就创建新的ssh keys,不然git不能上传本地项目。当时就是因为这一原因所以一直不能完成代码的提交。如果你是第一次使用Git上传本地项目,你可以参考这篇博客来完成本地项目的上传。
项目测试
不过,我的代码只有一个Main()
函数,这个是有就只有修改我的代码了,修改后的代码形式如图
主函数
题目生成函数
存储题目函数
单元测试
通过单元测试可以保证这一模块能被人放心的调用,让这一模块定义明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的、量化的保证。在这里,我使用vs2015来对我编写的函数进行测试
这个时候我们可以在编写的函数中直接轻击鼠标右键,选择
创建单元测试
然后出现这样的弹窗,接下来根据自身需求进行设置
随后我们需要修改代码,修改
file_opTests.cs
中的内容接下来点击运行,查看运行结果即可。
回归测试
回归测试就是在修改了原有代码的情况下,重新对该模块进行测试确定此次修改没有引入新的错误或导致其他代码产生错误。修改file_op类中的方法过后,对其重新进行单元测试,需要满足单元测试的正确性,步骤与单元测试一致,file_op修改后的代码:
回归测试代码
心得体会
- 通过此次对vs2015以及Git工具的使用,了解了Git这一分布式版本控制系统,并实际上手操作。使用Git我们可以方便地恢复我们一些文件的前版本,方便了文件的管理和利用,不用担心错误操作导致的文件内容丢失。
- 在编码过程中,c#中有很多模块我都是不知道的,例如
Data Table
模块我之前完全不知道,通过这一次的编程练习,对于这一模块我有了初步的了解。 - 还有之前并不知道
单元测试
和回归测试
这两个功能,以前就只是单纯的进行代码的调试与修改,通过单步调试寻找错误,并没有考虑过我编写的模块被别人调用。从来没有考虑过模块的质量问题。 - 通过此次编程,我觉得以后的编码不能只是单纯的为了去实现某一个功能,在编程的过程中还需要考虑到代码的健壮性和可重用性。
- 在
Random
模块的使用中应该注意,我们所生成的数是伪随机数,我们应该采取一定的措施来限制它(例如:使用随机数种子、或者通过不同范围内生成随机数)。 - 在Git的操作中一定要注意是否有
SSH keys
,如果没有一定要新建一个,不然不能将项目上传到GitHub
里面去。