diff --git a/src/Main.java b/src/Main.java index 69a8c59..2ffa7e5 100644 --- a/src/Main.java +++ b/src/Main.java @@ -50,7 +50,7 @@ public class Main { System.out.printf("准备生成%s数学题目, 请输入生成题目数量(可输入“切换为(小学/初中/高中)”;输入-1将退出当前用户, 重新登录):%n", currentLevel.getName()); // 生成提示 String input = scanner.nextLine(); - if (input.startsWith("切换为")) { // 切换类型功能 + if (input.startsWith("切换为")) { handleLevelSwitch(input); return; } @@ -61,7 +61,7 @@ public class Main { currentUser = null; currentLevel = null; System.out.println("已退出,请重新登录。"); - } else if (count >= 10 && count <= 30) { // 题目数量的有效输入范围是“10-30” + } else if (count >= 10 && count <= 30) { testPaperService.generateAndSave(currentUser, currentLevel, count); } else { System.out.println("输入无效,请输入10-30之间的数字或-1。"); @@ -72,7 +72,7 @@ public class Main { } private static void handleLevelSwitch(String input) { - String levelStr = input.substring(3).trim(); // "切换为" 后面是级别 + String levelStr = input.substring(3).trim(); Level newLevel = Level.fromString(levelStr); if (newLevel != null) { currentLevel = newLevel; diff --git a/src/generator/ElementarySchoolGenerator.java b/src/generator/ElementarySchoolGenerator.java new file mode 100644 index 0000000..84f0777 --- /dev/null +++ b/src/generator/ElementarySchoolGenerator.java @@ -0,0 +1,35 @@ +package generator; + +public class ElementarySchoolGenerator extends BaseGenerator { + private final String[] OPERATORS = {"+", "-", "*", "/"}; // 难度要求 + + @Override + protected String createUniqueQuestion() { + int numOperands = getNumberOfOperands(); + if (numOperands == 1) { + return String.valueOf(getRandomOperand()); + } + + StringBuilder sb = new StringBuilder(); + sb.append(getRandomOperand()); + for (int i = 0; i < numOperands - 1; i++) { + String operator = OPERATORS[random.nextInt(OPERATORS.length)]; + int operand = getRandomOperand(); + + // 简单处理除法,避免除以0或结果过小 + if (operator.equals("/") && operand != 0) { + int prevOperand = Integer.parseInt(sb.substring(sb.lastIndexOf(" ") + 1)); + sb = new StringBuilder(String.valueOf(prevOperand * operand)); + sb.append(" / ").append(operand); + } else { + sb.append(" ").append(operator).append(" ").append(getRandomOperand()); + } + } + + if (numOperands > 2 && random.nextBoolean()) { + sb.insert(0, "("); + sb.append(")"); + } + return sb.toString() + " = ?"; + } +} diff --git a/src/generator/JuniorHighGenerator.java b/src/generator/JuniorHighGenerator.java new file mode 100644 index 0000000..b1befc0 --- /dev/null +++ b/src/generator/JuniorHighGenerator.java @@ -0,0 +1,37 @@ +package generator; + +import java.util.ArrayList; +import java.util.List; + +public class JuniorHighGenerator extends BaseGenerator { + @Override + protected String createUniqueQuestion() { + int numOperands = random.nextInt(4) + 2; + + List operands = new ArrayList<>(); + for (int i = 0; i < numOperands; i++) { + operands.add(String.valueOf(getRandomOperand())); + } + + int specialIndex = random.nextInt(numOperands); + int originalValue = Integer.parseInt(operands.get(specialIndex)); + + if (random.nextBoolean()) { + operands.set(specialIndex, "sqrt(" + (originalValue * originalValue) + ")"); + } else { + operands.set(specialIndex, originalValue + "^2"); + } + + StringBuilder questionBuilder = new StringBuilder(); + String[] basicOperators = {"+", "-", "*"}; + + questionBuilder.append(operands.get(0)); + for (int i = 1; i < numOperands; i++) { + String operator = basicOperators[random.nextInt(basicOperators.length)]; + questionBuilder.append(" ").append(operator).append(" ").append(operands.get(i)); + } + questionBuilder.append(" = ?"); + + return questionBuilder.toString(); + } +} \ No newline at end of file diff --git a/src/utils/TestPaperService.java b/src/utils/TestPaperService.java index 52011e4..f2622dc 100644 --- a/src/utils/TestPaperService.java +++ b/src/utils/TestPaperService.java @@ -1,5 +1,5 @@ package utils; -import generator.IQuestionGenerator; +import generator.*; import model.Level; import model.User; @@ -19,7 +19,7 @@ public class TestPaperService { Set existingQuestions = loadExistingQuestions(user.getUsername()); System.out.println("检测到历史题目 " + existingQuestions.size() + " 道。"); -// IQuestionGenerator generator = createGenerator(level); + IQuestionGenerator generator = createGenerator(level); Set newQuestions = new HashSet<>(); // 生成新的、与历史和本次不重复的题目 @@ -27,8 +27,8 @@ public class TestPaperService { Set used = new HashSet<>(existingQuestions); used.addAll(newQuestions); -// String question = generator.generate(used); -// newQuestions.add(question); + String question = generator.generate(used); + newQuestions.add(question); } saveToFile(user.getUsername(), newQuestions); @@ -84,15 +84,15 @@ public class TestPaperService { } } -// private IQuestionGenerator createGenerator(Level level) { -// switch (level) { -// case JUNIOR_HIGH: -// return new JuniorHighGenerator(); -// case SENIOR_HIGH: + private IQuestionGenerator createGenerator(Level level) { + switch (level) { + case JUNIOR_HIGH: + return new JuniorHighGenerator(); + case SENIOR_HIGH: // return new SeniorHighGenerator(); -// case ELEMENTARY: -// default: -// return new ElementarySchoolGenerator(); -// } -// } + case ELEMENTARY: + default: + return new ElementarySchoolGenerator(); + } + } }