第四次作业:个人项目-小学四则运算 “软件”之初版
作业要求来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186
我的github地址:https://github.com/ShumeiHe/FourArithmetic
一、需求分析
具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。并且要求能处理用户的输入,并判断对错,打分统计。
二、功能设计
1. 输出相应数目的四则运算(加减乘除)题目及答案;
2. 随机产生具有三个操作数和两个运算符的四则运算;
3. 四则运算的答案不能为负数,如果为负数则重新输入该道题目;
4. 对用户的输入答案进行判断,正确则加分,错误则不加分,并予以提示。满分为100分;
5. 输出用户的总分数。
三、详细设计
1. 数据处理:因为除法运算的缘故,所以输出结果全部为保留小数两位的浮点数。
随机产生三个操作数并且保存至操作数数组中:
private static int[] number = new int[3]; //操作数数组。
随机产生两个运算符并且保存至运算符数组中:
private static int[] operate = new int[2]; //运算符数组,以两个运算符操作
将产生的操作数与运算符按一定的顺序存至题目数组中:
private static String[][] topic = new String[100][7]; //题目数组。
for (int jnum = 0; jnum < 3; jnum++) { topic[i][2 * jnum] = String.valueOf(number[jnum]); //题目数组与操作数数组索引值关系。 } for (int jop = 0; jop < 2; jop++) { topic[i][2 * jop + 1] = getOp(operate[jop]); }
2.运算符的优先级:
//加减乘除运算,优先级运算。 public static double operation(int randomop, double num1, double num2) { if (randomop == 0) { return num1 + num2; } if (randomop == 1) { return num1 - num2; } if (randomop == 2) { return num1 * num2; } if (randomop == 3) { return num1 / num2; } return 0;
3.运算:遍历运算符数组,
① 若第二个运算符operate[1]为乘法或者除法运算,则第二个操作数number[1]与第三个操作数number[2]进行运算得出的结果再与第一个操作数number[0]运算;
② 若第二个运算符operate[1]不为乘法或者除法运算,则按顺序运算。
public static double getResult() { //第二个运算符为乘法或者除法运算。 if (operate[1] >= 2) { double result = operation(operate[1], number[1], number[2]); result = operation(operate[0], number[0], result); result=Double.valueOf(String.format("%10.2f", result));//保留两位小数。 return result; } //顺序运算。 else { double result = operation(operate[0], number[0], number[1]); result = operation(operate[1], result, number[2]); result=Double.valueOf(String.format("%10.2f", result)); return result; }
4.输入运算结果:判断答案与输入的结果是否相等,若相等则加分,若不相等则不加分。
四、运行结果
随机产生五道四则运算:
五、问题及解决办法
1. 该项目的核心是运算符的优先级运算。本次所使用的方法仅考虑到两个运算符运算,并未考虑到两个以上的运算符的运算。在此之前,我考虑到两个以上的运算符运算的需求,但是本人发现代码复杂逻辑混乱,而且使用的是java编程语言,并没有c语言的指针好用,短时间内没有找到解决方法,所以就放弃了该需求。
如下图:(使用指针明显更方便,如果使用数组直接置空,空值是不能进行运算)
六、过程耗时估计统计表
PSP2.1 |
Personal Software Process Stages |
Time Senior Studen(h) |
Time(h) |
Planning |
计划 |
0.5 |
0.5 |
Estimate |
估计这个任务需要多少时间 |
5 |
4 |
Development |
开发 |
4 |
3 |
Analysis |
需求分析 |
0.5 |
0.5 |
Design Spec |
生成设计文档 |
0 |
0 |
Design Review |
设计复审 |
0.5 |
0.5 |
Coding Standard |
代码规范 |
0.5 |
0.5 |
Design |
具体设计 |
0.5 |
1 |
Coding |
具体编码 |
4 |
3 |
Code Review |
代码复审 |
1 |
0.5 |
Test |
测试(自我测试,修改代码,提交修改) |
0.5 |
1 |
Reporting |
报告 |
1 |
1 |
|
测试报告 |
0 |
0 |
|
计算工作量 |
5 |
4 |
|
并提出过程修改计划 |
0 |
0 |