首页 > 编程语言 >随机生成三百道四则混合运算题目程序

随机生成三百道四则混合运算题目程序

时间:2024-04-23 23:22:37浏览次数:70  
标签:题目 String 三百 postfix operators random System return 四则

2252136 2252130
这位是一个程序,可以随机生成300道四则混合运算题目程序,并可以输入题号做题,输入答案后,程序会判定你做的是否对。

点击查看代码
public class Operation {
    public static void main(String[] args) {
        List<String> validEquations = generateValidEquations(300);
        Scanner scanner = new Scanner(System.in);
        boolean continueAnswering = true;

        while (continueAnswering) {
            for (int i = 0; i < validEquations.size(); i++) {

                System.out.println((i + 1) + ": " + validEquations.get(i).replace('*', '×').replace('/', '÷'));
            }

            System.out.println("请输入您要解答的题号 (1-300):");
            int questionNumber = scanner.nextInt();

            if (questionNumber < 1 || questionNumber > 300) {
                System.out.println("输入的题号无效。程序退出。");
                continue;
            }

            String selectedEquation = validEquations.get(questionNumber - 1).replace(" = ?", "");
            System.out.println("请解答以下等式: " + selectedEquation.replace('*', '×').replace('/', '÷'));

            double correctAnswer = evaluateExpression(selectedEquation);
            System.out.println("请输入您的答案:");
            double userAnswer = scanner.nextDouble();

            if (Math.abs(correctAnswer - userAnswer) < 0.01) {
                System.out.println("回答正确!");
            } else {
                System.out.printf("回答错误!正确答案是:%.2f\n", correctAnswer);
            }

            System.out.println("您想继续做题吗?(yes/no)");
            String answer = scanner.next();
            continueAnswering = "yes".equalsIgnoreCase(answer);
        }

        scanner.close();
        System.out.println("感谢您的参与!");
    }

    public static List<String> generateValidEquations(int count) {
        List<String> equations = new ArrayList<>();
        Random random = new Random();
        while (equations.size() < count) {
            String equation = generateEquation(random);
            double result = evaluateExpression(equation);
            if (result > 0 && result < 1000 && result == Math.floor(result)) {
                equations.add(equation + " = ?");
            }
        }
        return equations;
    }

    public static String generateEquation(Random random) {
        int num1 = random.nextInt(100) + 1;
        int num2 = random.nextInt(100) + 1;
        int num3 = random.nextInt(100) + 1;
        char operator1 = generateOperator(random);
        char operator2 = generateOperator(random);
        return String.format("%d %c %d %c %d", num1, operator1, num2, operator2, num3);
    }

    public static char generateOperator(Random random) {
        char[] operators = {'+', '-', '*', '/'};
        return operators[random.nextInt(operators.length)];
    }

    public static double evaluateExpression(String expression) {
        // Simple evaluation logic
        String[] postfix = infixToPostfix(expression);
        return evaluatePostfix(postfix);
    }

    private static String[] infixToPostfix(String expression) {
        List<String> postfix = new ArrayList<>();
        Stack<Character> operators = new Stack<>();
        StringTokenizer tokenizer = new StringTokenizer(expression, " +-*/()", true);
        while (tokenizer.hasMoreTokens()) {
            String token = tokenizer.nextToken().trim();
            if (token.isEmpty()) {
                continue;
            }

            char c = token.charAt(0);
            int idx = "+-*/".indexOf(c);

            if (idx != -1) {
                while (!operators.isEmpty() && precedence(operators.peek()) >= precedence(c)) {
                    postfix.add(String.valueOf(operators.pop()));
                }
                operators.push(c);
            } else if (c == '(') {
                operators.push(c);
            } else if (c == ')') {
                while (!operators.isEmpty() && operators.peek() != '(') {
                    postfix.add(String.valueOf(operators.pop()));
                }
                operators.pop();
            } else {
                postfix.add(token);
            }
        }

        while (!operators.isEmpty()) {
            postfix.add(String.valueOf(operators.pop()));
        }

        return postfix.toArray(new String[0]);
    }

    private static int precedence(char op) {
        switch (op) {
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
            default:
                return -1;
        }
    }

    private static double evaluatePostfix(String[] postfix) {
        Stack<Double> stack = new Stack<>();
        for (String token : postfix) {
            if (token.length() == 1 && "+-*/".contains(token)) {
                double b = stack.pop();
                double a = stack.pop();
                switch (token.charAt(0)) {
                    case '+':
                        stack.push(a + b);
                        break;
                    case '-':
                        stack.push(a - b);
                        break;
                    case '*':
                        stack.push(a * b);
                        break;
                    case '/':
                        stack.push(a / b);
                        break;
                }
            } else {
                stack.push(Double.parseDouble(token));
            }
        }
        return stack.pop();
    }
}

答案正确:

答案错误:

标签:题目,String,三百,postfix,operators,random,System,return,四则
From: https://www.cnblogs.com/one111/p/18154064

相关文章

  • 二叉树深度的题目
    #这是一道关于二叉树深度的题目。题目要求我们输入一个二叉树的结点数和每个结点的左右子结点编号,然后输出这棵二叉树的最大深度。#对于这个问题,我们可以使用递归的方法来求解。以下是一个Python的代码示例: depth=1defdfs(node,depth):ifnode==0:retu......
  • PTA题目集1~3的总结性Blog
    第一次:难度:类内方法不复杂,只有3种信息输入,且有类设计的提示。相对简单。题量:需要1~2天知识点:类设计,字符串处理等基础语法,正则表达式。————————————————————————设计与分析——————————————————————————————————类设......
  • 对于前三次的pta题集练习,由于我的偷懒和迟钝,有许多部分没有完成,但在此我还是对题目集
    第一道大题题目信息7-1答题判题程序-1分数50作者蔡轲单位南昌航空大学设计实现答题程序,模拟一个小型的测试,要求输入题目信息和答题信息,根据输入题目信息中的标准答案判断答题的结果。输入格式:程序输入信息分三部分:1、题目数量格式:整数数值,若超过1位最高位不能为0,......
  • 题目集1~3总结
    一、前言知识点:面向对象设计的原则,如封装、单一职责,用正则表达式匹配,集合框架的使用,动态数组。题量和难度都是依次递加的。二、设计与分析1.第一次作业:输入格式处理:处理整数输入,确保题号符合要求(首位不为0)。解析题目内容,包括题目编号、问题和答案。(正则表达式的使用,字符串......
  • 题目集1-3的总结性Bolg
    一.前言:在这几周,我们进行了3次pta的题目训练。每次的题目集的最后一个答题程序不断迭代,使题目集的难度不断增大,压力很大。不过与此同时,这也使我们学到了很多。以下是我的初步总结:1.知识点在我看来,答题程序实现的关键有两点。第一点是正确的使用正则表达式等技术提取输入信息,从......
  • 对题目集1~3的总结
    1.前言这三次题目集主要考察对字符串分割,判定输入格式,提取有用信息,最后进行对信息的处理。题目的要求及信息条件较多,在写代码时很容易缺漏一些特殊情况,考虑不周。对我而言并不简单,有很多测试点没过。2.设计与分析答题判题程序-1点击查看题目信息设计实现答题程序,模......
  • OPP面向对象前三次题目总结
    一.前言: 第一次大作业:作为三次作业里面最简单的一次作业,第一次作业里面没有什么涉及到那种特别大的程序,并且对类的使用也没有那么的明显,虽然有5道题,但基本上使用面向过程的思维就可以解决完,主要是对java的一些语法和一些方法的训练而已,对于新手来说难度比较适中。尽管如此,由于......
  • PTA题目集1~3的总结
    目录:1)前言2)设计与分析3)踩坑心得4)改进建议5)总结1.前言:Java作为本学期的新学语言,难度相较于上学期的c语言有很大提升,由易到难的过程也更加考验我们的学习和理解能力。前三次题目集重点考核类设计及类间关系设计,以及正则表达式的应用等。并且在每次题目集的题目数量不多的情......
  • 第一次题目总结
    前言:本次发布的题目集1-3,主要是对类和对象的使用的考察,题量比较适中,难度设置合理,如风扇类设计比较简单,整体就是为了熟悉类的使用,后续的题目加入了一些要求,加强对类和对象的熟悉,难点集中在每次的答题系统迭代上,非常考验类之间的关联使用。每次题目集都会有一些简单的基础题目来熟......
  • PTA题目集1~3的总结
    1.前言[1]知识点:这三次题目集是针对对象和类展开的,主要是String类和正则表达式的运用。要运用到String.split,String.substring等,和通过正则表达式来判断字符串是否符合格式和拆分字符串。[2]题量:这三次题目集的题量不算很大,每次的题量有所减少,但是题目难度有所提升,每题......