完善课上的口算题卡代码,实现重复题目的检测、题目数字范围、加减乘除算式的参数化等扩展功能,提交代码和运行截图。
import java.util.*;
public class test {
    private static String strTest = "";
    private static final Random RANDOM = new Random();
    private static final Scanner SCANNER = new Scanner(System.in);
    private static Integer number_random;
    public static void main(String[] args) {
        System.out.print("请输入参与数字的最大值:");
        number_random = SCANNER.nextInt();
        System.out.print("请输入要生成题目数量:");
        getExpression(SCANNER.nextInt());
    }
    /**
     * 计算公约数(在下面getExpression方法里面已经排除 0 )
     */
    public static int gcd(int a, int b) {
        if (a % b == 0) {
            return b;
        } else {
            return gcd(b, a % b);
        }
    }
    /**
     * 获取随机运算符
     */
    public static char getOperator() {
        char[] signal = {'+', '-', '*', '/'};
        return signal[RANDOM.nextInt(4)];
    }
    /**
     * 生成表达式
     */
    public static void getExpression(int getNums) {
        char operator1, operator2;
        int num1, num2, num3;
        while (getNums > 0) {
            boolean flag = false;
            getNums--;
            operator1 = getOperator();
            operator2 = getOperator();
            //保证两个不同的运算符
            while (operator1 == operator2) {
                operator1 = getOperator();
                operator2 = getOperator();
            }
            // + 1 是避免出现 0
            num1 = RANDOM.nextInt(number_random) + 1;
            num2 = RANDOM.nextInt(number_random) + 1;
            num3 = RANDOM.nextInt(number_random) + 1;
            //以下判断只是为了初步判断是否出现小数和负数
            if (operator1 == '/') {
                if (gcd(num1, num2) != num2) {
                    flag = true;
                }
            }
            if (operator2 == '/') {
                if (gcd(num2, num3) != num3) {
                    flag = true;
                }
            }
            if (operator1 == '-') {
                if (num1 - num2 <= 0) {
                    flag = true;
                }
            }
            if (operator2 == '-') {
                if (num2 - num3 <= 0) {
                    flag = true;
                }
            }
            if (operator1 == '*') {
                if (num1 * num2 > 99) {
                    flag = true;
                }
            }
            if (operator2 == '*') {
                if (num2 * num3 > 99) {
                    flag = true;
                }
            }
            if (operator1 == '+') {
                if (num1 + num2 > 99) {
                    flag = true;
                }
            }
            if (operator2 == '+') {
                if (num2 + num3 > 99) {
                    flag = true;
                }
            }
            if (flag) {
                getNums++;
                continue;
            }
            strTest += num1 + "" + operator1 + "" + num2 + "" + operator2 + num3;
            String str = calculate(strTest);
            strTest = "";
            double res = Double.parseDouble(str);
            int intRes = (int) res;
            if (intRes >= 0 && intRes <= 100) {
                String res2 = "" + num1 + "" + operator1 + "" + num2 + "" + operator2 + "" + num3 + "" + '=' + "" + intRes;
                String replace = res2.replace('/', '÷');
                System.out.println(replace);
            } else {
                getNums++;
            }
        }
    }
    public static String calculate(String expression) {
        List<String> num;
        Stack<Double> stack;
        num = transformEnd(expression);
        stack = new Stack<>();
        double sum;
        while (!num.isEmpty()) {
            String temp = String.valueOf(num.remove(0));
            if (isNumber(temp)) {
                double s = Double.parseDouble(temp);
                stack.push(s);
            } else {
                double a = stack.pop();
                double b = stack.pop();
                double c = calTwo(b, a, temp);
                stack.push(c);
            }
        }
        sum = stack.pop();
        return String.valueOf(sum);
    }
    /**
     * 计算两个值
     */
    private static double calTwo(double a, double b, String opr) {
        double sum = 0.0;
        switch (opr) {
            case "+":
                sum = a + b;
                break;
            case "-":
                sum = a - b;
                break;
            case "*":
                sum = a * b;
                break;
            case "/":
                sum = a / b;
                break;
        }
        return sum;
    }
    /**
     * 将中缀表达式转化为后缀表达式(栈是用来进出运算的符号)
     */
    public static List<String> transformEnd(String expre) {
        List<String> sb = new ArrayList<>();
        Stack<String> stack = new Stack<>();
        expre = expre.replaceAll("(\\D)", "o$1o");
        String[] esp = expre.trim().split("o");
        for (String value : esp) {
            String s = value.trim();
            if (isNumber(s)) {
                // 如果是数字则输出
                sb.add(s);
            } else if (!s.isEmpty()) {
                if (!stack.isEmpty() && !isMaxExp(s.charAt(0), stack.peek().charAt(0))) {
                    while (!stack.isEmpty() && !isMaxExp(s.charAt(0), stack.peek().charAt(0))) {
                        sb.add(stack.pop());
                    }
                }
                stack.push(s);
            }
        }
        while (!stack.isEmpty()) {
            sb.add(stack.pop());
        }
        return sb;
    }
    /**
     * 判断是否是数字
     */
    private static boolean isNumber(String str) {
        try {
            Double.parseDouble(str);
        } catch (RuntimeException e) {
            return false;
        }
        return true;
    }
    /**
     * 判断两个操作符优先级
     */
    private static boolean isMaxExp(char exp1, char exp2) {
        return transExp(exp1) > transExp(exp2);
    }
    /**
     * 优先级
     */
    private static int transExp(char exp) {
        int re = 0;
        switch (exp) {
            case '*':
            case '/':
                re = 2;
                break;
            case '+':
            case '-':
                re = 1;
                break;
        }
        return re;
    }
}
 
  
![]()