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;
}
}
}
}
点击查看代码
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);
}
点击查看代码
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)];
}
}
点击查看代码
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;
}
}
点击查看代码
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();
}
}
点击查看代码
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");
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具