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

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

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

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LuckyInn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值