feat: 完成小学和初中题目生成

develop
peterpan 1 week ago
parent d429dcb895
commit b76e99523e

@ -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;

@ -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() + " = ?";
}
}

@ -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<String> 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();
}
}

@ -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<String> existingQuestions = loadExistingQuestions(user.getUsername());
System.out.println("检测到历史题目 " + existingQuestions.size() + " 道。");
// IQuestionGenerator generator = createGenerator(level);
IQuestionGenerator generator = createGenerator(level);
Set<String> newQuestions = new HashSet<>();
// 生成新的、与历史和本次不重复的题目
@ -27,8 +27,8 @@ public class TestPaperService {
Set<String> 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();
}
}
}

Loading…
Cancel
Save