GIT地址 | https://github.com/Chengxiaoxi-299 |
GIT用户名 | Chengxiaoxi-299 |
学号后五位 | 61404 |
博客地址 | https://www.cnblogs.com/chengxiao299 |
作业链接 | https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/homework/2793 |
一.项目背景
阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。
作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:
- 程序接收一个命令行参数 n,然后随机产生
n
道加减乘除(分别使用符号+-*/
来表示)练习题,每个数字在0
和100
之间,运算符在2
个 到3
个之间。 - 由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现
3÷5+2=2.6
这样的算式。 - 练习题生成好后,将生成的
n
道练习题及其对应的正确答案输出到一个文件subject.txt
中。
二、项目完成过程
1.配置环境
本项目使用 Visual Studio 2015 完成。
因以前完成过C#项目,且安装过程中无任何问题,已配置完成,此次直接使用未重新配置。
2.克隆项目
(本人在此之前已申请GitHub账号,在此略过注册过程;并且已安装git,故安装过程亦省略)
1.成功登陆后,拷贝此次项目中指定的班级仓库https://github.com/Jupi4ter/AchaoCalculator
2.拷贝成功
3.使用git拷贝项目到本地
- step 1 复制项目地址
- step 2 使用Git命令软件克隆到本地
- step 3 打开文件夹,新建一个文件夹,命名为自己的github用户名
3.代码设计
- step 1 新建项目文件
- step 2 代码分析设计
1.程序接收一个命令行参数 n,然后随机产生 n
道加减乘除(分别使用符号+-*/
来表示)练习题,每个数字在 0
和 100
之间,运算符在 2
个 到 3
个之间。
- 使用 Random类,产生随机数;Random.Next()函数规定范围
1 //产生运算式 2 public static string MakeFormula() 3 { 4 5 string result = null; 6 Random random = new Random(); 7 8 int Number = (int)random.Next(0, 101); 9 int op_count = (int)random.Next(2, 4); 10 result += Number; 11 12 for (int i = 0; i < random.Next(2, 4); i++) 13 { 14 Number = (int)random.Next(0, 101); 15 op_count = (int)random.Next(0, 4); 16 result = result + Operator[op_count] + Number; 17 } 18 19 return result; 20 }
2.由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6
这样的算式。
- 通过判断操作字符串中是否含有“.”和”/0“来避免小数运算和除零异常;
- 通过判断结果是否小于零和是否存在”.“避免结果出现负数或小数。
1 //计算运算式 2 public static string Solve(string formula) 3 { 4 5 DataTable dt = new DataTable(); 6 object ob = null; 7 ob = dt.Compute(formula, ""); 8 9 while (ob.ToString().Contains(".") || formula.Contains("/0")) //判断是否存在小数和除0操作 10 { 11 12 formula = MakeFormula(); 13 ob = dt.Compute(formula, ""); 14 } 15 while (Convert.ToInt32(ob) < 0 || ob.ToString().Contains(".")) //结果出现负数或小数,则重新生成 16 { 17 formula = MakeFormula(); 18 ob = dt.Compute(formula, ""); 19 } 20 return formula + "=" + ob.ToString(); 21 }
3.练习题生成好后,将生成的 n
道练习题及其对应的正确答案输出到一个文件 subject.txt
中。
1 //保存至本地 2 try 3 { 4 StreamWriter sw = new StreamWriter(@"G:subject.txt"); 5 sw.Write(finalResult); 6 sw.Close(); 7 } 8 catch 9 { 10 Console.WriteLine("Error saving text file!"); 11 }
4.单元测试
step 1 将所有类和函数的访问修饰符改为 public;
step 2 在需要测试的位置右键创建单元测试
step 3 右键运行测试或从菜单栏中找到测试→运行所有测试
注意:单元测试设计多个测试用例测试最佳,单个用例通过并不能说明函数一定正确。
5.断点
设置断点: 在要设置断点的行号旁用鼠标单击一下出现下图中的小红点即可
单步运行:设置好断点之后启动Debug模式
设置监视:方法如下图所示
条件断点:设置方法如下图
6.回归测试
回归测试是指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。自动回归测试将大幅降低系统测试、维护升级等阶段的成本。
7.效能分析
点击 IDE 顶部菜单栏中的 分析
,即可看到 性能探查器
。勾选CPU使用率
输入较大的N,探查效果更佳
点击 创建详细的报告,如下图
8.上传代码
step 1 使用 git add 和 git commit 命令对本地仓库进行修改
step 2 使用 git push origin <branch> 命令上传至远程仓库
step 3 登陆远程仓库,点击 New pull request 按步骤通过申请
项目总结
在本次任务中
- 熟悉了git的基本操作
- 了解了单元测试、回归测试、效能分析等基本功能
在代码设计过程中
初次分析需求后考虑使用栈实现,在后期实现过程中认为过于繁琐后,采用了现在的设计思路完成了功能需求。属于边写边改模型,感受到了该模型的缺点:效率低下,代码混乱等。
在以后的项目中
- 更加认真的分析项目需求,选择较好的设计模式,避免边写边改的情况发生
- 充分利用单元测试检测代码的可靠性