当你感到学习困难的时候,你在走上坡路!
GIT地址 | https://github.com/MinChanDu |
GIT用户名 | MinChanDu |
学号后五位 | 62305 |
博客地址 | https://www.cnblogs.com/Mchandu/ |
作业链接 | https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2793 |
一、
VS安装及环境配置问题:之前学习C#的时候就已经安装过了,除了使用反应慢了点没有什么问题。当时初次安装的时候,安装完毕过后出现了路径不对,打开错误的问题,又重新卸载干净后,在选择路径的时候有留意过,解决了。
二、
代码设计思路:(PS:本人把之前学的所有东西都忘了,在完成本次作业之前,偷偷摸摸把前知识学习了,才动了手,哭哭)
(1)生成四则运算肯定是要选取随机数,采用了Random()函数
问题:测试生成数时发现数字重复率很大
解决:百度c#随机数生成不重复?
参考博客主文章:http://www.cnblogs.com/huangfr/archive/2012/03/27/2420464.html(博客是个好东西,你可以站在别人的肩膀上)
明白了,去重可以设置时间种子,设计检验是否生成的随机数有重复的函数(产生随机数放在数组里面),部分代码如下图:
public int getNum(int[] arrNum, int tmp, int minNum, int maxNum, Random ra) { int n = 0; while (n <= arrNum.Length - 1) { if (arrNum[n] == tmp) //利用循环判断是否有重复 { tmp = ra.Next(minNum, maxNum); //重新随机获取。 getNum(arrNum, tmp, minNum, maxNum, ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。 } n++; } return tmp; } public int[] getRandomNum(int num, int minNum, int maxNum) { Random ra = new Random(unchecked((int)DateTime.Now.Ticks)); int[] arrNum = new int[num]; int tmp = 0; for (int i = 0; i <= num - 1; i++) { tmp = ra.Next(minNum, maxNum); //随机取数 arrNum[i] = getNum(arrNum, tmp, minNum, maxNum, ra); //取出值赋到数组中 } return arrNum; }
(2)四则运算符号也用随机数除余抽取,主要问题在于非负和非整问题,于是本人限制了乘号和除号的位置只能在第一个(后面去取符号就不用判断前面的结果,也没有乘除法在后面的优先处理了,所以用switch循环处理符号只有在第一个switch中有’*/’),至于处理产生负数的问题,本人用变量存储了每一步结果,遇到减号需要判断大小。部分代码如下(以生成只有两个运算符的算式为例子):
public void Two_op() { int p, t; int[] arr = getRandomNum(5, 1, 100); //从1至100中取出5个互不相同的随机数,其中4,5决定操作符 int[] b = new int[1];//存储每次操作符后的结果 char[] c = new char[2];//存储确定的操作符 string d1; //存储算式及结果,后续输入到文件中 p = arr[3] % 3; switch (p) { case 0: b[0] = arr[0] + arr[1]; c[0] = '+'; break; case 1: if (arr[0] < arr[1])//排除负数结果,用大数减去小数 { t = arr[0]; arr[0] = arr[1]; arr[1] = arr[0]; } b[0] = arr[0] - arr[1]; c[0] = '-'; break; case 2: if (arr[0] % arr[1] == 0)//判断m是否可以整除n,可以就打印除法,否则做乘法 { b[0] = arr[0] / arr[1]; c[0] = '/'; } else { b[0] = arr[0] * arr[1]; c[0] = '*'; } break; default: break; } p = arr[4] % 2;//第二个操作符 switch (p) { case 0: c[1] = '+'; b[0] += arr[2]; break; case 1: if (b[0] < arr[2])//排除负数结果 { c[1] = '+'; b[0] += arr[2]; } else { c[1] = '-'; b[0] -= arr[2]; } break; default: break; } Console.WriteLine("{0}{1}{2}{3}{4}=", arr[0], c[0], arr[1], c[1], arr[2]);//打印算式 d1 = Convert.ToString(arr[0]) + Convert.ToString(c[0]) + Convert.ToString(arr[1]) + Convert.ToString(c[1]) + Convert.ToString(arr[2]) + "=" + Convert.ToString(b[0]); PutFile(d1); }
public void Two_op() { int p, t; int[] arr = getRandomNum(5, 1, 100); //从1至100中取出5个互不相同的随机数,其中4,5决定操作符 int[] b = new int[1];//存储每次操作符后的结果 char[] c = new char[2];//存储确定的操作符 string d1; //存储算式及结果,后续输入到文件中 p = arr[3] % 3; switch (p) { case 0: b[0] = arr[0] + arr[1]; c[0] = '+'; break; case 1: if (arr[0] < arr[1])//排除负数结果,用大数减去小数 { t = arr[0]; arr[0] = arr[1]; arr[1] = arr[0]; } b[0] = arr[0] - arr[1]; c[0] = '-'; break; case 2: if (arr[0] % arr[1] == 0)//判断m是否可以整除n,可以就打印除法,否则做乘法 { b[0] = arr[0] / arr[1]; c[0] = '/'; } else { b[0] = arr[0] * arr[1]; c[0] = '*'; } break; default: break; } p = arr[4] % 2;//第二个操作符 switch (p) { case 0: c[1] = '+'; b[0] += arr[2]; break; case 1: if (b[0] < arr[2])//排除负数结果 { c[1] = '+'; b[0] += arr[2]; } else { c[1] = '-'; b[0] -= arr[2]; } break; default: break; } Console.WriteLine("{0}{1}{2}{3}{4}=", arr[0], c[0], arr[1], c[1], arr[2]);//打印算式 d1 = Convert.ToString(arr[0]) + Convert.ToString(c[0]) + Convert.ToString(arr[1]) + Convert.ToString(c[1]) + Convert.ToString(arr[2]) + "=" + Convert.ToString(b[0]); PutFile(d1); }
(3)每一步的数字和符号转换成字符串存在变量的d1中,用输入文件中,函数代码如下:
public void PutFile(string x)//将算式打印到文件中 { string path = @"D:\subject.txt"; FileInfo fileInfo = new FileInfo(path); StreamWriter sw = fileInfo.AppendText(); sw.WriteLine(x); sw.Close(); }
(4)主函数用于接收题目个数,代码如下:
static void Main(string[] args) { Operation A = new Operation();//新建生成算式对象 int n, x, y, i, j; Console.WriteLine("请输入您想生成的四则运算题目个数:"); n = Convert.ToInt32(Console.ReadLine());//题目个数 x = n / 2;//生成的含有2个运算符的题目个数 y = n - x;//生成的含有3个运算符的题目个数 for (i = 0; i < x; i++) { A.Two_op();//生成x个含有2个运算符的算式 } for (j = 0; j < y; j++) { A.Third_op();//生成n-x个含有2个运算符的算式 } }
(5)结果运行截图:(博客写到这里我也是激动的,相信看客们,不止我一个人写一点,就需要去查资料吧,就那个文件覆盖问题,我也是掉了头发的~)
三、
用Git克隆提交代码:(前面注册和阿超克隆不详写,史上使用GIT最惨博主)
容许本人说下经历:先是安装它,就十几次,找不到文件,本人跑到图书馆git下载起了,VS不行,于是回到寝室,继续git,苍天啊,总算安装起了。已经式深夜了,开始提交代码,pushpush~(此处省略N次push),搞笑的是还有人问深夜不睡,心事?(不,心肌梗塞!)不详细抱怨了,过程苦并快乐着,莫名觉得满高大上的项目。(贡献经验,git提交问题处理参考:希望对git使用有问题的同学有所帮助哦~
链接一:https://www.cnblogs.com/jackchensir/p/8306448.html
链接二: https://blog.csdn.net/hanghangaidoudou/article/details/83501185)
最完美的一次push附上:
四、
单元测试和回归测试:(这段比较有意思的就是断点,可以详细的看到每个参数信息,本人开始“启动新项目”出错,就是因为在单元测试里面点的,想运行原项目,就出错了,后来关闭了测试通过的单元项目就好了)附上部分图:
还有就是查看CPU占用,以前并不清楚代码的背后,看到分析,还是感到神奇:
五、
总结:
- 首先,本次作业花费时间最大的问题就在于git安装,本人的电脑不能用git(找不到路径文件),到图书馆机房的电阅室做的;
- 随机数的生成问题,虽然百度解决了问题,但是在运行结果中,还是可以看出会有相同的算式;
- 非负,和非整问题,开始的思路是不满足,就重新生成,还要判断符号位置,觉得复杂,就采用了固定乘号除号只能生成在第一个;
- 第一次做这种作业,有点难度,但是苦并快乐着,因为很充实,自己思考出来的解决方法,虽然仍然缺点很多,但是成就感很足;
- 第一篇博客就有写,重新认真,最然很晚提交作业,但是这次作业是用心完成的,缺点很多,但是对比以前的自己进步很大,每次作业后,都希望对自己的要求慢慢提升一些,埋头苦干,只希望自己在上坡前进!
- GIT真的是个新东西,之前有听过,不爱学习,就没有去管,通过这次作业了解还可以创建自己的代码创库,神奇!
- 也希望看到这篇博客的同学加油吧,遇到困难,自暴自弃不是办法,解决完了,你会发现自己还不错!