测试
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号