import javax.swing.;
import java.awt.;
import java.util.HashSet;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
public class Sizeyunsuan {
public static void main(String[] args) {
int i = 1;
Set
int[] answers = new int[30]; // 用于存储每道题的答案
String[] questionArray = new String[30]; // 用于存储每道题
JTextField[] answerFields = new JTextField[30]; // 用于存储每道题的答案框
while (i <= 30) {
int num1 = (int) (Math.random() * 100);
int num2 = (int) (Math.random() * 100);
String question = ""; // 存储生成的题目
int answer = 0; // 存储答案
if (i <= 5) {
question = num1 + " + " + num2 + " = ?"; // 加法
answer = num1 + num2;
} else if (i <= 10) {
// 确保 num1 大于 num2
if (num1 < num2) {
int temp = num1;
num1 = num2;
num2 = temp;
}
question = num1 + " - " + num2 + " = ?"; // 减法
answer = num1 - num2;
} else if (i <= 20) {
if (num1 * num2 < 1000) {
question = num1 + " * " + num2 + " = ?"; // 乘法
answer = num1 * num2;
}
} else if (i <= 30 && num2 * num1 != 0 && num1 != num2) {
if (num1 % num2 == 0) {
question = num1 + " / " + num2 + " = ?"; // 除法
answer = num1 / num2;
}
}
// 检查题目是否重复
if (!question.isEmpty() && !generatedQuestions.contains(question)) {
generatedQuestions.add(question); // 添加题目到集合中
answers[i - 1] = answer; // 保存答案
questionArray[i - 1] = question; // 保存题目
answerFields[i - 1] = new JTextField(10); // 创建答案输入框
i++; // 仅在成功添加新题目时才增加计数器
}
}
// 创建一个面板来显示所有问题和输入框,设置为六行五列
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(6, 5)); // 设置网格布局
for (int j = 0; j < 30; j++) {
panel.add(new JLabel(questionArray[j])); // 添加题目标签
answerFields[j] = new JTextField(10); // 创建答案输入框
panel.add(answerFields[j]); // 添加答案输入框
}
// 获取用户输入的答题时间
String timeInput = JOptionPane.showInputDialog(null, "输入答题时间(秒):");
int timeLimit;
try {
timeLimit = Integer.parseInt(timeInput);
if (timeLimit <= 0) {
throw new NumberFormatException();
}
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "请输入一个有效的正整数!", "输入错误", JOptionPane.ERROR_MESSAGE);
return;
}
// 启动倒计时
final int[] remainingTime = {timeLimit};
Timer countdownTimer = new Timer();
countdownTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if (remainingTime[0] > 0) {
remainingTime[0]--;
} else {
// 时间到时,显示提示并结束答题
JOptionPane.showMessageDialog(null, "时间到!", "提示", JOptionPane.WARNING_MESSAGE);
countdownTimer.cancel(); // 倒计时结束时取消定时器
checkAnswers(questionArray, answers, answerFields); // 检查答案并显示结果
JOptionPane.getRootFrame().dispose(); // 关闭对话框
}
}
}, 0, 1000); // 每秒更新一次
// 显示问题和答案输入框的对话框
int result = JOptionPane.showConfirmDialog(null, panel, "填写答案", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
// 停止计时器
countdownTimer.cancel(); // 如果用户完成答题或时间到,停止倒计时
if (result == JOptionPane.OK_OPTION) {
checkAnswers(questionArray, answers, answerFields); // 检查答案并显示结果
}
}
// 检查答案并显示结果
private static void checkAnswers(String[] questionArray, int[] answers, JTextField[] answerFields) {
StringBuilder resultText = new StringBuilder("答题情况:\n");
int correctCount = 0;
for (int j = 0; j < 30; j++) {
String userInput = answerFields[j].getText(); // 获取用户输入的答案
int userAnswer = userInput.isEmpty() ? 0 : Integer.parseInt(userInput); // 转换用户输入的答案
resultText.append(questionArray[j]).append(" ");
// 判断答案
if (userInput.isEmpty()) {
resultText.append("未作答,正确答案是:").append(answers[j]).append("\n"); // 未填写的视为错误
} else if (userAnswer == answers[j]) {
resultText.append("正确\n");
correctCount++;
} else {
resultText.append("错误,正确答案是:").append(answers[j]).append("\n");
}
}
// 显示校正结果
JOptionPane.showMessageDialog(null, resultText.toString());
// 显示成绩
double correctRate = (correctCount / 30.0) * 100;
JOptionPane.showMessageDialog(null, "正确率:" + String.format("%.2f", correctRate) + "%");
}
}
一、解释Set
- Set
Set 是一种集合类型,它用于存储不重复的元素。与列表(如 ArrayList)不同,Set 不允许重复的值。
指定了集合中存储的元素类型为 String,意味着这个集合将只包含字符串类型的对象。 - generatedQuestions
generatedQuestions 是集合的名称。它用来存储生成的数学题目,以确保题目不会重复。 - new HashSet<>()
HashSet 是 Set 接口的一种具体实现,基于哈希表的原理。它提供了常数时间复杂度的插入、删除和查找操作。
使用 new HashSet<>() 创建一个新的空的哈希集合实例。 - 用途
在这个程序中,generatedQuestions 用于存储生成的数学题目,确保每道题目都是唯一的。在生成新题目时,程序会检查该题目是否已经存在于 generatedQuestions 集合中。如果题目已经存在,程序将不会将其添加到集 合中,从而避免重复题目。
代码示例:
import java.util.HashSet;
import java.util.Set;
public class UniqueQuestions {
public static void main(String[] args) {
Set
// 添加问题
generatedQuestions.add("2 + 2 = ?");
generatedQuestions.add("3 + 5 = ?");
generatedQuestions.add("2 + 2 = ?"); // 重复的问题,不会被添加
// 输出所有问题
for (String question : generatedQuestions) {
System.out.println(question);
}
// 输出问题的数量
System.out.println("问题总数: " + generatedQuestions.size());
}
}
二、解释JTextField[] answerFields = new JTextField[30]; :
- JTextField[]
JTextField 是 Java Swing 中的一个类,用于创建文本输入框。用户可以在文本框中输入文本内容。
JTextField[] 表示一个 JTextField 对象的数组。这意味着你将创建多个文本输入框,每个文本框可以存储用户输入的字符串。 - answerFields
answerFields 是数组的名称。在这个上下文中,它可以表示用于存储用户输入答案的文本框。 - new JTextField[30]
new JTextField[30] 创建一个新的 JTextField 数组,大小为 30。这意味着你可以存储最多 30 个 JTextField 对象。
数组的每个元素在初始化时都是 null,你需要分别创建 JTextField 对象并将它们分配给数组的每个元素。
用途:
这个数组可以用于处理多个文本输入,例如在一个图形用户界面(GUI)中,用户可以输入答案(例如数学问题的答案)。通过数组,可以轻松地管理和访问这些文本框。
示例
以下是一个简单的示例,展示了如何创建 JTextField 数组,并在 JFrame 中添加这些文本框:
import javax.swing.;
import java.awt.;
public class AnswerInputExample {
public static void main(String[] args) {
// 创建一个 JFrame
JFrame frame = new JFrame("Answer Input Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(30, 1)); // 设置网格布局
// 创建一个 JTextField 数组
JTextField[] answerFields = new JTextField[30];
// 创建并添加 JTextField 到数组和 JFrame
for (int i = 0; i < answerFields.length; i++) {
answerFields[i] = new JTextField("Answer " + (i + 1));
frame.add(answerFields[i]); // 将 JTextField 添加到 JFrame
}
// 设置 JFrame 尺寸并可见
frame.setSize(400, 600);
frame.setVisible(true);
}
}
标签:answerFields,Set,generatedQuestions,30,new,JTextField From: https://www.cnblogs.com/LiuHuWei/p/18445866