第二次作业——熟悉使用工具

 

 

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#环境配置已经配置完成,在以前的下载配置过程中并未出现什么问题,下图是安装时间截图。

 

安装好的Visual Studio 2017

图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了!

上传成功截图:

 

posted @ 2019-03-29 17:45  玉米yumi  阅读(269)  评论(2编辑  收藏  举报