【java】小学生数学练习题目生成系统

简介: 小学生数学练习题目生成系统

效果图:
image.png

image.png

image.png

代码:

package com.example.dingtalk.question;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

/***
 * 小学计算题生成
 */
public class MathExerciseGenerator extends JFrame {
   
   
    private JComboBox<String> operationComboBox;
    private JButton generateButton;
    private JButton evaluateButton;
    private JButton showAnswersButton;
    private JTextArea questionArea;
    private JTextField answerField;

    public MathExerciseGenerator() {
   
   
        super("小学生数学练习题目生成系统");
        initComponents();
    }

    private void initComponents() {
   
   
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        operationComboBox = new JComboBox<>(new String[]{
   
   "10以内加法", "10以内减法", "20以内加法", "20以内减法", "100以内加法", "100以内减法", "100以内乘法", "100以内除法"});
        generateButton = new JButton("出题");
        evaluateButton = new JButton("评卷");
        showAnswersButton = new JButton("答案");
        questionArea = new JTextArea(20, 40);
        answerField = new JTextField(10);

        JPanel topPanel = new JPanel();
        topPanel.add(new JLabel("选择题目类型: "));
        topPanel.add(operationComboBox);
        topPanel.add(generateButton);
        topPanel.add(evaluateButton);
        topPanel.add(showAnswersButton);

        add(topPanel, BorderLayout.NORTH);
        add(new JScrollPane(questionArea), BorderLayout.CENTER);
        add(answerField, BorderLayout.SOUTH);

        generateButton.addActionListener(new ActionListener() {
   
   
            @Override
            public void actionPerformed(ActionEvent e) {
   
   
                generateQuestions();
            }
        });

        evaluateButton.addActionListener(new ActionListener() {
   
   
            @Override
            public void actionPerformed(ActionEvent e) {
   
   
                evaluateAnswers();
            }
        });

        showAnswersButton.addActionListener(new ActionListener() {
   
   
            @Override
            public void actionPerformed(ActionEvent e) {
   
   
                showAnswers();
            }
        });

        pack();
        setLocationRelativeTo(null);
    }

    private void generateQuestions() {
   
   
        int numQuestions = 20;
        String operation = (String) operationComboBox.getSelectedItem();
        StringBuilder questions = new StringBuilder();
        StringBuilder answers = new StringBuilder();  // 用于存储答案

        Random random = new Random();

        for (int i = 0; i < numQuestions; i++) {
   
   
            int operand1 = random.nextInt(100) + 1;
            int operand2 = random.nextInt(100) + 1;
            String question = "";

            switch (operation) {
   
   
                case "10以内加法":
                    operand1 = random.nextInt(10) + 1;
                    operand2 = random.nextInt(10) + 1;
                    question = operand1 + " + " + operand2 + " = ";
                    break;
                case "10以内减法":
                    operand1 = random.nextInt(10) + 1;
                    operand2 = random.nextInt(operand1) + 1;
                    question = operand1 + " - " + operand2 + " = ";
                    break;
                case "20以内加法":
                    operand1 = random.nextInt(20) + 1;
                    operand2 = random.nextInt(20) + 1;
                    question = operand1 + " + " + operand2 + " = ";
                    break;
                case "20以内减法":
                    operand1 = random.nextInt(20) + 1;
                    operand2 = random.nextInt(operand1) + 1;
                    question = operand1 + " - " + operand2 + " = ";
                    break;
                case "100以内加法":
                    operand1 = random.nextInt(100) + 1;
                    operand2 = random.nextInt(100) + 1;
                    question = operand1 + " + " + operand2 + " = ";
                    break;
                case "100以内减法":
                    operand1 = random.nextInt(100) + 1;
                    operand2 = random.nextInt(operand1) + 1;
                    question = operand1 + " - " + operand2 + " = ";
                    break;
                case "100以内乘法":
                    operand1 = random.nextInt(100) + 1;
                    operand2 = random.nextInt(100) + 1;
                    question = operand1 + " * " + operand2 + " = ";
                    break;
                case "100以内除法":
                    operand2 = random.nextInt(100) + 1;
                    operand1 = operand2 * (random.nextInt(10) + 1);
                    question = operand1 + " / " + operand2 + " = ";
                    break;
                default:
                    break;
            }

            questions.append(question).append("\n");

            // 生成并附加答案
            int result = calculateResult(operand1 + " " + getOperationSymbol(operation) + " " + operand2);
            answers.append(result).append("\n");
        }
        questionArea.setText(questions.toString());
        answerField.setText(answers.toString());  // 将答案设置到答案文本框
    }
    // 获取操作符
    private String getOperationSymbol(String operation) {
   
   
        switch (operation) {
   
   
            case "10以内加法":
            case "20以内加法":
            case "100以内加法":
                return "+";
            case "10以内减法":
            case "20以内减法":
            case "100以内减法":
                return "-";
            case "100以内乘法":
                return "*";
            case "100以内除法":
                return "/";
            default:
                return "";
        }
    }

    private void evaluateAnswers() {
   
   
        String[] answers = questionArea.getText().split("\n");
        String[] userResponses = answerField.getText().split(" ");
        StringBuilder evaluation = new StringBuilder();

        for (int i = 0; i < answers.length; i++) {
   
   
            if (i < userResponses.length) {
   
   
                String answer = extractAnswer(answers[i].trim()); // 从完整表达式中提取答案部分
                String userAnswer = userResponses[i].trim();
                String result = answer.equals(userAnswer) ? "√" : "x";
                evaluation.append(result).append("\n");
            }
        }

        JOptionPane.showMessageDialog(this, evaluation.toString(), "评卷结果", JOptionPane.INFORMATION_MESSAGE);
    }

    // 从完整表达式中提取答案部分
    private String extractAnswer(String fullExpression) {
   
   
        // 以等号分割表达式,并取第二部分作为答案
        String[] parts = fullExpression.split("=");
        if (parts.length == 2) {
   
   
            return parts[1].trim();
        } else {
   
   
            return "";
        }
    }


    private void showAnswers() {
   
   
        String[] questions = questionArea.getText().split("\n");
        StringBuilder correctAnswers = new StringBuilder();

        for (String question : questions) {
   
   
            String[] parts = question.split("=");

            if (parts.length == 2) {
   
   
                String expression = parts[0].trim();
                int result = calculateResult(expression);
                correctAnswers.append(expression).append(" = ").append(result).append("\n");
            }
        }

        JOptionPane.showMessageDialog(this, correctAnswers.toString(), "正确答案", JOptionPane.INFORMATION_MESSAGE);
    }

    private int calculateResult(String expression) {
   
   
        try {
   
   
            // 使用 ScriptEngineManager 计算表达式
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("js");
            return (int) engine.eval(expression);
        } catch (ScriptException e) {
   
   
            e.printStackTrace();
        }

        return 0;
    }


    public static void main(String[] args) {
   
   
        SwingUtilities.invokeLater(new Runnable() {
   
   
            @Override
            public void run() {
   
   
                new MathExerciseGenerator().setVisible(true);
            }
        });
    }
}
AI 代码解读
相关文章
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
96 6
家政系统源码,java版本
这是一款基于SpringBoot后端框架、MySQL数据库及Uniapp移动端开发的家政预约上门服务系统。
103 6
家政系统源码,java版本
推荐一款好用的开源免费Java CMS内容管理站群系统
Java开源内容管理系统(JProcms),基于SpringCloud、SpringBoot、MyBatisPlus、Vue3等技术构建,采用Apache-2.0协议,支持免费商用。系统具备自定义字段存储与可视化设计、API制作网站群页面等功能,强调简单灵活的设计理念,降低二次开发成本。支持多种数据库、消息队列和认证方式,提供SaaS多租户、动态权限菜单、工作流配置等强大功能,同时集成阿里云、腾讯云服务,适用于高效建站与内容管理。
227 4
校招 Java 面试基础题目解析及学习指南含新技术实操要点
本指南聚焦校招Java面试,涵盖Java 8+新特性、多线程与并发、集合与泛型改进及实操项目。内容包括Lambda表达式、Stream API、Optional类、CompletableFuture异步编程、ReentrantLock与Condition、局部变量类型推断(var)、文本块、模块化系统等。通过在线书店系统项目,实践Java核心技术,如书籍管理、用户管理和订单管理,结合Lambda、Stream、CompletableFuture等特性。附带资源链接,助你掌握最新技术,应对面试挑战。
56 2
Java 校招面试题目合集及答案 120 道详解
这份资料汇总了120道Java校招面试题目及其详细答案,涵盖Java基础、JVM原理、多线程、数据类型、方法重载与覆盖等多个核心知识点。通过实例代码解析,帮助求职者深入理解Java编程精髓,为校招面试做好充分准备。无论是初学者还是进阶开发者,都能从中受益,提升技术实力和面试成功率。附带的资源链接提供了更多学习材料,助力高效备考。
71 3
Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)
本文围绕 Java 大数据在智能安防入侵检测系统中的应用展开,剖析系统现状与挑战,阐释多源数据融合及分析技术,结合案例与代码给出实操方案,提升入侵检测效能。
Java基于SaaS模式多租户ERP系统源码
ERP,全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统,它通过信息技术手段,将企业的各个业务流程和资源管理进行整合,以提高企业的运营效率和管理水平,它是一种先进的企业管理理念和信息化管理系统。 适用于小微企业的 SaaS模式多租户ERP管理系统, 采用最新的技术栈开发, 让企业简单上云。专注于小微企业的应用需求,如企业基本的进销存、询价,报价, 采购、销售、MRP生产制造、品质管理、仓库库存管理、财务应收付款, OA办公单据、CRM等。
181 23
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
121 0
现代 Java 技术开发宠物管理系统实操案例解析
本文通过一个宠物管理系统项目,深入讲解Java中的封装、继承和多态特性。系统基于Java 8+开发,结合Stream API与Lambda表达式,展示现代Java技术的实际应用。封装部分使用Record类简化数据模型,继承设计通过抽象类与接口实现代码复用,多态则通过统一接口处理不同宠物行为。案例涵盖模板方法模式、策略模式等设计思想,并提供最佳实践建议,解决常见问题如继承滥用和类型转换异常。资源地址:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
68 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问