【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);
            }
        });
    }
}
相关文章
|
1月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
26天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
1月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
98 3
|
1月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
41 1
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
2月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
64 1
|
2月前
|
Java 关系型数据库 API
介绍一款Java开发的企业接口管理系统和开放平台
YesApi接口管理平台Java版,基于Spring Boot、Vue.js等技术,提供API接口的快速研发、管理、开放及收费等功能,支持多数据库、Docker部署,适用于企业级PaaS和SaaS平台的二次开发与搭建。
|
2月前
|
前端开发 Java 数据库连接
基于Java的校车管理系统(下)
基于Java的校车管理系统(下)
28 0
|
2月前
|
存储 前端开发 Java
基于Java的校车管理系统
基于Java的校车管理系统(上)
29 0