AIGC标识 10.8

Java第二讲「方法」课后实践汇总

本文是 Java 语言程序设计第二讲「方法」的课后实践整理,包含课程中所有动手动脑问题的解答与课后实验的代码实现。

一、动手动脑

1.1 纯随机数发生器

题目:使用线性同余算法(Modulus = 2³¹ - 1,Multiplier = 16807,C = 0)生成指定数目的随机整数。

算法原理:线性同余发生器(LCG)的递推公式为:

X_{n+1} = (a \times X_n) \bmod m

其中 m = 2³¹ - 1 = 2147483647,a = 16807,c = 0。这是 Park-Miller 最小标准随机数发生器。
public class PureRandom {
private long seed;
private static final long M = 2147483647L; // 2^31 - 1
private static final long A = 16807L;

public PureRandom(long seed) {
this.seed = seed;
}

// 生成下一个随机数(0 ~ M-1)
public long nextLong() {
seed = (A * seed) % M;
return seed;
}

// 生成 [0, bound) 范围内的随机整数
public int nextInt(int bound) {
return (int)(nextLong() % bound);
}

public static void main(String[] args) {
PureRandom random = new PureRandom(System.currentTimeMillis());
// 生成10个随机整数测试
for (int i = 0; i < 10; i++) {
System.out.print(random.nextInt(100) + " ");
}
}
}
说明:由于乘数和模数都是 int 范围内的值,直接相乘可能超出 int 范围,所以用 long 类型保存中间结果避免溢出。种子以当前时间初始化,保证每次运行结果不同。

1.2 方法重载(MethodOverLoad)观察

题目:观察 MethodOverLoad 示例代码,发现特殊之处。

结论:这是 Java 的方法重载(Overload)特性。

构成重载的条件:

1. 方法名相同;
​
2. 参数类型不同、参数个数不同,或参数类型的顺序不同;
​
3. 注意:方法的返回值类型不作为重载的判断条件。

示例代码结构如下:
public class MethodOverLoad {
// 求两个整数的和
public static int add(int a, int b) {
return a + b;
}

// 求三个整数的和(参数个数不同 → 重载)
public static int add(int a, int b, int c) {
return a + b + c;
}

// 求两个浮点数的和(参数类型不同 → 重载)
public static double add(double a, double b) {
return a + b;
}

public static void main(String[] args) {
System.out.println(add(1, 2)); // 调用 int 版本
System.out.println(add(1, 2, 3)); // 调用三参数版本
System.out.println(add(1.5, 2.5)); // 调用 double 版本
}
}
1.3 System.out.println() 重载观察

题目:查看 JDK 中 System.out.println() 方法,你发现了什么?

结论:println() 是一个典型的方法重载案例,PrintStream 类中提供了多个重载版本:

  • println()
    ​
  • println(boolean x)
    ​
  • println(char x)
    ​
  • println(int x)
    ​
  • println(long x)
    ​
  • println(float x)
    ​
  • println(double x)
    ​
  • println(char[] x)
    ​
  • println(String x)
    ​
  • println(Object x)

无论传入什么类型的数据,编译器都会根据参数类型自动选择匹配的重载方法,这就是重载带来的便利——同一个方法名处理多种数据类型,调用方无需关心具体实现细节。

二、课后实验

2.1 实验一:四则运算题目自动生成(阶段1)

题目:像二柱子那样,花二十分钟写一个能自动生成 30 道小学四则运算题目的"软件"。

实现思路:用 Math.random() 生成两个随机操作数,随机选择加减乘除运算符,循环输出 30 道题。
import java.util.Random;

public class ArithmeticGenerator {
public static void main(String[] args) {
Random rand = new Random();
String[] ops = {"+", "-", "×", "÷"};

System.out.println("===== 小学四则运算练习(共30题)=====");
for (int i = 1; i <= 30; i++) {
int a = rand.nextInt(100) + 1; // 1~100
int b = rand.nextInt(100) + 1;
String op = ops[rand.nextInt(4)];
System.out.printf("%2d. %d %s %d = ____%n", i, a, op, b);
}
}
}
运行效果:程序会输出 30 道随机生成的四则运算题,供小学生练习使用。

2.2 实验二:四则运算在线测试系统(阶段2)

题目要求:

1. 题目避免重复,减法不允许出现负数,乘法结果不允许出现四位数,除法必须整除不允许出现小数;
​
2. 实现在线实时答题,答题结束后统计显示错题数、正确率;
​
3. 增加倒计时功能,指定时间内完成测试,超时未做完视为错题。

实现思路:将题目生成、答题、计时、统计分别封装成独立方法,体现"方法"的模块化思想。用 ArrayList 去重,用 Scanner 接收用户输入,用多线程或简单计时实现倒计时。
import java.util.*;

public class ArithmeticTest {
static Set used = new HashSet<>(); // 去重
static int total = 10; // 题目数量
static int wrongCount = 0; // 错题数
static int timeLimit = 60; // 限时60秒

// 生成一道符合规则的题目,返回[题目, 答案]
public static String[] generateQuestion() {
Random rand = new Random();
int a, b, ans;
String op;
while (true) {
int type = rand.nextInt(4);
switch (type) {
case 0: // 加法
a = rand.nextInt(50) + 1;
b = rand.nextInt(50) + 1;
op = "+"; ans = a + b; break;
case 1: // 减法(结果非负)
a = rand.nextInt(100) + 1;
b = rand.nextInt(a + 1);
op = "-"; ans = a - b; break;
case 2: // 乘法(结果不超过三位数)
a = rand.nextInt(10) + 1;
b = rand.nextInt(10) + 1;
op = "×"; ans = a * b; break;
default: // 除法(整除)
b = rand.nextInt(9) + 1;
ans = rand.nextInt(9) + 1;
a = b * ans;
op = "÷"; break;
}
String q = a + op + b;
if (!used.contains(q)) { // 去重
used.add(q);
return new String[]{a + " " + op + " " + b + " = ?", String.valueOf(ans)};
}
}
}

// 答题方法
public static void startTest() {
Scanner sc = new Scanner(System.in);
System.out.println("===== 四则运算测试(限时" + timeLimit + "秒,共" + total + "题)=====");
long startTime = System.currentTimeMillis();

for (int i = 1; i <= total; i++) {
long elapsed = (System.currentTimeMillis() - startTime) / 1000;
if (elapsed >= timeLimit) {
System.out.println("时间到!剩余题目按错题计算。");
wrongCount += (total - i + 1);
break;
}
String[] q = generateQuestion();
System.out.printf("剩余时间 %ds 第%d题: %s ",
timeLimit - elapsed, i, q[0]);
int userAns = sc.nextInt();
if (userAns != Integer.parseInt(q[1])) {
wrongCount++;
System.out.println(" ✗ 正确答案: " + q[1]);
}
}
showResult();
}

// 统计结果方法
public static void showResult() {
int correct = total - wrongCount;
double rate = correct * 100.0 / total;
System.out.println("\n===== 测试结果 =====");
System.out.println("总题数: " + total);
System.out.println("做对: " + correct);
System.out.println("做错: " + wrongCount);
System.out.printf("正确率: %.1f%%%n", rate);
}

public static void main(String[] args) {
startTest();
}
}
各功能实现说明:

  • 去重:用 HashSet 保存已出过的题目字符串,生成新题时检查是否重复,重复则重新生成。
    ​
  • 减法不为负:生成 a 后,b 的范围限制在 [0, a],保证 a - b ≥ 0。
    ​
  • 乘法不超三位数:两个乘数都限制在 1~9,乘积最大为 81,不会出现四位数。
    ​
  • 除法整除:先生成除数 b 和商 ans,再让被除数 a = b × ans,保证一定整除。
    ​
  • 实时答题:用 Scanner 逐题读取用户输入并即时判断对错。
    ​
  • 倒计时:记录开始时间,每题开头计算已用时间,超时则停止答题,剩余题算错。
    ​
  • 统计:结束后输出做对/做错数量和正确率百分比。
posted @ 2026-10-08 16:05  bzdjsmmz  阅读(8)  评论(0)    收藏  举报