10.16

完成了生成四则运算的程序
分为QixunluGUI类主程序完成界面显示,QuestionGenerator类题目父类,Grade2QuestionGenerator类实现二年级的题目生成继承QuestionGenerator类
Grade3QuestionGenerator类实现三年级的题目生成继承Grade2QuestionGenerator类,Grade4QuestionGenerator类实现三年级的题目生成继承Grade3QuestionGenerator类
QuestionGeneratorFactory类题目生成防止报错
具体代码如下:
QixunluGUI类

点击查看代码
package qixun;

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.Timer;

public class QixunluGUI extends JFrame {
    private static final int TIME_LIMIT = 60;
    private int questionCount;
    private String[] questions;
    private double[] correctAnswers;
    private JTextField[] answerFields;
    private JLabel[] resultLabels;
    private JLabel timerLabel = new JLabel("剩余时间: " + TIME_LIMIT + "秒");
    private int correctCount = 0;
    private int timeRemaining = TIME_LIMIT;

    // 错题记录集
    private List<MistakeRecord> mistakeList = new ArrayList<>();

    public QixunluGUI(int questionCount, int gradeLevel) {
        this.questionCount = questionCount;
        this.questions = new String[questionCount];
        this.correctAnswers = new double[questionCount];
        this.answerFields = new JTextField[questionCount];
        this.resultLabels = new JLabel[questionCount];

        setTitle("数学测验");
        setSize(500, 700);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        // 生成问题
        QuestionGenerator generator = QuestionGeneratorFactory.createGenerator(gradeLevel);
        for (int i = 0; i < questionCount; i++) {
            questions[i] = generator.getQuestion();
            correctAnswers[i] = generator.getAnswer(questions[i]);
        }

        // 创建一个面板用于问题布局,三道题一行
        JPanel questionPanel = new JPanel(new GridLayout((questionCount + 2) / 3, 4));
        for (int i = 0; i < questionCount; i++) {
            questionPanel.add(new JLabel("问题 " + (i + 1) + ": " + questions[i]));
            answerFields[i] = new JTextField(10);
            questionPanel.add(answerFields[i]);
            resultLabels[i] = new JLabel();
            questionPanel.add(resultLabels[i]);

            JButton checkButton = new JButton("提交");
            int finalI = i;
            checkButton.addActionListener(e -> submitSingleAnswer(finalI, resultLabels[finalI]));
            questionPanel.add(checkButton);
        }

        // 创建一个面板用于放置总提交按钮
        JPanel submitPanel = new JPanel(new FlowLayout());
        JButton finalSubmitButton = new JButton("提交所有答案");
        JButton retryMistakesButton = new JButton("错题重练");
        JLabel finalResultLabel = new JLabel();

        // 处理倒计时
        Timer timer = new Timer(1000, e -> {
            timeRemaining--;
            timerLabel.setText("剩余时间: " + timeRemaining + "秒");
            if (timeRemaining <= 0) {
                ((Timer) e.getSource()).stop();
                JOptionPane.showMessageDialog(null, "时间到!");
                submitAllAnswers(finalResultLabel);
            }
        });
        timer.start();

        // 设置总提交按钮事件
        finalSubmitButton.addActionListener(e -> {
            timer.stop();
            submitAllAnswers(finalResultLabel);
        });

        // 设置错题重练按钮事件
        retryMistakesButton.addActionListener(e -> retryMistakes());

        // 将按钮和结果标签加入提交面板
        submitPanel.add(finalSubmitButton);
        submitPanel.add(retryMistakesButton);
        submitPanel.add(finalResultLabel);

        add(timerLabel, BorderLayout.NORTH);
        add(new JScrollPane(questionPanel), BorderLayout.CENTER); // 添加问题面板
        add(submitPanel, BorderLayout.SOUTH); // 提交按钮单独一行

        setVisible(true);
    }

    // 提交单个答案
    private void submitSingleAnswer(int index, JLabel resultLabel) {
        try {
            double userAnswer = Double.parseDouble(answerFields[index].getText());
            if (Math.abs(userAnswer - correctAnswers[index]) < 0.001) {
                correctCount++;
                resultLabel.setText("正确");
            } else {
                resultLabel.setText("错误,正确答案是: " + correctAnswers[index]);
                // 记录错题
                mistakeList.add(new MistakeRecord(questions[index], correctAnswers[index], userAnswer));
            }
        } catch (NumberFormatException ex) {
            resultLabel.setText("请输入有效的数字");
        }
    }

    // 提交所有答案
    private void submitAllAnswers(JLabel finalResultLabel) {
        finalResultLabel.setText("总正确率: " + (correctCount / (double) questionCount * 100) + "%");
    }

    // 错题重练功能
    private void retryMistakes() {
        if (mistakeList.isEmpty()) {
            JOptionPane.showMessageDialog(this, "没有错题可以重练!");
            return;
        }

        JFrame retryFrame = new JFrame("错题重练");
        retryFrame.setSize(400, 400);
        retryFrame.setLayout(new GridLayout(mistakeList.size(), 3));

        // 重练错题
        for (MistakeRecord mistake : mistakeList) {
            retryFrame.add(new JLabel("题目: " + mistake.getQuestion()));
            JTextField retryAnswerField = new JTextField(10);
            retryFrame.add(retryAnswerField);
            JLabel retryResultLabel = new JLabel();
            retryFrame.add(retryResultLabel);

            JButton retryCheckButton = new JButton("重练提交");
            retryCheckButton.addActionListener(e -> {
                try {
                    double retryAnswer = Double.parseDouble(retryAnswerField.getText());
                    if (Math.abs(retryAnswer - mistake.getCorrectAnswer()) < 0.001) {
                        retryResultLabel.setText("正确");
                    } else {
                        retryResultLabel.setText("错误,正确答案是: " + mistake.getCorrectAnswer());
                        mistake.incrementAttempt(); // 增加错题重练次数
                    }
                } catch (NumberFormatException ex) {
                    retryResultLabel.setText("请输入有效的数字");
                }
            });
            retryFrame.add(retryCheckButton);
        }

        retryFrame.setVisible(true);
    }

    // 错题记录类
    private static class MistakeRecord {
        private String question;
        private double correctAnswer;
        private double userAnswer;
        private int attemptCount = 1; // 错题初始尝试次数

        public MistakeRecord(String question, double correctAnswer, double userAnswer) {
            this.question = question;
            this.correctAnswer = correctAnswer;
            this.userAnswer = userAnswer;
        }

        public String getQuestion() {
            return question;
        }

        public double getCorrectAnswer() {
            return correctAnswer;
        }

        public int getAttemptCount() {
            return attemptCount;
        }

        public void incrementAttempt() {
            attemptCount++;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean flag = true;
        while (flag) {
            System.out.print("请输入题目数量: ");
            int questionCount = scanner.nextInt();
            System.out.print("请输入年级(2-4): ");
            int gradeLevel = scanner.nextInt();
            new QixunluGUI(questionCount, gradeLevel);
            System.out.println("再来一次(输入yse)");
            String angan=scanner.next();
            if(angan.equals("yes")){
                flag = true;
            }else {
                flag = false;
            }
        }
    }
}

QuestionGenerator类
点击查看代码
package qixun;

import java.util.*;

public abstract class QuestionGenerator {
    protected int operandCount;
    protected int maxOperandValue;
    protected boolean allowMultiplication;
    protected boolean allowDivision;

    // 抽象方法,子类需要实现具体的题目生成逻辑
    public abstract String getQuestion();

    // 获取题目的答案
    public abstract double getAnswer(String question);
}

Grade2QuestionGenerator类
点击查看代码
package qixun;

import java.util.Random;

public class Grade2QuestionGenerator extends QuestionGenerator {
    public Grade2QuestionGenerator() {
        this.operandCount = 2; // 操作数为两个
        this.maxOperandValue = 100; // 操作数范围不超过100
        this.allowMultiplication = true;
        this.allowDivision = true;
    }

    @Override
    public String getQuestion() {
        Random random = new Random();
        int operand1 = random.nextInt(maxOperandValue) + 1;
        int operand2 = random.nextInt(maxOperandValue) + 1;
        String operator = generateOperator(); // 使用生成的运算符

        // 确保除法时可以整除且不超过100
        if (operator.equals("/")) {
            while (operand1 % operand2 != 0 || operand1 > 100) {
                operand1 = random.nextInt(maxOperandValue) + 1;
                operand2 = random.nextInt(maxOperandValue) + 1;
            }
        }

        return operand1 + " " + operator + " " + operand2;
    }

    @Override
    public double getAnswer(String question) {
        String[] parts = question.split(" ");
        int operand1 = Integer.parseInt(parts[0]);
        String operator = parts[1];
        int operand2 = Integer.parseInt(parts[2]);

        switch (operator) {
            case "+":
                return operand1 + operand2;
            case "-":
                return operand1 - operand2;
            case "*":
                return operand1 * operand2;
            case "/":
                return (double) operand1 / operand2;
            default:
                throw new IllegalArgumentException("无效的运算符!");
        }
    }

    protected String generateOperator() {
        Random random = new Random();
        String[] operators = {"+", "-", "*", "/"};
        return operators[random.nextInt(operators.length)];
    }
}

Grade3QuestionGenerator类
点击查看代码
package qixun;

import java.util.Random;

public class Grade3QuestionGenerator extends Grade2QuestionGenerator {
    public Grade3QuestionGenerator() {
        this.operandCount = 4; // 操作数不超过4个
        this.maxOperandValue = 1000; // 操作数范围不超过1000
    }

    @Override
    public String getQuestion() {
        Random random = new Random();
        StringBuilder question = new StringBuilder();

        // 生成最多4个操作数的表达式
        for (int i = 0; i < operandCount - 1; i++) {
            int operand = random.nextInt(maxOperandValue) + 1;
            String operator = generateOperator(); // 调用父类的 generateOperator()
            question.append(operand).append(" ").append(operator).append(" ");
        }
        question.append(random.nextInt(maxOperandValue) + 1); // 最后一个操作数

        return question.toString();
    }

    @Override
    public double getAnswer(String question) {
        double result = super.getAnswer(question);
        // 确保结果不超过10000
        if (result > 10000) {
            throw new IllegalArgumentException("结果不能超过10000!");
        }
        return result;
    }
}

Grade4QuestionGenerator类
点击查看代码
package qixun;

import java.util.*;

public class Grade4QuestionGenerator extends Grade3QuestionGenerator {
    public Grade4QuestionGenerator() {
        this.operandCount = 5;
    }

    @Override
    public String getQuestion() {
        Random random = new Random();
        StringBuilder question = new StringBuilder();

        // 生成最多5个操作数的表达式,并可能加入括号
        boolean useBrackets = random.nextBoolean();
        if (useBrackets) {
            question.append("(");
        }

        for (int i = 0; i < operandCount - 1; i++) {
            int operand = random.nextInt(maxOperandValue) + 1;
            String operator = generateOperator();
            question.append(operand).append(" ").append(operator).append(" ");

            if (useBrackets && i == 2) {
                question.append(") ");
                useBrackets = false; // 防止括号重复使用
            }
        }
        question.append(random.nextInt(maxOperandValue) + 1); // 最后一个操作数

        return question.toString();
    }
}

QuestionGeneratorFactory类
点击查看代码
package qixun;

public class QuestionGeneratorFactory {

    public static QuestionGenerator createGenerator(int gradeLevel) {
        switch (gradeLevel) {
            case 2:
                return new Grade2QuestionGenerator();
            case 3:
                return new Grade3QuestionGenerator();
            case 4:
                return new Grade4QuestionGenerator();
            default:
                throw new IllegalArgumentException("年级只能是2, 3或4");
        }
    }
}

posted @   QixunQiu  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示