课后作业1
该代码定义了一个名为MethodOverload的类,包含两个重载的square方法和main方法。在main方法中,首先调用square(7),实参7是int类型,因此会匹配参数为int类型的square方法,该方法返回77=49,输出结果为"The square of integer 7 is 49"。接着调用square(7.5),实参7.5是double类型,会匹配参数为double类型的square方法,该方法返回7.57.5=56.25,输出结果为"\nthe square of double 7.5 is 56.25"(\n表示换行)。两个square方法方法名相同,但参数类型不同(一个是int,一个是double),这体现了Java的方法重载特性,即允许在同一个类中定义多个方法名相同但参数列表不同的方法,编译器会根据实参的类型自动选择匹配的方法。
import java.util.;
import java.util.concurrent.;
public class PrimaryMathGenerator {
private static final Set
private static final Map<String, Integer> problemAnswerMap = new HashMap<>();
private static int total = 30;
private static int correct = 0;
private static int wrong = 0;
private static volatile boolean isTimeout = false;
private static Scanner scanner;
public static void main(String[] args) {
scanner = new Scanner(System.in);
int timeLimit = initTest();
List<String> problemList = generateUniqueProblems();
startCountdown(timeLimit);
doAnswer(problemList);
scanner.close();
}
private static int initTest() {
System.out.println("小学四则运算测试(" + total + "题)");
int timeLimit;
while (true) {
System.out.print("请输入答题时间(单位:秒):");
try {
timeLimit = scanner.nextInt();
scanner.nextLine();
if (timeLimit >= 60 && timeLimit <= 600) break;
System.out.println("时间需在60-600秒之间,请重新输入!");
} catch (InputMismatchException e) {
System.out.println("输入错误,请输入数字!");
scanner.nextLine();
}
}
return timeLimit;
}
private static List<String> generateUniqueProblems() {
System.out.println("\n正在生成题目...");
while (generatedProblems.size() < total) {
String problem = generateSingleProblem();
if (!generatedProblems.contains(problem)) {
generatedProblems.add(problem);
}
}
return new ArrayList<>(generatedProblems);
}
private static String generateSingleProblem() {
Random random = new Random();
int operatorType = random.nextInt(4);
int num1, num2, result = 0;
String operator = "";
switch (operatorType) {
case 0:
num1 = random.nextInt(91) + 1;
num2 = random.nextInt(100 - num1 + 1);
operator = "+";
result = num1 + num2;
break;
case 1:
num2 = random.nextInt(50) + 1;
num1 = num2 + random.nextInt(51);
operator = "-";
result = num1 - num2;
break;
case 2:
num1 = random.nextInt(31) + 1;
num2 = random.nextInt(32) + 1;
while (num1 * num2 > 999) {
num1 = random.nextInt(31) + 1;
num2 = random.nextInt(32) + 1;
}
operator = "×";
result = num1 * num2;
break;
case 3:
num2 = random.nextInt(9) + 1;
result = random.nextInt(20) + 1;
num1 = num2 * result;
operator = "÷";
break;
default:
num1 = random.nextInt(10) + 1;
num2 = random.nextInt(10) + 1;
operator = "+";
result = num1 + num2;
}
String problem = num1 + " " + operator + " " + num2 + " = ";
problemAnswerMap.put(problem, result);
return problem;
}
private static void startCountdown(int timeLimit) {
System.out.println("\n倒计时" + timeLimit + "秒,测试开始!");
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {
try {
for (int i = timeLimit; i > 0; i--) {
Thread.sleep(1000);
if (i % 10 == 0 || i <= 5) {
System.out.println("\n【剩余时间】" + i + "秒");
}
}
isTimeout = true;
System.out.println("\n===== 时间到!未完成题目视为错题 =====");
int unfinished = total - (correct + wrong);
wrong += unfinished;
printResult();
System.exit(0);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
private static void doAnswer(List<String> problemList) {
for (int i = 0; i < total; i++) {
if (isTimeout) break;
String problem = problemList.get(i);
int correctAnswer = problemAnswerMap.get(problem);
int userAnswer = getUserInput(i + 1, problem);
checkAnswer(userAnswer, correctAnswer);
}
System.out.println("\n===== 答题完成! =====");
Executors.newSingleThreadExecutor().shutdownNow();
printResult();
}
private static int getUserInput(int questionNum, String problem) {
while (true) {
System.out.print("\n第" + questionNum + "题:" + problem);
try {
int input = scanner.nextInt();
scanner.nextLine();
return input;
} catch (InputMismatchException e) {
System.out.println("输入错误,请输入数字!");
scanner.nextLine();
}
}
}
private static void checkAnswer(int userAnswer, int correctAnswer) {
if (userAnswer == correctAnswer) {
System.out.println("正确!");
correct++;
} else {
System.out.println("错误!正确答案是:" + correctAnswer);
wrong++;
}
}
private static void printResult() {
double accuracy = (double) correct / total * 100;
System.out.println("===== 测试结果 =====");
System.out.println("总题数:" + total);
System.out.println("做对:" + correct + "题");
System.out.println("做错:" + wrong + "题");
System.out.printf("正确率:%.1f%%\n", accuracy);
}
}