From db42c0e2b1d4854744534c22a536c17a583aa63f Mon Sep 17 00:00:00 2001 From: smallbailangui Date: Thu, 25 Sep 2025 10:55:13 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/mathgenerator/ui/ConsoleUI.java | 60 +++++++++++++------------ 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/com/mathgenerator/ui/ConsoleUI.java b/src/com/mathgenerator/ui/ConsoleUI.java index ec3b7fb..6fad7ed 100644 --- a/src/com/mathgenerator/ui/ConsoleUI.java +++ b/src/com/mathgenerator/ui/ConsoleUI.java @@ -26,17 +26,15 @@ public class ConsoleUI { * 启动并运行整个用户界面主循环。 */ public void run() { - //TODO:警告:(29, 9) 'while' 语句不能在未抛出异常的情况下完成 + //TODO:警告:(29, 9) 'while' 语句不能在未抛出异常的情况下完成 while (true) { Optional userOptional = handleLogin(); userOptional.ifPresent(this::showUserMenu); } } - // --- 以下方法与之前的Main类完全相同,只是从static变为实例方法 --- - private Optional 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) { -- 2.34.1 From 542c3c1687baa79e2f284dd41225408c66ecd155 Mon Sep 17 00:00:00 2001 From: smallbailangui Date: Thu, 25 Sep 2025 11:07:59 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A2=98=E7=9B=AE?= =?UTF-8?q?=E7=94=9F=E6=88=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/JuniorHighSchoolGenerator.java | 40 +++++++++++-------- .../generator/SeniorHighSchoolGenerator.java | 40 +++++++++++-------- 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/src/com/mathgenerator/generator/JuniorHighSchoolGenerator.java b/src/com/mathgenerator/generator/JuniorHighSchoolGenerator.java index a8bccad..5b9cadb 100644 --- a/src/com/mathgenerator/generator/JuniorHighSchoolGenerator.java +++ b/src/com/mathgenerator/generator/JuniorHighSchoolGenerator.java @@ -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 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); } } \ No newline at end of file diff --git a/src/com/mathgenerator/generator/SeniorHighSchoolGenerator.java b/src/com/mathgenerator/generator/SeniorHighSchoolGenerator.java index eb5cc14..a187a4b 100644 --- a/src/com/mathgenerator/generator/SeniorHighSchoolGenerator.java +++ b/src/com/mathgenerator/generator/SeniorHighSchoolGenerator.java @@ -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 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); } } \ No newline at end of file -- 2.34.1