img next() scan first pla font planning lan cell
1、控制运算表达式题目数量,控制题目中数值的大小
2、题目中存在分数形式要进行约分
3、运算符个数不能超过3个
4、不能出现重复题目,即两个运算表达式的计算步骤不能完全相同
5、程序同时支持计算生成的每道题目,并对结果进行约分
6、对用户所做答案进行判断,并且输出正确答案或错误答案
基本功能
1、根据控制台输入的数字随机生成指定运算元个数和算式数目的运算符
2、基本的四则运算功能
3、式子中的分数和最终计算结果均约分到最简
环境
windows10+java
程序结构设计
- 随机数生成方法:
- public Num createNum(int range)
- package method;
- import java.util.Random;
- import method.Num;
- public class randomNum {
- public Num createNum(int range) {
- Num num = new Num();
- Random rand = new Random();
- int numerator = rand.nextInt(range + 1);
- int denominator = rand.nextInt(10) + 1;
- if (rand.nextInt(1) == 1) {
- num.setNumerator(numerator);
- num.setDenominator(1);
- } else {
- num.setNumerator(numerator);
- num.setDenominator(denominator);
- }
- num = reduction(num);
- return num;
- }
- public Num reduction(Num num) {
- int numerator = num.getNumerator();
- int denominator = num.getDenominator();
- if (numerator == 0) {
- num.setDenominator(1);
- return num;
- }
- int divisor = getMaxDivisor(numerator, denominator);
- if (divisor == 1) {
- return num;
- } else {
- num.setNumerator(num.getNumerator() / divisor);
- num.setDenominator(num.getDenominator() / divisor);
- return num;
- }
- }
- public int getMaxDivisor(int numerator, int denominator) {
- if (denominator == 0) {
- return numerator;
- } else {
- return getMaxDivisor(denominator, numerator % denominator);
- }
- }
- }
- 随机运算符生成方法:
- public String createOperator()
- package method;
- import java.util.Random;
- public class randomOperator {
- public String createoperator() {
- String operator = null;
- Random rand = new Random();
- int n = rand.nextInt(4);
- switch (n) {
- case 0:
- operator = "+";
- break;
- case 1:
- operator = "-";
- break;
- case 2:
- operator = "*";
- break;
- case 3:
- operator = "÷";
- break;
- default:
- operator = "+";
- break;
- }
- return operator;
- }
- }
- 表达式表示:
- 类型:ArrayList
- 组成方法:
- public ArrayList<Object> createArithmetic(int range)
- 逆波兰式转换:
- public ArrayList<Object> toRPN(ArrayList<Object> list)
- 逆波兰式计算
- public Num countRPN(ArrayList<Object> right)
- private Num twoResult(String is, Num op1, Num op2)
- package method;
- import java.util.ArrayList;
- import java.util.Iterator;
- import method.Num;
- import method.Stacks;
- public class RPN {
- public ArrayList<Object> toRPN(ArrayList<Object> list) {
- ArrayList<Object> right = new ArrayList<Object>();// 存储右序表达式
- Stacks aStack = new Stacks();// 栈
- String operator;
- int position = 0;// 当前指针位置
- while (true) {
- // 当前指针为符号
- if (isOperator(list.get(position).toString())) {
- // 栈为空,或指针为(,直接进栈
- if (aStack.top == -1
- || ((String) list.get(position)).equals("(")) {
- aStack.push(list.get(position));
- } else {
- // 指针为)
- if (((String) list.get(position)).equals(")")) {
- // 将栈内(后的运算符出栈
- while (true) {
- if (aStack.top != -1
- && !((String) aStack.top()).equals("(")) {
- operator = (String) aStack.pop();
- right.add(operator);
- } else {
- if (aStack.top != -1)
- aStack.pop();
- break;
- }
- }
- } else {
- while (true) {
- // 栈不为空,判断优先级
- if (aStack.top != -1
- && priority((String) list.get(position),
- (String) aStack.top())) {
- operator = (String) aStack.pop();
- if (!operator.equals("("))
- right.add(operator);
- } else {
- break;
- }
- }
- aStack.push(list.get(position));
- }
- }
- }
- // 数字入栈
- else {
- right.add(list.get(position));
- }
- position++;
- if (position >= list.size())
- break;
- }
- // 栈内剩余运算符出栈
- while (aStack.top != -1) {
- operator = (String) aStack.pop();
- if (!operator.equals("("))
- right.add(operator);
- }
- return right;
- }
- // 判断是否为运算符
- public static boolean isOperator(String operator) {
- if (operator.equals("+") || operator.equals("-")
- || operator.equals("*") || operator.equals("÷")
- || operator.equals("(") || operator.equals(")"))
- return true;
- else
- return false;
- }
- // 设置操作符号的优先级别
- public static boolean priority(String operatorout, String operatorin) {
- int m = 0, n = 0;
- String addop[][] = { { "+", "-", "*", "÷", "(", ")" },
- { "+", "-", "*", "÷", "(", ")" } };
- int first[][] = { { 1, 1, 2, 2, 2, 0 }, { 1, 1, 2, 2, 2, 0 },
- { 1, 1, 1, 1, 2, 0 }, { 1, 1, 1, 1, 2, 0 },
- { 2, 2, 2, 2, 2, 0 }, { 2, 2, 2, 2, 2, 2 } };
- for (int i = 0; i < 6; i++) {
- if (operatorin.equalsIgnoreCase(addop[0][i]))
- m = i;
- }
- for (int i = 0; i < 6; i++) {
- if (operatorout.equalsIgnoreCase(addop[1][i]))
- n = i;
- }
- if (first[m][n] == 1) {
- return true;
- } else
- return false;
- }
- // 逆波兰式计算
- public Num countRPN(ArrayList<Object> right) {
- // 栈
- Stacks aStack = new Stacks();
- Num op1, op2, result = null;
- String is = null;
- Iterator<Object> it = right.iterator();
- while (it.hasNext()) {
- Object ob = it.next();
- is = ob.toString();
- if (isOperator(is)) {
- op2 = (Num) aStack.pop();
- op1 = (Num) aStack.pop();
- Num do_0 = twoResult(is, op1, op2);
- if (do_0.getDenominator() == 0) {
- return (new Num(-1, 1));
- }
- aStack.push(do_0);
- } else
- aStack.push(ob);
- }
- result = (Num) aStack.pop();
- return result;
- }
- // 计算两个数
- private Num twoResult(String is, Num op1, Num op2) {
- // 结果数
- Num result = new Num();
- randomNum f1 = new randomNum();
- // 获取分子分母
- int n1 = op1.getNumerator();
- int d1 = op1.getDenominator();
- int n2 = op2.getNumerator();
- int d2 = op2.getDenominator();
- // 判断运算符
- switch (is) {
- case "+":
- if (d1 != d2) {
- n1 = n1 * d2;
- n2 = n2 * d1;
- d1 = d1 * d2;
- d2 = d1;
- result.setNumerator(n1 + n2);
- result.setDenominator(d1);
- result = f1.reduction(result);
- } else {
- result.setNumerator(n1 + n2);
- result.setDenominator(d1);
- result = f1.reduction(result);
- }
- break;
- case "-":
- if (d1 != d2) {
- n1 = n1 * d2;
- n2 = n2 * d1;
- d1 = d1 * d2;
- d2 = d1;
- result.setNumerator(n1 - n2);
- result.setDenominator(d1);
- result = f1.reduction(result);
- } else {
- result.setNumerator(n1 - n2);
- result.setDenominator(d1);
- result = f1.reduction(result);
- }
- break;
- case "*":
- result.setNumerator(n1 * n2);
- result.setDenominator(d1 * d2);
- result = f1.reduction(result);
- break;
- case "÷":
- if (n2 == 0) {
- result = new Num(0, 0);
- break;
- }
- result.setNumerator(n1 * d2);
- result.setDenominator(d1 * n2);
- result = f1.reduction(result);
- break;
- default:
- break;
- }
- return result;
- }
- }
- package method;
- import java.util.ArrayList;
- import java.util.Scanner;
- import method.Arithmetic;
- import method.RPN;
- public class Main {
- public static void main(String[] args) {
- Arithmetic arithmetic = new Arithmetic();
- ArrayList < Object > list = arithmetic.createarithmetic(3);
- for (int i = 0; i < list.size(); i++) {
- System.out.print(list.get(i));
- }
- RPN rpn = new RPN();
- ArrayList < Object > right = rpn.toRPN(list);
- Num num = new Num();
- num = rpn.countRPN(right);
- String a = num.toString();
- Scanner answer = new Scanner(System. in );
- System.out.println();
- System.out.print("输入答案:");
- String name = answer.nextLine();
- if (name.equals(a)) {
- System.out.println("正确 ");
- } else {
- System.out.println("错误 ");
- System.out.print("正确答案:" + a);
- }
- }
- }
PSP2.1 | Personal Software Process Stages | Time Senior Student | Time |
Planning | 计划 | 10 | 10 |
· Estimate | 估计这个任务需要多少时间 | 10 | 8 |
Development | 开发 | 158 | 324 |
· Analysis | 需求分析 (包括学习新技术) | 13 | 7 |
· Design Spec | 生成设计文档 | 17 | 8 |
· Design Review | 设计复审 | 5 | 3 |
· Coding Standard | 代码规范 | 10 | 21 |
· Design | 具体设计 | 20 | 50 |
· Coding | 具体编码 | 60 | 150 |
· Code Review | 代码复审 | 10 | 30 |
· Test | 测试(自我测试,修改代码,提交修改) | 20 | 20 |
Reporting | 报告 | 10 | NaN |
· | 测试报告 | 10 | NaN |
· | 计算工作量 | 10 | NaN |
· | 并提出过程改进计划 | 20 | NaN |
第一次作业——四则运算
来源: http://www.bubuko.com/infodetail-2322894.html