大版本合并请求 #1

Merged
hnu202326010318 merged 2 commits from develop into main 4 months ago

@ -1,38 +1,44 @@
package com.mathgenerator.generator;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
*
* (bug)
* ()
*/
public class JuniorHighSchoolGenerator extends PrimarySchoolGenerator {
@Override
public String generateSingleQuestion() {
// 1. 先生成一个完整的小学难度题目(包含括号等)
String basicQuestion = super.generateSingleQuestion();
ThreadLocalRandom random = ThreadLocalRandom.current();
// 移除括号并拆分,确保操作的纯净性
String[] parts = basicQuestion.replace("(", "").replace(")", "").trim().split("\\s+");
// --- 修正部分开始 ---
// 1. 计算有多少个操作数(数字)
int numOperands = (parts.length + 1) / 2;
// 2. 在 0 到 (操作数数量 - 1) 之间随机选择一个
int randomOperandChoice = random.nextInt(numOperands);
// 3. 将其转换为在 parts 数组中的实际索引
int indexToModify = randomOperandChoice * 2;
// --- 修正部分结束 ---
// 2. 使用正则表达式查找出题目中所有的数字
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(basicQuestion);
List<String> numbers = new ArrayList<>();
while (matcher.find()) {
numbers.add(matcher.group());
}
String operand = parts[indexToModify];
if (numbers.isEmpty()) {
return basicQuestion; // 如果没有数字,直接返回
}
// 3. 随机选择一个数字进行修改
String numberToModify = numbers.get(random.nextInt(numbers.size()));
String modifiedNumber;
if (random.nextBoolean()) {
parts[indexToModify] = operand + "²"; // 平方
modifiedNumber = numberToModify + "²"; // 平方
} else {
parts[indexToModify] = "√" + operand; // 开根号
modifiedNumber = "√" + numberToModify; // 开根号
}
return String.join(" ", parts);
// 4. 将修改后的数字替换回原题目,只替换第一个匹配项以保证随机性
return basicQuestion.replaceFirst(Pattern.quote(numberToModify), modifiedNumber);
}
}

@ -1,36 +1,42 @@
package com.mathgenerator.generator;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
* sin, cos, tan
* (bug)
* () sin, cos, tan
*/
public class SeniorHighSchoolGenerator extends PrimarySchoolGenerator {
public class SeniorHighSchoolGenerator extends JuniorHighSchoolGenerator { // <-- 关键改动:继承自初中生成器
private static final String[] TRIG_FUNCTIONS = {"sin", "cos", "tan"};
@Override
public String generateSingleQuestion() {
String basicQuestion = super.generateSingleQuestion();
// 1. 先生成一个完整的初中难度题目(已包含小学内容和平方/开根号)
String juniorHighQuestion = super.generateSingleQuestion();
ThreadLocalRandom random = ThreadLocalRandom.current();
// 移除括号并拆分,确保操作的纯净性
String[] parts = basicQuestion.replace("(", "").replace(")", "").trim().split("\\s+");
// 2. 查找出题目中所有的数字
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(juniorHighQuestion);
List<String> numbers = new ArrayList<>();
while (matcher.find()) {
numbers.add(matcher.group());
}
// --- 修正部分开始 ---
// 1. 计算有多少个操作数(数字)
int numOperands = (parts.length + 1) / 2;
// 2. 在 0 到 (操作数数量 - 1) 之间随机选择一个
int randomOperandChoice = random.nextInt(numOperands);
// 3. 将其转换为在 parts 数组中的实际索引
int indexToModify = randomOperandChoice * 2;
// --- 修正部分结束 ---
if (numbers.isEmpty()) {
return juniorHighQuestion;
}
String operand = parts[indexToModify];
// 3. 随机选择一个数字,用三角函数包裹
String numberToModify = numbers.get(random.nextInt(numbers.size()));
String function = TRIG_FUNCTIONS[random.nextInt(TRIG_FUNCTIONS.length)];
parts[indexToModify] = function + "(" + operand + ")";
String modifiedNumber = function + "(" + numberToModify + ")";
return String.join(" ", parts);
// 4. 将修改后的部分替换回原题目
return juniorHighQuestion.replaceFirst(Pattern.quote(numberToModify), modifiedNumber);
}
}

@ -26,17 +26,15 @@ public class ConsoleUI {
*
*/
public void run() {
//TODO:警告:(29, 9) 'while' 语句不能在未抛出异常的情况下完成
//TODO警告:(29, 9) 'while' 语句不能在未抛出异常的情况下完成
while (true) {
Optional<User> userOptional = handleLogin();
userOptional.ifPresent(this::showUserMenu);
}
}
// --- 以下方法与之前的Main类完全相同只是从static变为实例方法 ---
private Optional<User> handleLogin() {
printHeader("欢迎登录中小学数学卷子自动生成平台");
printHeader("用户登录"); // 统一标题格式
System.out.print("请输入用户名和密码 (用空格隔开): (输入 exit 退出程序)\n> ");
String line = scanner.nextLine();
@ -89,34 +87,38 @@ public class ConsoleUI {
}
}
/**
*
*/
private Level handleLevelSwitchMenu(Level currentLevel) {
printHeader("请选择难度级别");
System.out.println("1. 小学 (+, -, *, /, 括号)");
System.out.println("2. 初中 (包含平方、开根号)");
System.out.println("3. 高中 (包含三角函数)");
System.out.println("0. 返回主菜单");
printSeparator();
System.out.print("请选择 (0-3): ");
String choice = scanner.nextLine().trim();
Level newLevel = switch (choice) {
case "1" -> Level.PRIMARY;
case "2" -> Level.JUNIOR_HIGH;
case "3" -> Level.SENIOR_HIGH;
case "0" -> null;
default -> {
System.out.println("无效输入,请重新选择。");
yield currentLevel;
}
};
while (true) { // <-- 增加循环
printHeader("请选择难度级别");
System.out.println("1. 小学 (+, -, *, /, 括号)");
System.out.println("2. 初中 (包含平方、开根号)");
System.out.println("3. 高中 (包含三角函数)");
System.out.println("0. 返回主菜单");
printSeparator();
System.out.print("请选择 (0-3): ");
String choice = scanner.nextLine().trim();
if (newLevel != null && newLevel != currentLevel) {
System.out.println("难度已成功切换为 " + newLevel.getChineseName() + "。");
return newLevel;
} else if (newLevel == null) {
System.out.println("已返回主菜单。");
switch (choice) {
case "1":
System.out.println("难度已成功切换为 " + Level.PRIMARY.getChineseName() + "。");
return Level.PRIMARY; // 直接返回,退出循环
case "2":
System.out.println("难度已成功切换为 " + Level.JUNIOR_HIGH.getChineseName() + "。");
return Level.JUNIOR_HIGH; // 直接返回,退出循环
case "3":
System.out.println("难度已成功切换为 " + Level.SENIOR_HIGH.getChineseName() + "。");
return Level.SENIOR_HIGH; // 直接返回,退出循环
case "0":
System.out.println("已返回主菜单。");
return currentLevel; // 返回当前难度,退出循环
default:
// 如果输入无效,打印提示信息,循环将继续,要求用户重新输入
System.out.println("无效输入,请输入 0-3 之间的数字。");
}
}
return currentLevel;
}
private void handleGeneration(User user, Level currentLevel) {

Loading…
Cancel
Save