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

 

本文章主要是CSDN-问答板块,有题主提出的问题,我这边将完整代码提供出来,仅供大家参考学习!

 

一、效果截图

 

 

二、直接上代码

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);
            }
        });
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399651.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

点成分享|如何让地球更绿,它能给你答案

一、背景介绍 随着全球经济的飞速发展&#xff0c;环境问题也日益严重。现代社会面临着诸如全球变暖、气候异常、空气和水质污染等诸多环境问题。其中&#xff0c;温室气体的排放是导致全球变暖的主要原因之一。温室气体的排放量上升加剧气候异常&#xff0c;影响人类生存和自…

NFC三大工作模式及其在物联网应用实例

NFC支持三种通信模式&#xff1a;读写模式、点对点模式和卡模拟模式。在此三种模式下&#xff0c;都仅需简单点击便可启动传输。 在读写模式下&#xff0c;系统执行非接触式读写功能。该系统的NFC芯片与内置NFC的设备-诸如非接触式智能卡、NFC标签或具有NFC功能的智能手机&…

瑞盟MS5188N——16bit、8 通道、500kSPS、 SAR 型 ADC

产品简述 MS5188N 是 8 通道、 16bit 、电荷再分配逐次逼近型模数 转换器&#xff0c;采用单电源供电。 MS5188N 拥有多通道、低功耗数据采集系统所需的所有 组成部分&#xff0c;包括&#xff1a;无失码的真 16 位 SAR ADC &#xff1b;用于将输入配 置为单端输入…

unity学习(31)——跳转到角色选择界面(打勾?手滑挂错脚本)

There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene. 是因为后来创建了一个camera&#xff0c;因为camera中自带一个组件Audio Listener。所以有两个camera就有两个audio listener导致报错。 一个简单的解决…

WebRTC最新版报错解决:city.wav:missing and no known rule to make it (二十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

读懂2024年数字孪生发展新趋势!十大权威白皮书放送!

2024年&#xff0c;数字孪生 该往哪些方向走&#xff1f; 新技术的不断涌现 又会带来怎样的行业变迁 …… 在开工之际&#xff0c;我们整理了 51WORLD主导、参编的 十大权威数字孪生白皮书、行业报告 以及产业优秀案例集 分享给想要提升自我的朋友们 读完这些 上面看似…

【数据结构】时间复杂度与空间复杂度

时间复杂度 算法的时间复杂度并不是指一个代码运行时间的快慢&#xff0c;因为在不同机器上运行的时间肯定不同&#xff0c;因此算法的时间复杂度指的是基本操作的执行次数&#xff0c;他是一个数学意义上的函数。这个函数并不是C语言中那种函数&#xff0c;而是一个数学函数&…

WebGL中开发科学数据可视化应用

WebGL在科学数据可视化领域有广泛的应用&#xff0c;可以用于呈现和解释复杂的科学数据。以下是在WebGL中开发科学数据可视化应用时的一些建议&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.选择合…

网络原理 - HTTP/HTTPS(4)

HTTP响应详解 认识"状态码"(status code) 状态码表示访问一个页面的结果.(是访问成功,还是失败,还是其它的一些情况...).(响应结果如何) 学习状态码 -> 为了调试问题. 写服务器时,按照状态码的含义正确使用. 200 OK 这是最常见的状态码,表示访问成功. 抓包抓…

Android加载富文本

直接用webview加载&#xff1a; package com.example.testcsdnproject;import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.webk…

docker (十一)-进阶篇-docker-compos最佳实践部署zabbix

一 部署docker环境 关闭防火墙、selinux、开启docker&#xff0c;并设置开机自启动 注意点&#xff1a;docker部署的时候&#xff0c;bip要指定&#xff0c;不然会导致虚拟机ip和容器ip冲突&#xff0c;ssh连不上虚拟机 部署请参考 docker &#xff08;二&#xff09;-yum…

数据库管理-第153期 Oracle Vector DB AI-05(20240221)

数据库管理153期 2024-02-21 数据库管理-第153期 Oracle Vector DB & AI-05&#xff08;20240221&#xff09;1 Oracle Vector的其他特性示例1&#xff1a;示例2 2 简单使用Oracle Vector环境创建包含Vector数据类型的表插入向量数据 总结 数据库管理-第153期 Oracle Vecto…

计算机服务器中了devos勒索病毒怎么办?Devos勒索病毒解密数据恢复

网络技术的不断发展与更新&#xff0c;为企业的生产运营提供了有利保障&#xff0c;企业的生产运营离不开数据支撑&#xff0c;通过企业数据可以综合调整发展运营方向&#xff0c;但网络是一把双刃剑&#xff0c;近期&#xff0c;云天数据恢复中心接到许多企业的求助&#xff0…

2.20 Qt day1

一. 思维导图 二. 消化常用类的使用&#xff0c;以及常用成员函数对应的功能 按钮类QPushButton&#xff1a; mywidget.h&#xff1a; #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include<QPushButton>//按钮类 #include<QIcon>class MyW…

ts快速入门

文章目录 一、运行环境1、线上Playground2、VSCode 编辑器3、Code Runner 插件4、ts-node 二、声明1、变量声明2、常量声明3、类型推断 三、常用数据类型1、number2、string3、boolean4、数组5、对象 四、函数1、函数声明语法2、参数详解&#xff08;1&#xff09;特殊语法&…

C++学习Day08之类模板碰到继承的问题以及解决

目录 一、程序及输出1.1 指定父类T数据类型1.2 子类T指定父类T数据类型 二、分析与总结 一、程序及输出 1.1 指定父类T数据类型 必须要指定出父类中的T数据类型&#xff0c;才能给子类分配内存 正确使用 &#xff1a; #include<iostream> using namespace std;templa…

webpack打包速度优化思维导图

webpack打包速度优化思维导图 前言附件 前言 去年的时候公司一个项目体积过大&#xff0c;我是m1芯片的macpro&#xff0c;光启动就要1分钟&#xff0c;配置差点都电脑&#xff0c;启动就要3分钟&#xff0c;自然打包速度也会慢很多&#xff0c;我们是gitlab设置成了自动打包的…

春招面试准备笔记——NMS(非极大值抑制)算法

NMS&#xff08;非极大值抑制&#xff09;算法非极大值抑制是用于减少物体检测算法中重叠边界框或区域的数量的技术。通过对每个类别的检测框按置信度排序&#xff0c;然后逐个遍历&#xff0c;保留置信度最高的框&#xff0c;并抑制与其重叠且置信度低的框&#xff0c;从而得到…

Apache Httpd 常见漏洞解析(全)

一、Apache HTTPD 换行解析漏洞 漏洞编号&#xff1a;CVE-2017-15715 Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。 其2.4.0~2.4.29版本中存在一个解析漏洞。 在解析PHP时&#xff0c;1.php\x0A将被按照PHP后缀进行解析&#xff0c;导致绕过…

桌面备忘录怎么设置,怎么在电脑上设置提醒?

桌面备忘录怎么设置&#xff0c;怎么在电脑上设置提醒&#xff1f;如今&#xff0c;为了优质生活的需要&#xff0c;我们每天都会处理很多的事情&#xff0c;比如&#xff1a;网课时间、工作任务、生活琐事……有时候&#xff0c;真恨不得自己有个三头六臂&#xff0c;好把这一…