1.配置环境——安装Visual Studio 2017
由于之前已经下载过Visual Studio 2017的企业版,我现在要做的就是看看电脑上是否已经安装过.Net Framework,Visual Studio是否安装了C#所需的组件。
1).NET Framework
在控制面板->卸载或更改程序中找到了.NET Framework 4.7.2,说明之前已经成功安装过较高的版本。
2)C#组件
在Windows中搜索studio,会出现Visual Studio Installer,双击打开。或者查看文件所在位置,能看到Visual Studio 的安装包具体位置信息,打开以后,会看到电脑已经安装了Visual Studio Enterprise 2017。
点击更多->修改
在安装工作组件的页面中,只要勾选了.NET 桌面开发,使用C++的桌面开发,通用Windows平台开发,系统驱动器不需要再占用空间,为0KB,说明之前已经安装好了所有的基本组件,包括C#,C++等等。
通过以上两步确认,本机已经配置好VS2017的环境。
2.克隆项目——GitHub的使用
1)之前已注册过GitHub账户,因此直接将阿超仓库的四则运算库拷贝到我的同名仓库中。
2)之前看的Git的安装和学习教程是廖雪峰老师的教程,本机能直接打开Git Bash,这里就不再给出安装过程。
3)我在E:\GitProject\chaosir 克隆了AchaoCalculator,具体如下图:
4)打开AchaoCalculator目录,新建文件夹并重命名为我的GitHub账户名。
3.代码设计思路
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。
作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:
程序接收一个命令行参数 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
1)按照题目要求,程序分为三个部分,第一部分接收题目个数,在main()
中;第二部分随机生成题目,在create()
中;第三部分将题目和答案输出到subject.txt中,这部分写在了storeTest()
里。2)在第二部分里,我使用Random和一个for循环来随机生成2个或者3个符号,能使每次生成的随机数都不同。
Random r = new Random(); for (i = 0; i <= 1; i++) { a[i] = r.Next(2, 4);//决定生成多少个符号 }
符号
+-*/
本身就是字符,将所有的数字也转变成字符串,构造一个类似于123+5x2-1
的形式,再用DataTable
的Compute("123+5*2-1","")
即能算出结果。3)将字符串输出到
subject.txt
,由于题目需要不断的追加到txt文件中,使用FileStream
和StreamWriter
能完美解决这个问题。
运行结果如下:
4.单元测试与回归测试
遇到的问题与解决:在写程序的过程中,偶尔出现了几个我觉得很不可思议的错误,这时我会在报错的位置打断点,按F5
键开始调试,一般我习惯用逐过程F10
来一步一步往下看,查找错误。如下图的错误:
报了数组索引越界的错误,一开始我还找了很久,后来才发现是错把j
写成i
了,于是后面我索性把需要用到for循环的地方都用i
来表示。
C#进行单元测试的两大步骤:
1)新建单元测试项目;
2)在测试项目中添加对原项目Calculator
的引用。
我将用于计算加减乘除的代码提取出来,写为calculate()
,对calculate()
进行测试。
第一遍,运行测试通过,再运行了几遍,测试通过。对原有代码进行一定的重构,将代码修改的更精简,进行回归测试,测试通过。
修改代码如下,将原来的a[i]==2,即只有两个符号时的情况变成通用情况:
int[] bnum = new int[3];//存储随机生成的数字 String[] snum = new String[3];//数字转成字符串 int[] c = new int[2];//存储随机生成的符号,1代表+,2代表-,3代表x,4代表/ char[] dsign = new char[2]; int[] result = new int[2]; for (i = 0; i < 3; i++)//生成数字 { bnum[i] = r.Next(1, 100); snum[i] = Convert.ToString(bnum[i]); }
通用情况:
int sign = a[1]; int num = sign + 1; int[] bnum = new int[num];//存储随机生成的数字 String[] snum = new String[num];//数字转成字符串 int[] c = new int[sign];//存储随机生成的符号,1代表+,2代表-,3代表x,4代表/ char[] dsign = new char[sign]; for (i = 0; i < num; i++)//生成数字 { bnum[i] = r.Next(1, 100); snum[i] = Convert.ToString(bnum[i]); }
5.提交代码
在2.克隆项目中,AchaoCalculator
的目录下我新建了icjy
文件夹。提交代码时,右键icjy
,点击Git Bash Here
,再进行如下操作:
commit
之后查看仓库当前状态:
最后push
完成提交。
遇到的问题与解决:在提交之前除了看Part7,我还在网上找了其他的关于VS项目上传到GitHub的教程,当时没有搞懂VS里的GitHub插件是什么,是不是还要额外在VS里面下载插件,后来问了同学才知道之前安装的Git就相当于一个插件,不需要再安装VS自带的插件了。在文件夹下右键能直接进入Git Bash命令行,这个也是经同学传授的(超级感谢),这样就不用每次都通过输入命令,切换盘符找位置来进行git add和git commit了。
6.心得
本次作业学会了GitHub的基本操作,以前没有试过用GitHub提交代码,当时觉得太难了,上传经常失败,或者搞错分支,现在开始慢慢明白怎么去用了。C#虽然以前有学过,但是真正用来写程序的话这是第一次。所以刚上手的时候还是觉得有点困难,许多函数跟Java里的不一样,比如C#里我找不到String.ValueOf()
,和StringBuffer
,在类型转换的时候还是纠结了好久,C#里还有String
和string
之分。而且由于对VS界面的不熟悉,单元测试我花了很长时间才知道怎么去写(虽然Part3有教程但是操作的时候还是把引用给漏了)。一开始做这个作业的时候我还尝试过按照教程写C++的单元测试,相比之下我发现C++要配置的东西确实比C#要多一些。通过这次的学习我对VS有了更深的理解,功能真的是太强大,不愧是被称为最好用的IDE。