第二次作业——熟悉使用工具
GIT地址 | https://github.com/dckejds |
GIT用户名 | dckejds |
学号后五位 | 62325 |
博客地址 | http://www.cnblogs.com/tianhaoqi/ |
作业链接 | https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2793 |
一、环境配置
由于之前已经安装过了Visual Studio 2017并且并未卸载,c#环境配置已经配置完成,在以前的下载配置过程中并未出现什么问题,下图是安装时间截图。
图1——vs2017安装时间截图(其中devenv.exe为vs主程序)
配置完成后的环境如下图所示:
图2——环境配置结果
二、代码设计
设计思路:这里需要建立两个方法,第一个方法用于生成运算式,第二个方法用于对运算式进行计算。
生成运算式的方法中,首先定义两个变量,一个变量用于随机选取操作数,另一个变量用于随机选取运算符的个数(2-3个),选取随机数时利用随机数种子进行选取,并且在随机选取除第一个操作数外的操作数和选取所用的运算符时,必须放在循环内进行选取,这样可以保证不会最终出现如下图中所示的重复现象:
图3——所出现的输出重复现象
这样做的原因是由于,我们在产生随机数时常用的Random.Next();方法产生的随机数其实是伪随机数,如果在高并发的情况下,Random类所取到的系统时钟种子接近甚至完全一样,就很有可能出现重复现象,但是,如果我们将取随机数的过程放在循环内进行,则每次循环时都会重新选取,有效的避免了这种现象出现。使用随机数种子 var randomseed = Guid.NewGuid().GetHashCode();能使随机数的选取更为精确。
之后使用一个循环for(int i=0;i<需要生成的运算符数量变量(通过随机数选取);i++),在这一循环中利用随机数随机选取运算符和后续操作数,之后用result = result + op[opn] + num;将操作数和运算符结合成四则运算算式。
该方法的代码如下所示:
1 public static string Command()//用于生成四则运算式 2 { 3 string result = null; 4 var randomseed = Guid.NewGuid().GetHashCode(); 5 Random random = new Random(randomseed);//用随机数种子来生成随机数,避免可能出现的重复 6 int num = random.Next(0, 101); 7 int opern = random.Next(2, 4); 8 result += num; 9 for(int i=0;i<opern;i++) 10 { 11 int opn = random.Next(0, 4); 12 num = random.Next(0, 101); 13 result = result + op[opn] + num; 14 } 15 return result; 16 }
之后就是需要对所生成的运算式进行计算,计算时使用Datatable类中的Compute方法来进行对之前输出的string类型表达式的计算,同时,还需要使用while循环避免结果出现小数(包括式子中出现的任意两个数相除的结果),运算式中出现小数运算和消除除零异常。这里需要注意在使用这个方法时需在代码最前面添加using System.Data;,否则将无法使用这一方法。
该方法的代码如下:
1 public static string Calculate(string question)//计算生成的四则运算式 2 { 3 DataTable data = new DataTable(); 4 string r = data.Compute(question, "").ToString(); 5 while(r.Contains(".")||question.Contains("/0")) 6 { 7 question = Command(); 8 r = data.Compute(question, "").ToString(); 9 } 10 while(r.Contains(".")) 11 { 12 question = Command(); 13 r = data.Compute(question, "").ToString(); 14 } 15 return question + "=" + r; 16 }
注意,通过data.Compute()得到的数据类型为object类型,后面必须加.ToString()来将其转换为string类型。
之后就可在主函数中通过在一个循环for (int i=0;i<n;i++)(n为用户所输入的需要产生的四则运算题目数)中调用这两个方法来生成n个符合要求的四则运算题目。最后就是将生成的所有题目及答案输出到subject.txt文件中。这样代码就完成了。
ps:选择文件存储目录时,在文件名前加上./就可以使最终生成的txt文件的存储目录为代码编译后生成的可执行文件的根目录,进行文件操作的代码如下:
1 string filename = @"./subject.txt"; 2 try 3 { 4 StreamWriter sw = new StreamWriter(filename); 5 sw.Write(result+"\n"); 6 sw.Flush(); 7 sw.Close(); 8 } 9 catch 10 { 11 Console.WriteLine("存储文件时出错!"); 12 }
三、使用GIT克隆及提交代码
首先需要在GIT上申请一个GIT账号,在官网内下载GIT,然后进入作业中所给的仓库链接,点击右上角的Fork按钮,就可以把这一仓库复制到自己账号内的同名仓库中,再点开下方的Clone or Download按钮旁的倒三角,在弹出的菜单中点击Download ZIP按钮,就可以将该仓库中的文件以ZIP压缩文件格式下载到本地。或者可以通过下面图4和图5中的操作来将仓库中的文件下载至本地。
图4——将仓库内文件传到本地操作(点击GIT Bash Here)(1)
图5——将仓库内文件传到本地操作(2)
然后在存放仓库内文件的本地文件夹中按照图4所示打开GIT,初次使用时需要在弹出的命令行窗口内使用git config --global命令输入GIT账号及密码进行登陆,如下图所示:
图6——在GIT程序中登陆GIT账户
之后在之前创建的与自己账户同名的文件夹上单击鼠标右键,在弹出菜单内选择Git Bash Here,然后在弹出的命令行窗口中进行git add和git commit操作。
图7——git add和git commit操作
可以看到,上面的命令已成功执行(前面有个错误提示,是因为路径没选到里面,系统已自动更改正确),这之后,就可以通过git push命令将改动推到自己的同名仓库中了。输入完git push后,弹出一个窗口要求登录git账号,输入用户名或邮箱地址及密码登录即可。
图8——执行push操作并登录git账号
最终等待成功push后,向源仓库发起pull request,发起请求成功后,代码提交就完成了。
四、单元测试与回归分析
1、单元测试:
在执行单元测试前,需要把所有的类和方法的修饰符改为public,否则在单元测试代码中会无法访问。之后按照作业要求设置完成后,就可以开始写单元测试代码进行测试。
图9——将所有类和方法的修饰符改为public
然后在需要进行单元测试的代码处点击鼠标右键,在弹出菜单中选择创建单元测试,弹出图示界面。
图10——创建单元测试
这里需要注释掉上面图示位置中的Assert.Fail();,因为这句语句表示在不检查任何条件的情况下使断言失败,必须注释掉。
写好测试代码后,在菜单栏上找到测试——运行——运行所有测试就可以开始进行测试。
图11——运行写好的测试代码进行单元测试
图12——单元测试成功通过
这里需要进行多次测试来保证被测试的方法一定正确。
单元测试时遇到的问题:在写完测试代码后出现错误提示找不到类或方法Calculate。
解决方法:在源代码内的class Program前添加修饰符public。
2、回归测试
在旧代码被修改后,需要进行回归测试,来保证代码修复、改进或重构之后的正确性。每改动一次旧代码就需要进行一次回归测试。
例如:
将源代码中Calculate方法中判断是否出现小数的代码全部删去,重新进行测试,将被测试算式改为“8.2/3+5”时,测试成功通过。
3、设置断点和监视感兴趣的变量
在要设置断点的行序号旁用鼠标左键单击,出现下图中的小红点就说明已经成功设置了断点。
图13——设置断点
下面进行单步运行和监视变量:
在设置完断点后,启用debug模式进行单步运行操作,并按照作业要求设置监视变量。
图14——开始单步运行操作
图15——运行结果(这里选择监视result变量,从图中可以看到虽成功生成了一个表达式,但由于在计算方法前设置了断点的原因无法进行后续的计算操作)
4、效能分析
图16——进行效能分析后的结果(生成表达式数量为10000个)
总结:
通过这次项目,学习了GIT的使用方法和对项目进行测试的一些方法,同时,这也是我首次写这样的一个自动生成四则运算题目程序。在写代码时,由于基础不好,写起来十分吃力,通过询问同学,上网查询等方法,一步步的解决了这些问题。我深深的感受到了编写软件的不易,也对团队开发流程有了更为深刻的了解,同时也觉得GIT在团队开发时是十分重要的,以后会多加练习,熟练使用它。
在对本次工具的熟悉过程中,我学会了如何将自己写好的代码上传至GIT的仓库中,同时也感受到了单元测试和回归分析的重要性。这些都对我以后的编程很有帮助。
在提交这篇博客前,由于某些原因,push操作未成功进行,现在补上截图:
然后点击上图中绿色按钮,等待仓库主人通过审核就ok了!
上传成功截图: