测试
import java.util.Random;
import java.util.Scanner;
import java.util.HashSet;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
public class InteractiveMathTest {
private static Random random = new Random();
private static Scanner scanner = new Scanner(System.in);
private static Set
private static int timeLimit = 600; // 10分钟倒计时(秒)
private static boolean timeUp = false;
private static Timer timer;
public static void main(String[] args) {
System.out.println("==========================================");
System.out.println(" 小学生数学在线测试系统");
System.out.println(" 二年级四则运算实时答题");
System.out.println("==========================================");
startTest();
}
/**
* 开始测试
*/
private static void startTest() {
System.out.println("\n🎯 测试规则:");
System.out.println(" • 共30道四则运算题");
System.out.println(" • 时间限制:" + (timeLimit / 60) + "分钟");
System.out.println(" • 减法不出现负数");
System.out.println(" • 乘法结果不超过三位数");
System.out.println(" • 除法保证整除");
System.out.println(" • 题目不重复");
System.out.print("\n请输入学生姓名:");
String studentName = scanner.nextLine();
System.out.println("\n🚀 准备开始测试,请做好准备!");
System.out.println("按回车键开始...");
scanner.nextLine();
// 开始倒计时
startTimer();
// 生成并答题
TestResult result = conductTest(studentName);
// 停止计时器
if (timer != null) {
timer.cancel();
}
// 显示结果
displayResult(result);
}
/**
* 开始倒计时
*/
private static void startTimer() {
timer = new Timer();
timer.schedule(new TimerTask() {
int remainingTime = timeLimit;
@Override
public void run() {
if (remainingTime <= 0) {
timeUp = true;
System.out.println("\n⏰ 时间到!自动提交试卷...");
this.cancel();
return;
}
// 每分钟提示一次时间
if (remainingTime % 60 == 0) {
System.out.println("⏰ 剩余时间:" + (remainingTime / 60) + "分钟");
}
// 最后10秒倒计时
if (remainingTime <= 10) {
System.out.println("⏰ 剩余:" + remainingTime + "秒");
}
remainingTime--;
}
}, 0, 1000);
}
/**
* 进行测试
*/
private static TestResult conductTest(String studentName) {
TestResult result = new TestResult(studentName);
generatedQuestions.clear();
System.out.println("\n📝 开始答题:");
System.out.println("------------------------------------------");
for (int i = 1; i <= 30 && !timeUp; i++) {
MathQuestion question = generateUniqueQuestion();
System.out.printf("\n第%2d题:%s", i, question.getQuestion());
// 获取用户答案
Integer userAnswer = getUserAnswer(i);
if (userAnswer == null) {
// 时间到,退出循环
break;
}
// 检查答案
boolean isCorrect = (userAnswer == question.getAnswer());
if (isCorrect) {
result.correctCount++;
System.out.println(" ✅ 正确!");
} else {
result.wrongQuestions.add(new WrongQuestion(question, userAnswer));
System.out.println(" ❌ 错误!正确答案是:" + question.getAnswer());
}
result.totalQuestions++;
}
// 如果时间到了但题目没做完,剩余题目算错误
if (timeUp) {
int remainingQuestions = 30 - result.totalQuestions;
for (int i = 0; i < remainingQuestions; i++) {
MathQuestion question = generateUniqueQuestion();
result.wrongQuestions.add(new WrongQuestion(question, null));
}
result.totalQuestions = 30;
}
return result;
}
/**
* 生成不重复的题目
*/
private static MathQuestion generateUniqueQuestion() {
MathQuestion question;
String questionKey;
do {
question = generateQuestion();
questionKey = question.getNum1() + question.getOperator() + question.getNum2();
} while (generatedQuestions.contains(questionKey));
generatedQuestions.add(questionKey);
return question;
}
/**
* 生成单道题目
*/
private static MathQuestion generateQuestion() {
int operation = random.nextInt(4);
int num1, num2;
String operator;
switch (operation) {
case 0: // 加法:结果不超过100
num1 = random.nextInt(50) + 1;
num2 = random.nextInt(50) + 1;
while (num1 + num2 > 100) {
num1 = random.nextInt(50) + 1;
num2 = random.nextInt(50) + 1;
}
operator = "+";
break;
case 1: // 减法:不出现负数
num1 = random.nextInt(90) + 10;
num2 = random.nextInt(num1 - 1) + 1;
operator = "-";
break;
case 2: // 乘法:结果不超过三位数
num1 = random.nextInt(20) + 1; // 1-20
num2 = random.nextInt(50) + 1; // 1-50
while (num1 * num2 > 999) {
num1 = random.nextInt(20) + 1;
num2 = random.nextInt(50) + 1;
}
operator = "×";
break;
case 3: // 除法:保证整除
num2 = random.nextInt(9) + 2; // 除数2-10
int quotient = random.nextInt(9) + 1; // 商1-9
num1 = num2 * quotient;
operator = "÷";
break;
default:
num1 = random.nextInt(50) + 1;
num2 = random.nextInt(50) + 1;
operator = "+";
}
return new MathQuestion(num1, num2, operator);
}
/**
* 获取用户答案
*/
private static Integer getUserAnswer(int questionNum) {
System.out.print("请输入答案:");
// 设置读取超时
Timer timeoutTimer = new Timer();
timeoutTimer.schedule(new TimerTask() {
@Override
public void run() {
synchronized (scanner) {
scanner.notify();
}
}
}, 30000); // 30秒超时
try {
synchronized (scanner) {
scanner.wait();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
timeoutTimer.cancel();
if (timeUp) {
return null;
}
try {
return scanner.nextInt();
} catch (Exception e) {
scanner.nextLine(); // 清除错误输入
System.out.println(" ⚠️ 输入无效,请重新输入!");
return getUserAnswer(questionNum);
}
}
/**
* 显示测试结果
*/
private static void displayResult(TestResult result) {
System.out.println("\n==========================================");
System.out.println(" 测试结果统计");
System.out.println("==========================================");
System.out.printf("学生姓名:%s\n", result.studentName);
System.out.printf("完成题目:%d/%d题\n", result.totalQuestions, 30);
System.out.printf("答对题目:%d题\n", result.correctCount);
System.out.printf("答错题目:%d题\n", result.wrongQuestions.size());
double accuracy = (double) result.correctCount / result.totalQuestions * 100;
System.out.printf("正确率:%.1f%%\n", accuracy);
// 显示错题
if (!result.wrongQuestions.isEmpty()) {
System.out.println("\n📖 错题回顾:");
System.out.println("------------------------------------------");
for (int i = 0; i < result.wrongQuestions.size(); i++) {
WrongQuestion wq = result.wrongQuestions.get(i);
String userAnswerStr = (wq.userAnswer == null) ? "未作答" : wq.userAnswer.toString();
System.out.printf("%2d. %s 你的答案:%s 正确答案:%d\n",
i + 1, wq.question.getQuestion(), userAnswerStr, wq.question.getAnswer());
}
}
// 评价
System.out.println("\n💫 学习评价:");
if (accuracy >= 90) {
System.out.println(" 优秀!继续保持!🎉");
} else if (accuracy >= 80) {
System.out.println(" 良好!继续加油!👍");
} else if (accuracy >= 60) {
System.out.println(" 及格!需要更多练习!💪");
} else {
System.out.println(" 需要加强练习,不要气馁!📚");
}
}
/**
* 数学题目类
*/
static class MathQuestion {
private int num1;
private int num2;
private String operator;
public MathQuestion(int num1, int num2, String operator) {
this.num1 = num1;
this.num2 = num2;
this.operator = operator;
}
public String getQuestion() {
return String.format("%d %s %d = ", num1, operator, num2);
}
public int getAnswer() {
switch (operator) {
case "+": return num1 + num2;
case "-": return num1 - num2;
case "×": return num1 * num2;
case "÷": return num1 / num2;
default: return num1 + num2;
}
}
public int getNum1() { return num1; }
public int getNum2() { return num2; }
public String getOperator() { return operator; }
}
/**
* 错题记录类
*/
static class WrongQuestion {
MathQuestion question;
Integer userAnswer;
public WrongQuestion(MathQuestion question, Integer userAnswer) {
this.question = question;
this.userAnswer = userAnswer;
}
}
/**
* 测试结果类
*/
static class TestResult {
String studentName;
int totalQuestions;
int correctCount;
java.util.List<WrongQuestion> wrongQuestions;
public TestResult(String studentName) {
this.studentName = studentName;
this.wrongQuestions = new java.util.ArrayList<>();
}
}
}

浙公网安备 33010602011771号