【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);
            }
        });
    }
}
相关文章
|
5天前
|
Java
排课系统【JSP+Servlet+JavaBean】(Java课设)
排课系统【JSP+Servlet+JavaBean】(Java课设)
19 5
|
3天前
|
数据采集 监控 安全
java数字工厂MES系统全套源码Java+idea+springboot专业为企业提供智能制造MES解决方案
"MES" 指的是制造执行系统(Manufacturing Execution System)。MES在制造业中扮演着至关重要的角色,它是位于企业资源计划(ERP)系统和车间控制系统之间的系统,用于实时收集、管理、分析和报告与制造过程相关的数据。
10 0
|
3天前
|
移动开发 监控 供应链
JAVA智慧工厂制造生产管理MES系统,全套源码,多端展示(app、小程序、H5、台后管理端)
一开始接触MES系统,很多人会和博主一样,对MES细节的应用不了解,这样很正常,因为MES系统相对于其他系统来讲应用比较多!
15 1
JAVA智慧工厂制造生产管理MES系统,全套源码,多端展示(app、小程序、H5、台后管理端)
|
4天前
|
算法 Java Python
保姆级Java入门练习教程,附代码讲解,小白零基础入门必备
保姆级Java入门练习教程,附代码讲解,小白零基础入门必备
|
4天前
|
存储 运维 Java
java云his系统源码一站式诊所SaaS系统Java版云HIS系统 八大特点
HIS系统采用面向技术架构的分析与设计方法,应用多层次应用体系架构设计,运用基于构件技术的系统搭建模式与基于组件模式的系统内核结构。通过建立统一接口标准,实现数据交换和集成共享,通过统一身份认证和授权控制,实现业务集成、界面集成。
29 1
|
5天前
|
监控 前端开发 Java
Java公立医院绩效考核管理系统 医院绩效考核系统的优势有哪些? 
医院绩效管理系统解决方案紧扣新医改形势下医院绩效管理的要求,以“工作量为基础的考核方案”为核心思想,结合患者满意度、服务质量、技术难度、工作效率、医德医风等管理发展目标的考核体系,形成医院的内部绩效考核与分配机制,通过信息化手段为绩效考评管理人员实施医院绩效考评工作提供了有效工具,扩展了信息管理范围,增加了信息分析的广度与深度。这不仅使绩效评价工作更加科学化、规范化和自动化,而且从根本上改变了绩效评估工作方式,实现了绩效评价数据网络化采集,评价结果透明化管理,奖金分配数据自动化生成,极大地提高了绩效评估的全面性、准确性、时效性、公正性。从而推进医院绩效管理的专业化、规范化和精细化管理,充分发挥
15 0
|
5天前
|
数据采集 前端开发 Java
Java医院绩效考核系统源码maven+Visual Studio Code一体化人力资源saas平台系统源码
医院绩效解决方案包括医院绩效管理(BSC)、综合奖金核算(RBRVS),涵盖从绩效方案的咨询与定制、数据采集、绩效考核及反馈、绩效奖金核算到科到组、分配到员工个人全流程绩效管理;将医院、科室、医护人员利益绑定;全面激活人才活力;兼顾质量和效益、长期与短期利益;助力医院降本增效,持续改善、优化收入、成本结构。
19 0
|
5天前
|
Java
新闻发布系统【JSP+Servlet+JavaBean】(Java课设)
新闻发布系统【JSP+Servlet+JavaBean】(Java课设)
16 2
|
5天前
|
存储 Java API
java对接IPFS系统-以nft.storage为列
java对接IPFS系统-以nft.storage为列
416 3
|
5天前
|
监控 前端开发 Java
Java基于B/S医院绩效考核管理平台系统源码 医院智慧绩效管理系统源码
医院绩效考核系统是一个关键的管理工具,旨在评估和优化医院内部各部门、科室和员工的绩效。一个有效的绩效考核系统不仅能帮助医院实现其战略目标,还能提升医疗服务质量,增强患者满意度,并促进员工的专业成长
22 0