个人第2次作业:熟悉使用工具
---恢复内容开始---
1) 博客开头:
GIT地址 |
|
GIT用户名 |
2stLv |
学号后五位 |
62313 |
博客地址 |
|
作业链接 |
(2) 博客内容:
- 请以博客记录的方式,体现环境配置过程(包括遇到了哪些问题,你是如何解决的)
因电脑上本来就安装有VS2017,所以环境配置都是没问题的:
- 体现你代码设计的思路(注意:请保证代码能够运行通过)
-
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。
作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:
- 程序接收一个命令行参数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为VS2017.
- 程序接收一个命令行参数n,然后随机产生
- 观看题目先想出要有几个函数,因为要尽量保持主函数中简介,所以要确定其中有一个要产生随机数的函数RandomN(int n)
private static int RandomN(int n) { Thread.Sleep(100);//防止生成的伪随机数相同,所以设置时间间隔 Random random = new Random(); return random.Next(n); }
-
-
- 第二个需要一个产生随机符号的函数 Op()
private static string Op() { Thread.Sleep(100); Random random = new Random(); int a = random.Next(4) + 1; switch(a) { case 1: return "+"; case 2: return "-"; case 3: return "*"; case 4: return "/"; } return "0"; }
这里我不知道怎么用random直接从+-*/里面随机出来,所以我选择了比较笨的方法,用random选出数字然后用switch进行选择,同样的,为了防止生成相同的伪随机数,设置了时间间隔。
- 下一步就要生成算式了,构造函数 Formula()
private static string Formula() { string formula; int Operator = RandomN(2) + 2; formula = Convert.ToString(RandomN(100)); for (int j = 1; j < Operator + 1; j++) { formula = formula + Op() + Convert.ToString(RandomN(100)); } return formula; }
算式中数字永远比符号多一个,所以要在循环(用于产生一个符号与一个数字)外面先生成一个数字,将生成的算式形成string类型返回。
- 算式有了之后就是计算算式了,这里本来想用循环依次读取string中的内容然后挑出算符利用switch进行计算,但是网上搜到方法有一个DateTable中的Compute可以直接对算式进行计算,所以这里构造函数 CalcByDataTable(string expression)
internal static double CalcByDataTable(string expression) { DataTable table = new DataTable(); string value = table.Compute(expression, "").ToString(); return Convert.ToDouble(value); }
最后以double类型返回
- 算式计算出之后就要检查条件了,看结果是否符合老师要求,这里构造函数 Judge(double result)
private static int Judge(double result) { if (result<=500&&result>=0&&(result%1)==0) { return 1; } else return 0; }
考虑到一年级不会接触到很大的数,所以刚开始设置的条件中是结果不能大于一百,但是这样产生算式的效率大大降低,改到了500,一年级应该能承受得住,限制条件越多越苛刻生成算式的效率就越低
- 算式符合要求后就要写入文件中,此处构造函数 WriteTxtToFile(string Strs)
public static void WriteTxtToFile(string Strs) { if (string.IsNullOrEmpty(Strs)) return; if (Directory.Exists("D:subject.txt")) //如果不存在就创建file文件夹 { Directory.CreateDirectory("D:subject.txt"); } StreamWriter sw = new StreamWriter("D:subject.txt", true, System.Text.Encoding.Default); sw.WriteLine(Strs); //写入字符串 sw.Close(); }
- 主函数:
static void Main(string[] args) { int n; Console.Write("请输入你想要得到的算式的数目:"); n = Convert.ToInt32(Console.ReadLine()); for (int i=0;i<n;) { string formula = Formula(); if (Judge(CalcByDataTable(formula)) == 1) { string final; final = formula + "=" + CalcByDataTable(formula); Console.WriteLine(final); WriteTxtToFile(final); i++; }
主函数中的杂乱元素还是很多,所以后期还想着手对其他函数进行优化,但是时间有限,就先这样吧
- 运行:产生10条结果:
能正常运行并输出结果。
- 存在的问题以及后期改进意见:
- 因为限制是100以内的数字,即便不是很大,但是相乘起来结果会很大,相除起来的话结果会很小,这些都会被筛选下去,降低程序的效率,所以后期可以对程序进行改进:当遇到*和/时,下一个随机数在10以内,方便学生计算,也提高程序的效率
- 简化main函数中的内容
- 第二个需要一个产生随机符号的函数 Op()
- 记录你使用github克隆项目以及提交代码的整个过程(包括遇到的问题,你是如何解决的)
- 登录到github打开提供的仓库之后 点击clone or download复制链接
-
然后去git官网下载git安装到计算机上,在要存放项目的地方右键运行git bash
运行gitbash后在gitbash内输入代码进行项目的拷贝下载
输入的是 git clong "刚才复制的地址" 随后项目就保存在了此目录下
在编写完项目后,再次使用git上传,要先运行“git add"和"git commit"在运行git commit的时候要带-m,然后双引号对项目的描述
最后用git push进行上传,输入git push之后会弹出来github登录框,进行登录
登陆成功后即上传成功
-
在自己的git仓库里面能看到项目
点击new pull request进入项目提交界面
因为我的已经提交了,所以没有create pull request按钮了,正常的应该是下面的样子:
点击绿色的按钮即可提交。
- 登录到github打开提供的仓库之后 点击clone or download复制链接
- 记录你对项目进行单元测试和回归测试的过程(包括你遇到的问题,解决的方法是什么)
- 单元测试:
- 对算数运算函数CalcByDataTable(string expression) 进行单元测试,测试4*5+2-1,期望结果为21
测试通过
- 对判断函数Judge(double result) 进行单元测试
一共有三个测试,第一个测试是函数接收正常范围内数字50,期望结果为1;第二个测试为函数接收不正常范围内数字2.5(分数),期望结果为0;第三个测试是函数接收不正常范围内数字-1(负数),期望结果为0.
测试通过。 - 测试随机生成算式函数的话,因为结果是随机的,所以无法进行固定值,只能把随机部分mock掉再进行测试,对随机数生成函数以及无返回值的写入文件函数也使用mock测试。
全部测试通过
-
- 回归测试:未发现bug故还未进行回归测试
- 效能分析:
对CPU使用率进行效能分析:
你对本次工具的熟悉过程,有什么感想?分享你学习到的新知识
这次作业使我学到了很多新的知识,以前从未有过的测试:单元测试,回归测试,效能测试。其中在做单元测试的时候遇到了很多难题,对于有返回值的函数进行测试是非常简单的,但是对于没有返回值,和生成的返回值是随机的函数来说,做起来测试是没有头绪的,上网搜了很多资料,最后知道了对于void和随机函数的测试要使用mock测试,然后又看了很多mock测试的博客,学到了这一方法的强大。
这也是我第一次使用git向github上传送项目,开端还是不错的,望以后加油。