第二次博客作业——熟悉使用工具
GIT地址 | https://github.com/anranbixin |
GIT用户名 | anranbixin |
学号后五位 | 62402 |
博客地址 | https://www.cnblogs.com/mylovertomylove/ |
作业链接 | https://www.cnblogs.com/harry240/p/11515697.html |
1、安装VS2017和配置环境
Visual Studio 2017 有着许多的优点:注重重构和代码修复,可自定义配置和执行等等。我选择使用的是 VS2017 企业版(企业版(Enterprise)),但是在作业给的是一个 VS2017 社区版(社区版(Community)指的是可免费提供给单个开发人员,给予初学者及大部分程序员支持,可以无任何经济负担、合法地使用的版本——内容来源作业博客),由于自身电脑已经有了企业版的安装包,所以我安装的是企业版的。
社区版提供了三种安装方法(来源于作业博客):
- 官网下载:点击下载链接,浏览器将自动开始下载
-
下载迅雷,输入以下ed2k链接:
ed2k://|file|mu_visual_studio_community_2017_version_15.3_x86_x64_11100062.exe|1069960|5984B3CD547F9F213DE21EFE5887F08D|/
-
百度网盘:链接: https://pan.baidu.com/s/1jJXyRMA 密码: ub6c
但是我使用的企业版:
百度网盘链接(包括激活码):pan.baidu.com/s/1_HycbxXqRfptMYEaho02bg 密码: srpx
安装教程的链接:https://mp.weixin.qq.com/s/oOAxsbAEBigxvp356yINQQ
下载完成之后双击运行,出现以下图示,然后点击继续:
由于之后的项目需要使用到C#,所以我勾选了C#的组件,并且我还勾选了C++的组建(这个是用于个人今后VS的使用),这里需要注意下载的过程比较慢,需要耐心的等待:
然后再修改保存的路径,我将我的路径改在了D盘,因为C盘的内存较小。
之后等待下载与安装,安装好的软件是在试用期的,所以我们需要进行激活,使用下载好的安装包里的一个激活码进行软件的激活,最后我就安装好了我的VS2017。
安装好的软件需要拥有C#库,我的软件满足此项:
注意:在勾选组件的时候,请勾选上C#所需的组件
安装中的问题总结:
在我安装的过程中,其实遇到的问题并不多,在此之前进行VS的安装其实出现过很多的问题,其中最多的就是组件的缺失。
因为之前觉得VS太大了,认为只需要下载自己所需的组件即可节约很多的内存,并且这样VS在使用的过程中也不会太卡顿,但是安装好的软件在使用过程中出现了很多的问题,所以这次我是根据推荐来勾选的。
所以我觉得在自己还不是很清楚自己所使用的软件的时候其实不要自己去乱弄,在我们使用软件进行编程的时候,我们要了解我们在使用的过程中大概调用了什么包,这个包由那个头文件提供的,以及这和我们之前安装的组件有什么关系。
2、我的项目代码
首先了解题目的要求:
1、计算答案不允许出现负数,不能有小数
2、运算符2~3个,数字在0~100之间。随机产生n道题
3、将生成的计算题输入到文件subject.txt中
所以我的思路是:
(1)运算符金和数字是随机产生的,这里需要用到随机数的生成(Random)。
(2)我们首先我们需要将题出出来,我这里使用函数func()来生成 。
(3)要对生成的进行验算,排除不合格的等式,这里我使用函数Vilidate(string calculation)。注意:这里需要使用到Date库的datetable,再调用compute()来生成等式函数。
(4)需要将题目写入到 subject.txt中。
first :生成随机数使用到random,其语法为:
Random ran = new Random(); int n = ran.Next(a,b);
其中a,b为范围(注意:如果想要生成数包括b,就需要把b变为b+1),但是要是的生成的数是不连续的,也就是真正的随机,需要调用Random函数,我的函数如下(主要用于生成运算符):
public string Getrandom(string[] arr) { Random ad = new Random(); int op = ad.Next(arr.Length-1); return arr[op]; }
然后生成随机数使用,注意这里运算符个数也是如此生成的:
num = ad.Next(0, 101);
但是再这里我的生成数并不是真正的随机,有很多的重复,最后想到了一个很笨的办法,把生成随机数单独做成了一个函数Getnum(int m , int[] numstore)。
这里的m相当于数组的下标,用于记录存储的每一个四则运算的随机数,然后使得他们每一个都不相同,这样就保证了其随机性:
public int Getnum(int m,int[] numstore) { int i = m; Random ad = new Random(); int num = ad.Next(0,101); for (int j = 0; j < i; j++) { if (num == numstore[j]) return Getnum(m,numstore); } numstore[i] = num; return num; }
second:生成四则运算式,我采用的是函数func():
//生成四则运算 public string func() { string[] arr = new string[] { "/", "+", "-", "*","" }; int operation;//运算符个数 int num1;//第一个数 int num2;//之后的随机数 string result = null;//四则运算式 int m = 0; int[] numstore = new int[4];//临时存储生成的随机数 Random ad = new Random(); operation = ad.Next(2, 4); num1 = Getnum(m,numstore); m++;//临时存储生成的随机数+1 result = num1.ToString(); for (int i = 1; i <= operation; i++) { num2 = Getnum(m,numstore); m++; result = result + Getrandom(arr)+num2.ToString(); } return result; }
third:验算四则运算,要使用头文件Data,再调用他的compute(string calculate ,null)函数,我采用的是Vilidate(string calculation)函数中调用compute函数。
之后再如果结果为小数或者是负数或者是除以零就重新生成新的四则运算,之后再进行验算是否合格:
//验算四则运算并将其变为合格的等式 public string Vilidate(string calculation) { DataTable dt = new DataTable(); object nnn = dt.Compute(calculation, null); //这里的“-”用于判断是否为负数,“/0”除零操作,“.”表示为小数 while ( nnn.ToString().Contains(".") || nnn.ToString().Contains("-")|| calculation.ToString().Contains("/0")) { calculation = func(); nnn = dt.Compute(calculation, null); } //返回等式,calculation为之前生成的等式,nnn为结果 return calculation + "=" + nnn.ToString(); }
fourth:将生成的等式写道subject.txt文件里,这里需要添加头文件IO,之后可以调StreamWriter,这里我才用了try{}……catch{},如果出错的提示(个人觉得这个要像这样~):
//写入subject文档 public void Write(string result) { try{ StreamWriter swer = new StreamWriter("D:\\subject.txt",true); swer.WriteLine(result); swer.Close(); } catch { Console.WriteLine("保存出错了~"); } }
last:我的主函数:
//主函数 static void Main(string[] args) { Console.WriteLine("那么接下来你想要打印出多少道题目:"); //print_num表示打印题目的数目 int print_num = int.Parse(Console.ReadLine()); for (int i = 0; i < print_num; i++) { Func aa = new Func(); string bb = aa.func();//创建等式 string result = aa.Vilidate(bb);//验证等式 aa.Write(result);//写入等式 Console.WriteLine(result);//打印出结果 } Console.ReadKey(); }
最最后放出我的成果图:
总结:
其实再 实验的过程中一直碰壁,C#忘得一干二净,刚开始自己在用c的语法乱写,全是报错啊!!!之后当然是,去看基础教程去了(恶补~)。
终于终于开始打印出东西了,但是刚开始全是一模一样的,要不然就是第一个和第二个不一样,后面的全和第一个一样!难道Random不是生成随机数吗。。。
但是这怎么能难住我,当然是想尽办法,后来有弄了一个生成随机数的函数,既然你不是真随机,那么就强制的随机,那么结果还不错~(很开心出来了)
还有就是写入文档和随机数和等式验证是搜了很多的资料,参考了很多博客,以下为博客来源:
随机数(注:我没有使用种子办法,用的是自己想的函数解决的):
https://www.cnblogs.com/Coffee-guy/p/3378776.html
写入文档(包含四种写入文档的办法):
https://www.cnblogs.com/researcher/p/4989395.html
等式验证(其中用到的Datatable用法):
https://www.cnblogs.com/myloveblogs/p/6085219.html
https://www.cnblogs.com/Blue-ZXL/p/10767072.html
3、Part2 克隆项目
我将我的项目的地址放在了GitHub源代码管理平台上,我的仓库地址:
(1)首先在 https://github.com/join 建立一个Github 账号,由于之前我注册了一个账号,我的账号链接为:https://github.com/anranbixin ,然后我进行了账户的登陆。
(2)之后将作业提供的网址里的四则运算拷贝到自己的同名仓库下,如下图所示:
(3)拷贝成功之后,可以看到自己已经拥有了一个同名仓库,如图所示(备注:我的账号是anranbixin):
(4)在自己的电脑上安装 Git 软件:
(5)将项目GIT到本地,右键点击git bash,输入git clone +之前复制的网址:
注意:这里输入那个网址的时候不允许ctrl+v,我自己在这里试了很久,然后采取的是手动的输入的,其实可以使用右键粘贴。
(6)可以看到在目录下一个与仓库同名的文件夹Calculator,打开然后建立一个自己同名(anranbixin)的文件夹:
(7)打开VS2017,新建C#控制台应用程序,如下图所示(注意:位置是之前建立的自己同GITHUB用户名的文件夹,解决方案命名为Calculator):
(8)初次使用 Git需要配置自己的个人邮箱与 Commit (注意:这里的邮箱和用户名最好与 Github 账号保持):
$ git config --global user.name "用户名"
$ git config --global user.email 邮箱
这里备注一些题目里面出现的指令(来源于博客作业):
注意:这两步要进行之后,才可以上传代码到GitHub上面。
4、代码的单元测试
(1)首先根据作业文档进行实践:
最后发现不行,在之后的检查中发现我的第一个类没有添加public,这就导致我的程序没有办法进行单元测试,一直创建不了单元测试。其实这是一个很需要细心的问题,之后开始进行单元测试。
(2)开始我的单元测试
first:右击鼠标点击“创建单元测试”:
然后进行全部的测试,发现了有很多测试不通过:
这里全是出现了大红×,然后就开始改代码,再进行测试:
之前不了解怎么去进行单元测试,后来才知道需要自己去写单元测试才行,这里详细讲一个我的一个函数的单元测试:
[TestMethod()] public void GetrandomTest() { string[] arr = new string[] { "+", "-", "*", "/" }; string op = Program.Getrandom(arr); Assert.IsTrue(op.Contains("+")||op.Contains("-")||op.Contains("*")||op.Contains("/")); }
这个是我的运算符生成函数的测试代码,而我的运算符生成函数代码为:
public static string Getrandom(string[] arr) { Random ad = new Random(); int op = ad.Next(arr.Length - 1); return arr[op]; }
注意:这里我的函数设置为了static,这是因为这样测试函数里面才可以引用这个函数。
然后展示出我的所有单元测试过程:
经过第一个测试成功,然后我开始一步一步进行所有函数的测试:
但是在这之中也遇到了一些问题:
这里显示是出现了错误,但是我们要懂得修改错误,可以根据错误提示来进行修改,后来发现我的测试代码多了一个参数,但是调用的函数是没有错误的,接着继续行动,发现我的文件的导入 哪里并不好进行测试,后来加了一个返回值(bool值):
这里可以看出所有的单元测试都是通过了的,但是这里需要进行一次总的单元测试,这是为了避免我们在进行单个单元测试的时候因为改动代码导致之前成功的单元测试失败了,然后我的是完美的通过了:
总结(单元测试):
刚开始的时候是很懵的,不知道 怎么下手,然后也创建不了单元测试,后来发现,需要将所有的类都改为public和添加为public,之后慢慢摸索开始进行单元测试。
过程很慢,但是在完成之后对自己的代码又有了更多的信心,因为出现的错误并不多。
所有的事都是循序渐进的,最后切记做完之后,需要进行一次全部彻底的单元测试。
最后需要将代码改回原样,因为单元测试对代码进行了改动,因此 ,我在此之前就保存了我的源代码。
5、基本操作——断点和监视器
在我们的编程生活中,学会使用断点和监视器是十分重要的,有时候我们直接编译的时候报错,但是我们看到的只是一个结果,是无法看到是哪里错误的,这个时候就要使用断点和监视器。所以接下来我就会进行断点和监视器的操作。
(1)断点
first:要学会如何设置断点——在你想要设置断电的那排的前面双击鼠标就可以了,如下图所示(在24行设置断点):
second:单步运行——启动debug模式,如下图所示:
我们可以看到的是单步有几个键:逐语句(step into,快捷键F11);逐过程(step over,快捷键F10),如下图所示(最后一个是跳出循环):
之后我执行了十几步之后:
third:条件断点(右击断点即可显示 ):
之后自己设置条件内容(这里我设置的t条件num=12):
之后可以看到结果:
(2)添加监测(右下角可以查看到):
总结:
断点和监测是我们必须要具备的技能啊~
6、回归测试
我是在进行单元测试的时候进行了代码的修改,但是我对代码的修改是不大的,我的每一个单元测试都是通过了的。我了解到回归测试是修改了之前代码后,重新进行测试(全部一次性的进行一个测试)以确认修改没有引入新的错误或导致其他代码产生错误。
我之前在进行生成随机的数的时候采用的是在外面定义一个变量,但是之后发现数据有时候是乱的,后来想到了一个办法就是,把数据传过来进行添加修改(有条件的),这样子问题就解决了。然后我进行的单元测试也是通过了的。
之前在进行单元测试的时候我就进行了回归测试,这里我重新进行一次回归测试,然后发现是全部通过了的,这里直接放图了:
总结:
如果出现错误,需要我们耐心的修改,仔细的回想代码哪里改动了,为什么现在其他的地方出现了问题。
7、效能工具的使用
就是这个了:
就是点击这个之后,会出现一个窗口,如下图所示:
然后点击进行之后:
经过了一段时间之后(我等待的时间比较短),可以看到下面生成了一些东西:
之后是我的CPU使用的效能分析:
以及一些其他的:
总结:
效能分析是代码的执行效率的体现,因为每个人的代码可能都是有所不同的,这里我们可以根据效能分析对代码进行优化。
但是简单的代码是看不出太大的差别的,我们的程序足够的复杂之后,他的才能够体现出他的不同之处。
8、将代码提交到GitHub上面
首先在自己建立c#项目的地方打开git bash ,然后输入指令:
进行检查之后,输入git push :
可以看到这里弹出了一个登陆的界面,然后输入自己的用户名和密码,点击登陆:
然后在页面上登陆自己的GitHub,点击之前转到自己账户上的那个项目,再点击新建:
之后再点击“create pull request”:
这个时候可以看到自己的项目上传了:
最后再输入自己的账户名和自己的学号和姓名即可:
总结:
自己是在实践中不断地学习并且摸索,在没有头绪的时候就会去查一查资料。在学习的过程的问题是肯定会有的,有的人的相同,有的人的不同。
当我在实践的过程遇到了毫无头绪的问题的时候,就在网上搜索解决办法(搜到了很多的~)。在单元测试的时候,自己遇到了很多的问题,那时在一味的在网上搜索,却没有确切的答案,最后自己一步一步的尝试了出来的。(个人觉得不能太依靠于网络搜索,那些只是一个指导方向)
在写代码的时候自己当时是很凌乱的,C#都忘的差不多了,后来恶补了一下,写出了一个自己比较满意的程序。(任何时候不会的话,就要去学习,不能拿着乱搞~)
(其中看了很多人的做法,但是几乎都是Java和C语言的,然后借鉴了很多的博客)自己慢慢的用C#去写,其实这个过程中学到了很多。
在工具的的使用过程中收获颇多,解决问题之后感受到了世界的温暖~这些工具的实用性很强。做的那些操作(断点/监视器)真的特别实用,我自己在写代码的时候就是使用的是断点来找到的代码问题。(就是使用单步调试的时候过程漫长,观察数据的时候眼睛真的不敢恍惚~)