Java口算练习软件(随机生成10道100以内的数学练习题)

2023-11-04

Java口算练习软件


使用Java编写口算练习软件
实现以下功能点:
1、随机生成10道100以内的加减法练习题
2、设计GUI界面(包含“生成题目”、“上一题”、“检查答案”、“导出结果”、“导入题目”等按钮)

在这里插入图片描述
这是一个Java程序,实现了一个口算练习软件。该软件提供以下功能:

  1. 点击“生成题目”按钮可以随机生成一定数量的加减法题目;
  2. 可以在文本框中输入答案并检查是否正确;
  3. 点击“上一题”和“下一题”按钮可以切换当前题目;
  4. 可以导出做题结果到文本文件;
  5. 可以从文本文件中导入题目。

该程序由一个ArithmeticPractice类和三个子类AdditionProblemSubtractionProblemArithmeticProblem组成。ArithmeticProblem是一个抽象类,包含两个整数a和b,以及getAnswer()checkAnswer()方法。AdditionProblemSubtractionProblem分别代表加法和减法问题,它们继承自ArithmeticProblem并重写了getAnswer()checkAnswer()方法。ResultsExporterResultsImporter分别用于将做题结果导出到文本文件和从文本文件中导入题目。

在ArithmeticPractice中,定义了界面元素和事件监听器,实现了相应的操作。JPanel、JLabel、JButton等Swing组件被用来构建用户界面。在ArithmeticPractice的构造函数中,创建了各个组件,并将它们添加到主面板中。点击按钮后,actionPerformed()方法会被调用,根据参数判断需要执行哪些操作。

public ArithmeticPractice() {
        super("口算练习软件");

        equationLabel = new JLabel();
        answerField = new JTextField();
        nextButton = new JButton("下一题");
        prevButton = new JButton("上一题");
        checkButton = new JButton("检查答案");
        exportButton = new JButton("导出结果");
        importButton = new JButton("导入题目");
        generateButton = new JButton("生成题目"); // 初始化生成题目按钮

        JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        JPanel equationPanel = new JPanel(new GridLayout(2, 1, 5, 5));
        equationPanel.add(equationLabel);
        equationPanel.add(answerField);

        JPanel buttonPanel = new JPanel(new GridLayout(1, 5, 5, 5));
        buttonPanel.add(prevButton);
        buttonPanel.add(nextButton);
        buttonPanel.add(checkButton);
        buttonPanel.add(exportButton);
        buttonPanel.add(importButton);

        mainPanel.add(equationPanel, BorderLayout.CENTER);
        mainPanel.add(buttonPanel, BorderLayout.SOUTH);
        mainPanel.add(generateButton, BorderLayout.NORTH); // 将生成题目按钮添加到面板中

        nextButton.addActionListener(this);
        prevButton.addActionListener(this);
        checkButton.addActionListener(this);
        exportButton.addActionListener(this);
        importButton.addActionListener(this);
        generateButton.addActionListener(this); // 添加生成题目按钮的事件监听器

        fileChooser = new JFileChooser();
        fileChooser.setFileFilter(new FileNameExtensionFilter("Text files", "txt"));

        setContentPane(mainPanel);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 200); // 增加了一个生成题目按钮后需要调整窗口大小
        setVisible(true);
    }

在showProblem()方法中,根据currentProblemIndex获取当前问题并在equationLabel中显示题目,同时将answerField清空,并根据当前问题的索引设置prevButton和nextButton是否可用。在generateProblems()方法中,使用随机数生成一定数量的加减法题目并存储到problems列表中,同时更新currentProblemIndex,并调用showProblem()方法显示第一个问题。

void showProblem() {
        ArithmeticProblem problem = problems.get(currentProblemIndex);
        equationLabel.setText(problem.toString());
        answerField.setText("");
        prevButton.setEnabled(currentProblemIndex > 0);
        nextButton.setEnabled(currentProblemIndex < problems.size() - 1);
    }

在checkAnswer()方法中,获取当前问题并解析文本框中的答案,将其转换为整数后与正确答案比较。如果答案正确,弹出提示窗口;否则,弹出包含正确答案的提示窗口。如果解析答案时遇到异常,则弹出无效答案的错误提示框。

void checkAnswer() {
        ArithmeticProblem problem = problems.get(currentProblemIndex);
        try {
            int answer = Integer.parseInt(answerField.getText());
            if (problem.checkAnswer(answer)) {
                score++;
                JOptionPane.showMessageDialog(this, "回答正确!\n得分:" + score, "提示", JOptionPane.INFORMATION_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(this, "回答错误,正确答案是:" + problem.getAnswer(), "提示", JOptionPane.WARNING_MESSAGE);
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "无效的答案!", "错误", JOptionPane.ERROR_MESSAGE);
        }
    }

在exportResults()方法中,先判断是否有结果可供导出,然后弹出文件选择器,将选择的文件路径作为参数传递给ResultsExporter.exportToTextFile()方法,该方法将做题结果写入指定的文本文件中。如果操作过程中发生异常,则弹出无法写入文件的错误提示框。

void exportResults() {
        if (problems == null || problems.isEmpty()) {
            JOptionPane.showMessageDialog(this, "还没有做题!");
            return;
        }
        int result = JOptionPane.showConfirmDialog(this, "确定导出结果吗?", "确认", JOptionPane.YES_NO_OPTION);
        if (result != JOptionPane.YES_OPTION) {
            return;
        }
        if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
            String filename = fileChooser.getSelectedFile().getAbsolutePath();
            Exporter exporter = new Exporter(filename);
            exporter.export(problems);
        }
    }

在importProblems()方法中,先弹出文件选择器,选择要导入的文件后将其路径传递给ResultsImporter.importFromTextFile()方法,该方法解析文本文件中的题目并返回ArithmeticProblem对象组成的列表。如果列表为空,则弹出没有可导入的题目的提示窗口;否则,将导入的题目存储到problems中,重置currentProblemIndex,然后调用showProblem()方法显示第一个问题。

void importProblems() {
        int result = JOptionPane.showConfirmDialog(this, "导入新的题目会清空当前所有题目,确定继续吗?", "确认", JOptionPane.YES_NO_OPTION);
        if (result != JOptionPane.YES_OPTION) {
            return;
        }
        if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            String filename = fileChooser.getSelectedFile().getAbsolutePath();
            Importer importer = new Importer(filename);
            problems = importer.importProblems();
            if (problems != null && !problems.isEmpty()) {
                currentProblemIndex = 0;
                showProblem();
            }
        }
    }

在main()方法中,使用EventQueue.invokeLater()方法将ArithmeticPractice类的实例化操作放入事件队列中,以便在GUI线程中执行。

public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ArithmeticPractice();
            }
        });
    }

需要源代码的可以后台踢我~
看见会及时回复的~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java口算练习软件(随机生成10道100以内的数学练习题) 的相关文章

随机推荐

  • 如何解决不可信输入带来的安全问题

    高质量程序设计艺术 样章连载 3 5 不可信输入 原书名 Code Quality The Open Source Perspective
  • Vue3通透教程【十七】Vite构建TS版本Vue项目

    文章目录 写在前面 创建TS版本的Vue3项目 插件安装 写在最后 写在前面 专栏介绍 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章 应粉丝要求开始更新 Vue3 的相关技术文章 Vue 框架目前的地位大家应该都晓得 所谓三大框
  • 当pycharm里的进程无法终止的情况

    当一直处于这种状态时 解决办法 在Run右边的tab栏 右键出现close tab 点击 之后便可以终止进程
  • MyBatisPlus多表查询的问题

    1 问题描述 有一个Person表和一个Pay表 person表中的id与pay表中ID一致 可以定位到一个人的pay情况 目前是想根据部门id person表中的一个字段 找到本部门下的pay 2 代码实现 根据部门id查询出person
  • 【计算机网络】传输层——TCP

    文章目录 TCP TCP协议的特点 TCP报文段 TCP连接管理 TCP连接的建立 TCP连接的释放 TCP可靠传输 序号 确认 重传 超时 冗余ACK 冗余确认 TCP流量控制 TCP拥塞控制 慢开始和拥塞避免 慢开始算法 拥塞避免算法
  • 图像分类、目标检测、语义分割、实例分割等计算机视觉方向基本概念

    参考原文 图像分类 目标检测 语义分割 实例分割和全景分割的区别 AI视觉网奇的博客 CSDN博客 1 图像分类 Object Classification 识别图片中存在的不同物体的种类 下方左图 人类 羊类 狗类 常用算法 KNN SV
  • GCC 的使用及介绍

    一 GCC介绍 Linux系统下的GCC是GNU推出的功能强大 性能优越的多平台编译器 它可以在多种硬件平台上编译处可执行程序的超级编译器 其执行效率比一般的编译器的效率要高20 30 Gcc编译器能将C C 语言源程序 汇程式化序和目标程
  • FPGA时序约束理论之多周期路径(6)

    1 单周期路径 前面的时钟周期约束 都是按照单周期关系进行分析数据路径 即数据的发起沿和采样沿是最邻近的一对时钟沿 如下图所示 默认情况下 保持时间的检查是以建立时间的检查为前提 即总是在建立时间的前一个时钟周期确定保持时间检查 也就是说
  • 基于Matlab的多线激光中心坐标值提取

    本文是基于给定的两张多线激光图片 如下图所示 需将图片中的激光线的中心线坐标提取出来并绘制激光中心线图形 因为是Matlab课程训练研究大作业 所以全文代码为Matlab 希望可以为相似作业的非专业同学提供一些帮助 文章目录 1 问题分析
  • docker-compose常用命令

    docker compose up d nginx 构建建启动nignx容器 docker compose exec nginx bash 登录到nginx容器中 docker compose down 删除所有nginx容器 镜像 doc
  • python 多分类逻辑回归_机器学习实践:多分类逻辑回归(softmax回归)的sklearn实现和tensorflow实现...

    本文所有代码及数据可下载 Scikit Learn 篇 Light 版 scikit learn内置了逻辑回归 对于小规模的应用较为简单 一般使用如下代码即可 from sklearn linear model logistic impor
  • Spring框架(SpringBoot)中redis报错(Could not get a resource from the pool、java.net.SocketTimeoutException)

    Spring框架 SpringBoot 中redis报错 在使用SpringBoot框架的时候 Spring一直会报两个特别纠结特别的烦的错误 尝试了很多种方法 都是失败的 不能成功 经过我坚持不懈的努力寻找 终于把问题给解决了 一 第一个
  • 灭鼠先锋

    奇技淫巧 cout lt lt LLLV
  • 编译器构造中自底向上的LALR(1)语法分析的语法分析表生成的实现

    提示 阅读本文需掌握编译原理的相关基础知识 本文中使用C 语言系统地实现了龙书中LALR 1 语法分析表的构造算法 首先计算增广文法的LR 0 项集族 每一个项集只包含内核项 计算过程中自动生成了LR 0 自动机 该自动机使用基于十字链表存
  • 【server组件】——mysql连接池的实现原理

    目录 1 池化技术 2 数据库连接池的定义 3 为什么要使用连接池 4 数据库连接池的运行机制 5 连接池与线程池的关系 6 CResultSet的设计 6 1构造函数 7 CDBConn的设计 6 1 构造函数 6 2 init 初始化连
  • 最大间隔问题

    问题描述 给定n个实数x1 x2 x3 xn 求这n个数在实轴上相邻2个数之间的最大间隔 假设对任何实数取整耗时O 1 设计解最大间隙问题的线性时间算法 算法设计 对于给定的n个实数x1 x2 x3 xn 计算它们的最大间隙 数据输入 输入
  • proc*c sqlcode=[-1405];sqlerr=[ORA-01405: fetched column value is NULL

    指示变量的值 及其代表的含义如下 0 操作成功 1 该指示变量对应的宿主变量返回了或插入 更新成了NULL值 2 从数据库存放数据到对应的宿主变量时 数据超长 并且不能推断出截断了多少字节的长度 gt 0 在FETHC或SELECT语句时
  • 5g空分复用技术_5G通信技术原理总结

    5G通信的基本流程框图 如上图 5G智能手机MIC输入的模拟信号会通过基带中的AD数模转换电路 完成采样 量化 编码 变成数字信号 具体过程如下如所示 信源编码 信源编码 上图中的编码 我们称之为信源编码 信源编码 说白了 就是把声音 画面
  • (2018-2021年)Uncertainty 相关SOTA文献笔记整理

    Uncertainty 文献笔记 ACL Word Level Uncertainty Estimation for Black Box Text Classifiers using RNNs Unsupervised Quality Es
  • Java口算练习软件(随机生成10道100以内的数学练习题)

    Java口算练习软件 使用Java编写口算练习软件 实现以下功能点 1 随机生成10道100以内的加减法练习题 2 设计GUI界面 包含 生成题目 上一题 检查答案 导出结果 导入题目 等按钮 这是一个Java程序 实现了一个口算练习软件