动手动脑问题应用的是方法重载。
课后作业代码:
import java.util.*;
public class ArithmeticExam {
private static final Random random = new Random();
private static final Scanner scanner = new Scanner(System.in);
private static final int TOTAL_QUESTIONS = 30;
private static final int TIME_LIMIT = 300; // 5分钟倒计时(秒)
private static Set<String> generatedQuestions = new HashSet<>();
private static List<QuestionResult> wrongAnswers = new ArrayList<>();public static void main(String[] args) {System.out.println("=== 一位数四则运算考试 ===");System.out.println("考试规则:");System.out.println("- 共 " + TOTAL_QUESTIONS + " 道题");System.out.println("- 时间限制: " + TIME_LIMIT + " 秒");System.out.println("- 减法不允许出现负数");System.out.println("- 乘法结果不允许出现四位数");System.out.println("- 除法必须整除");System.out.println("=======================\n");System.out.print("按回车键开始考试...");scanner.nextLine();// 创建倒计时线程CountdownTimer timer = new CountdownTimer(TIME_LIMIT);Thread timerThread = new Thread(timer);timerThread.start();int correctCount = 0;boolean timeUp = false;// 开始考试for (int i = 1; i <= TOTAL_QUESTIONS; i++) {// 检查是否超时if (timer.isTimeUp()) {timeUp = true;System.out.println("\n⏰ 时间到!考试结束");break;}System.out.println("\n第 " + i + " 题 (剩余时间: " + timer.getRemainingTime() + "秒):");QuestionResult result = generateAndCheckQuestion(i);if (result.isCorrect()) {correctCount++;} else {wrongAnswers.add(result);}}// 停止计时器timer.stop();// 显示考试结果displayResults(correctCount, timeUp);// 显示错题if (!wrongAnswers.isEmpty()) {displayWrongAnswers();}
}/*** 生成并检查一道题目*/
private static QuestionResult generateAndCheckQuestion(int questionNumber) {String question;int correctAnswer;// 生成不重复的题目do {char operator = getRandomOperator();int num1, num2;do {num1 = random.nextInt(9) + 1; // 1-9num2 = random.nextInt(9) + 1; // 1-9} while (!isValidOperation(num1, num2, operator));correctAnswer = calculate(num1, num2, operator);question = num1 + " " + operator + " " + num2 + " = ";} while (generatedQuestions.contains(question));generatedQuestions.add(question);// 显示题目并获取答案System.out.print(question);long startTime = System.currentTimeMillis();String userInput = scanner.nextLine();long endTime = System.currentTimeMillis();// 处理用户输入int userAnswer;try {userAnswer = Integer.parseInt(userInput.trim());} catch (NumberFormatException e) {System.out.println("✗ 输入格式错误,视为答错");return new QuestionResult(questionNumber, question, correctAnswer, -1, false);}boolean isCorrect = (userAnswer == correctAnswer);if (isCorrect) {System.out.println("✓ 正确!");} else {System.out.println("✗ 错误!");}return new QuestionResult(questionNumber, question, correctAnswer, userAnswer, isCorrect);
}/*** 获取随机运算符*/
private static char getRandomOperator() {char[] operators = {'+', '-', '*', '/'};return operators[random.nextInt(operators.length)];
}/*** 验证运算是否合法*/
private static boolean isValidOperation(int num1, int num2, char operator) {switch (operator) {case '-':// 减法:不允许负数return num1 >= num2;case '*':// 乘法:结果不允许四位数(最大999)return num1 * num2 < 1000;case '/':// 除法:必须整除且除数不为0return num2 != 0 && num1 % num2 == 0;default:return true; // 加法总是合法的}
}/*** 计算结果*/
private static int calculate(int num1, int num2, char operator) {switch (operator) {case '+': return num1 + num2;case '-': return num1 - num2;case '*': return num1 * num2;case '/': return num1 / num2;default: return 0;}
}/*** 显示考试结果*/
private static void displayResults(int correctCount, boolean timeUp) {System.out.println("\n" + "=".repeat(50));System.out.println("考试结果统计");System.out.println("=".repeat(50));int answeredQuestions = timeUp ? (correctCount + wrongAnswers.size()) : TOTAL_QUESTIONS;double accuracy = (double) correctCount / answeredQuestions * 100;System.out.println("总题数: " + TOTAL_QUESTIONS);System.out.println("完成题数: " + answeredQuestions);System.out.println("正确题数: " + correctCount);System.out.println("错误题数: " + wrongAnswers.size());System.out.printf("正确率: %.2f%%\n", accuracy);if (timeUp) {System.out.println("未完成题数: " + (TOTAL_QUESTIONS - answeredQuestions));}
}/*** 显示错题*/
private static void displayWrongAnswers() {System.out.println("\n" + "=".repeat(50));System.out.println("错题回顾");System.out.println("=".repeat(50));for (QuestionResult wrong : wrongAnswers) {System.out.printf("第%d题: %s 你的答案: %d, 正确答案: %d\n",wrong.getQuestionNumber(),wrong.getQuestion(),wrong.getUserAnswer(),wrong.getCorrectAnswer());}
}/*** 倒计时计时器*/
static class CountdownTimer implements Runnable {private int remainingTime;private boolean timeUp = false;private boolean running = true;public CountdownTimer(int totalTime) {this.remainingTime = totalTime;}@Overridepublic void run() {try {while (remainingTime > 0 && running) {Thread.sleep(1000);remainingTime--;}if (remainingTime <= 0) {timeUp = true;System.out.println("\n⏰ 时间到!");}} catch (InterruptedException e) {Thread.currentThread().interrupt();}}public boolean isTimeUp() {return timeUp;}public int getRemainingTime() {return remainingTime;}public void stop() {running = false;}
}/*** 题目结果类*/
static class QuestionResult {private int questionNumber;private String question;private int correctAnswer;private int userAnswer;private boolean correct;public QuestionResult(int questionNumber, String question, int correctAnswer, int userAnswer, boolean correct) {this.questionNumber = questionNumber;this.question = question;this.correctAnswer = correctAnswer;this.userAnswer = userAnswer;this.correct = correct;}// Getter方法public int getQuestionNumber() { return questionNumber; }public String getQuestion() { return question; }public int getCorrectAnswer() { return correctAnswer; }public int getUserAnswer() { return userAnswer; }public boolean isCorrect() { return correct; }
}
}
思路:使用Random生成1-9数字和随机运算符,通过Set去重确保题目不重复,用Scanner实时接收答案,TimerThread控制倒计时,最后统计正确率和显示错题。
总结:这是一个包含题目生成、输入验证、时间控制和结果统计的完整考试系统,通过面向对象设计确保代码结构清晰且功能完善。