课后作业2

动手动脑:
1.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数。
解:import java.util.Arrays;

public class RandomNumberGenerator {

/**
 * 使用线性同余生成器算法生成指定数量的随机整数
 * @param count 要生成的随机整数数量
 * @param seed 随机数种子
 * @return 包含随机整数的数组
 */
public static int[] generateRandomNumbers(int count, long seed) {
    if (count <= 0) {
        throw new IllegalArgumentException("生成数量必须大于0");
    }
    
    int[] randomNumbers = new int[count];
    long current = seed;
    
    // 线性同余生成器参数 (使用Java默认随机数生成器的参数)
    long a = 25214903917L;  // 乘数
    long c = 11L;           // 增量
    long m = (long) Math.pow(2, 48); // 模数 2^48
    
    for (int i = 0; i < count; i++) {
        // 线性同余公式: X_{n+1} = (a * X_n + c) mod m
        current = (a * current + c) % m;
        
        // 取高32位作为随机数,转换为int类型
        randomNumbers[i] = (int) (current >>> 16);
    }
    
    return randomNumbers;
}

/**
 * 使用系统时间作为种子生成随机数
 * @param count 要生成的随机整数数量
 * @return 包含随机整数的数组
 */
public static int[] generateRandomNumbers(int count) {
    return generateRandomNumbers(count, System.currentTimeMillis());
}

/**
 * 测试方法
 */
public static void main(String[] args) {
    // 生成10个随机数
    int[] randomNumbers1 = generateRandomNumbers(10, 12345L);
    System.out.println("使用种子12345生成的10个随机数:");
    System.out.println(Arrays.toString(randomNumbers1));
    
    // 生成1000个随机数
    int[] randomNumbers2 = generateRandomNumbers(1000);
    System.out.println("\n使用系统时间作为种子生成的1000个随机数:");
    
    // 统计前20个
    System.out.print("前20个随机数: ");
    for (int i = 0; i < 20 && i < randomNumbers2.length; i++) {
        System.out.print(randomNumbers2[i] + " ");
    }
    System.out.println("...");
    
    // 基本统计信息
    System.out.println("\n统计信息:");
    System.out.println("总数: " + randomNumbers2.length);
    System.out.println("第一个: " + randomNumbers2[0]);
    System.out.println("最后一个: " + randomNumbers2[randomNumbers2.length - 1]);
    
    // 验证范围(应该是32位有符号整数范围)
    int min = Integer.MAX_VALUE;
    int max = Integer.MIN_VALUE;
    for (int num : randomNumbers2) {
        if (num < min) min = num;
        if (num > max) max = num;
    }
    System.out.println("最小值: " + min);
    System.out.println("最大值: " + max);
}

}
2. 请看以下代码,你发现了有什么特殊之处吗?

解:该段代码使用了方法重载,这段代码方法名相同;参数类型不同,参数个数不同,或者是参数类型的顺序不同。提高了代码的灵活性和可读性。
课后作业

  1. 四则运算课堂测试一
     阶段1:像二柱子那样,花二十分钟写一个能自动生成30道小学四则运算题目的 “软件”
    解:import java.util.Random;

public class PrimarySchoolMathGenerator {
private static Random random = new Random();

public static void main(String[] args) {
    System.out.println("小学生四则运算练习题");
    System.out.println("====================");
    System.out.println();
    
    // 生成30道题目
    for (int i = 1; i <= 30; i++) {
        String exercise = generateExercise();
        System.out.println(i + ". " + exercise);
    }
    
    System.out.println();
    System.out.println("加油!做完记得检查哦!");
}

/**
 * 生成一道四则运算题目
 */
private static String generateExercise() {
    // 随机选择运算类型:0-加法,1-减法,2-乘法,3-除法
    int operation = random.nextInt(4);
    
    switch (operation) {
        case 0:
            return generateAddition();
        case 1:
            return generateSubtraction();
        case 2:
            return generateMultiplication();
        case 3:
            return generateDivision();
        default:
            return generateAddition();
    }
}

/**
 * 生成加法题目(和不超过100)
 */
private static String generateAddition() {
    int a = random.nextInt(50) + 1; // 1-50
    int b = random.nextInt(50) + 1; // 1-50
    
    // 确保和不超过100
    while (a + b > 100) {
        a = random.nextInt(50) + 1;
        b = random.nextInt(50) + 1;
    }
    
    return a + " + " + b + " = ";
}

/**
 * 生成减法题目(结果不为负数)
 */
private static String generateSubtraction() {
    int a = random.nextInt(50) + 10; // 10-59
    int b = random.nextInt(a) + 1;   // 1-a,确保结果不为负数
    
    return a + " - " + b + " = ";
}

/**
 * 生成乘法题目(乘数不超过10,积不超过100)
 */
private static String generateMultiplication() {
    int a = random.nextInt(10) + 1; // 1-10
    int b = random.nextInt(10) + 1; // 1-10
    
    // 确保积不超过100
    while (a * b > 100) {
        a = random.nextInt(10) + 1;
        b = random.nextInt(10) + 1;
    }
    
    return a + " × " + b + " = ";
}

/**
 * 生成除法题目(确保能整除)
 */
private static String generateDivision() {
    // 先确定除数(1-10)
    int divisor = random.nextInt(10) + 1;
    // 再确定商(1-10)
    int quotient = random.nextInt(10) + 1;
    // 被除数 = 除数 × 商
    int dividend = divisor * quotient;
    
    // 确保被除数不超过100
    while (dividend > 100) {
        divisor = random.nextInt(10) + 1;
        quotient = random.nextInt(10) + 1;
        dividend = divisor * quotient;
    }
    
    return dividend + " ÷ " + divisor + " = ";
}

}
2. 四则运算课堂测试二
阶段2:
(1)要求题目避免重复,减法不允许出现负数,乘法结果不允许出现四位数,除法必须整除不允许出现小数;
(2)实现在线实时答题,并在答题结束后,统计显示错题数,正确率;
(3)增加倒计时功能,要求在指定时间内完成测试,超时未做完视为错题。
要求上述内容编写方法实现。

解:import java.util.;
import java.util.concurrent.
;

public class AdvancedMathTestSystem {
private static Random random = new Random();
private static Scanner scanner = new Scanner(System.in);
private static Set generatedExercises = new HashSet<>(); // 用于避免重复题目

// 题目和答案存储
private static List<String> exercises = new ArrayList<>();
private static List<Integer> correctAnswers = new ArrayList<>();
private static List<Integer> userAnswers = new ArrayList<>();

// 测试配置
private static final int TOTAL_QUESTIONS = 10; // 题目数量
private static final int TIME_LIMIT = 60; // 时间限制(秒)

public static void main(String[] args) {
    System.out.println("小学生四则运算在线测试系统");
    System.out.println("========================");
    System.out.println("规则说明:");
    System.out.println("- 共 " + TOTAL_QUESTIONS + " 道题目");
    System.out.println("- 时间限制: " + TIME_LIMIT + " 秒");
    System.out.println("- 超时未完成的题目视为错误");
    System.out.println("========================");
    
    // 生成不重复的题目
    generateUniqueExercises(TOTAL_QUESTIONS);
    
    // 开始测试(带倒计时)
    startTimedTest();
    
    // 显示结果统计
    showTestResults();
    
    scanner.close();
}

/**
 * 生成指定数量的不重复题目
 */
private static void generateUniqueExercises(int count) {
    int attempts = 0;
    int maxAttempts = count * 10; // 防止无限循环
    
    while (exercises.size() < count && attempts < maxAttempts) {
        String exercise = generateExercise();
        
        // 检查是否重复
        if (!generatedExercises.contains(exercise)) {
            exercises.add(exercise);
            generatedExercises.add(exercise);
            
            // 计算并存储正确答案
            int answer = calculateAnswer(exercise);
            correctAnswers.add(answer);
        }
        
        attempts++;
    }
    
    // 如果无法生成足够的不重复题目,用重复题目补足
    while (exercises.size() < count) {
        String exercise = generateExercise();
        exercises.add(exercise);
        int answer = calculateAnswer(exercise);
        correctAnswers.add(answer);
    }
}

/**
 * 生成一道四则运算题目
 */
private static String generateExercise() {
    int operation = random.nextInt(4);
    
    switch (operation) {
        case 0: return generateAddition();
        case 1: return generateSubtraction();
        case 2: return generateMultiplication();
        case 3: return generateDivision();
        default: return generateAddition();
    }
}

/**
 * 生成加法题目(和不超过100)
 */
private static String generateAddition() {
    int a = random.nextInt(50) + 1;
    int b = random.nextInt(50) + 1;
    
    // 确保和不超过100
    while (a + b > 100) {
        a = random.nextInt(50) + 1;
        b = random.nextInt(50) + 1;
    }
    
    return a + " + " + b + " = ";
}

/**
 * 生成减法题目(结果不为负数)
 */
private static String generateSubtraction() {
    int a = random.nextInt(50) + 10;
    int b = random.nextInt(a) + 1; // 确保结果不为负数
    
    return a + " - " + b + " = ";
}

/**
 * 生成乘法题目(积不超过三位数)
 */
private static String generateMultiplication() {
    int a = random.nextInt(20) + 1; // 1-20
    int b = random.nextInt(10) + 1; // 1-10
    
    // 确保积不超过三位数(即不超过999)
    while (a * b > 999) {
        a = random.nextInt(20) + 1;
        b = random.nextInt(10) + 1;
    }
    
    return a + " × " + b + " = ";
}

/**
 * 生成除法题目(确保能整除)
 */
private static String generateDivision() {
    int divisor = random.nextInt(10) + 1; // 1-10
    int quotient = random.nextInt(10) + 1; // 1-10
    int dividend = divisor * quotient;
    
    // 确保被除数不超过100
    while (dividend > 100) {
        divisor = random.nextInt(10) + 1;
        quotient = random.nextInt(10) + 1;
        dividend = divisor * quotient;
    }
    
    return dividend + " ÷ " + divisor + " = ";
}

/**
 * 开始带倒计时的测试
 */
private static void startTimedTest() {
    System.out.println("\n测试开始!剩余时间: " + TIME_LIMIT + " 秒");
    System.out.println("========================");
    
    // 创建倒计时线程
    CountDownLatch countDownLatch = new CountDownLatch(1);
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        int remainingTime = TIME_LIMIT;
        
        @Override
        public void run() {
            if (remainingTime <= 0) {
                System.out.println("\n\n时间到!测试结束。");
                countDownLatch.countDown();
                this.cancel();
                return;
            }
            
            // 每10秒显示一次剩余时间
            if (remainingTime % 10 == 0 || remainingTime <= 5) {
                System.out.println("剩余时间: " + remainingTime + " 秒");
            }
            
            remainingTime--;
        }
    }, 0, 1000); // 每秒执行一次
    
    // 记录开始时间
    long startTime = System.currentTimeMillis();
    
    // 开始答题
    for (int i = 0; i < exercises.size(); i++) {
        // 检查是否超时
        long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
        if (elapsedTime >= TIME_LIMIT) {
            System.out.println("\n时间到!未完成的题目视为错误。");
            // 为未答题的题目填充-1作为错误标记
            for (int j = i; j < exercises.size(); j++) {
                userAnswers.add(-1);
            }
            break;
        }
        
        System.out.print((i + 1) + ". " + exercises.get(i));
        String input = scanner.nextLine().trim();
        
        try {
            int answer = Integer.parseInt(input);
            userAnswers.add(answer);
        } catch (NumberFormatException e) {
            // 输入无效,视为错误
            userAnswers.add(-1);
            System.out.println("  输入无效,已记录为错误答案");
        }
    }
    
    // 停止计时器
    timer.cancel();
    
    // 确保所有题目都有用户答案
    while (userAnswers.size() < exercises.size()) {
        userAnswers.add(-1);
    }
}

/**
 * 显示测试结果统计
 */
private static void showTestResults() {
    System.out.println("\n\n测试结果统计");
    System.out.println("============");
    
    int correctCount = 0;
    List<Integer> wrongQuestions = new ArrayList<>();
    
    // 统计正确率和错题
    for (int i = 0; i < exercises.size(); i++) {
        if (userAnswers.get(i) == correctAnswers.get(i)) {
            correctCount++;
        } else {
            wrongQuestions.add(i + 1); // 记录错题编号
        }
    }
    
    // 显示统计信息
    double accuracy = (double) correctCount / exercises.size() * 100;
    System.out.println("总题数: " + exercises.size());
    System.out.println("答对题数: " + correctCount);
    System.out.println("答错题数: " + (exercises.size() - correctCount));
    System.out.printf("正确率: %.2f%%\n", accuracy);
    
    // 显示错题详情
    if (!wrongQuestions.isEmpty()) {
        System.out.println("\n错题列表:");
        for (int questionNum : wrongQuestions) {
            int index = questionNum - 1;
            System.out.println(questionNum + ". " + exercises.get(index) + 
                             "你的答案: " + 
                             (userAnswers.get(index) == -1 ? "未作答" : userAnswers.get(index)) + 
                             ", 正确答案: " + correctAnswers.get(index));
        }
        
        System.out.println("\n建议重点复习以上错题!");
    } else {
        System.out.println("\n太棒了!全部答对!");
    }
}

/**
 * 计算题目的正确答案
 */
private static int calculateAnswer(String exercise) {
    if (exercise.contains("+")) {
        String[] parts = exercise.split(" \\+ ");
        int a = Integer.parseInt(parts[0]);
        int b = Integer.parseInt(parts[1].split(" ")[0]);
        return a + b;
    } else if (exercise.contains("-")) {
        String[] parts = exercise.split(" - ");
        int a = Integer.parseInt(parts[0]);
        int b = Integer.parseInt(parts[1].split(" ")[0]);
        return a - b;
    } else if (exercise.contains("×")) {
        String[] parts = exercise.split(" × ");
        int a = Integer.parseInt(parts[0]);
        int b = Integer.parseInt(parts[1].split(" ")[0]);
        return a * b;
    } else if (exercise.contains("÷")) {
        String[] parts = exercise.split(" ÷ ");
        int a = Integer.parseInt(parts[0]);
        int b = Integer.parseInt(parts[1].split(" ")[0]);
        return a / b;
    }
    return 0;
}

}

posted @ 2025-12-26 18:52  cuizao  阅读(0)  评论(0)    收藏  举报