From 49ac5d1afcf772f2563c16c67aabb33b32ff2ad9 Mon Sep 17 00:00:00 2001 From: hnu202326010305 <1405671544@qq.com> Date: Sat, 27 Sep 2025 03:09:16 +0800 Subject: [PATCH 1/6] Update JuniorProblem.java --- src/JuniorProblem.java | 72 +++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/src/JuniorProblem.java b/src/JuniorProblem.java index 8933d87..7ef49b1 100644 --- a/src/JuniorProblem.java +++ b/src/JuniorProblem.java @@ -1,23 +1,51 @@ -import java.util.Random; - -public class JuniorProblem implements ProblemsGenerator{ - private static final Random RANDOM = new Random(); - - @Override - public String generate() { - int count = RANDOM.nextInt(5) + 1; // 1~5个数 - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < count; i++) { - int num = RANDOM.nextInt(20) + 1; - if (RANDOM.nextBoolean()) { - sb.append(num).append("^2"); - } else { - sb.append("√").append(num); - } - if (i < count - 1) { - sb.append(" + "); - } - } - return sb.toString(); - } +import java.util.Random; + +public class JuniorProblem implements ProblemsGenerator { + private static final Random RANDOM = new Random(); + private static final String[] OPERATORS = {"+", "-", "*", "/"}; + private static final String[] POW_OPERATORS = {"√", "^2"}; + + @Override + public String generate() { + String primaryExpr = generatePrimaryExpression(); + return addPowerOperators(primaryExpr); + } + + private String generatePrimaryExpression() { + int count = RANDOM.nextInt(4) + 2; + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < count; i++) { + sb.append(RANDOM.nextInt(100) + 1); + if (i < count - 1) { + sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" "); + } + } + return sb.toString(); + } + + private String addPowerOperators(String expr) { + String[] parts = expr.split(" "); + boolean hasPower = false; + + for (int i = 0; i < parts.length; i++) { + if (parts[i].matches("\\d+") && (!hasPower || RANDOM.nextBoolean())) { + String op = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)]; + parts[i] = op.equals("√") ? "√" + parts[i] : parts[i] + "^2"; + hasPower = true; + } + } + + if (!hasPower) { + for (int i = 0; i < parts.length; i++) { + if (parts[i].matches("\\d+")) { + String op = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)]; + parts[i] = op.equals("√") ? "√" + parts[i] : parts[i] + "^2"; + break; + } + } + } + + return String.join(" ", parts); + } } \ No newline at end of file From 3d016d0eec4415a7c9828d2bb1ede4281fb23588 Mon Sep 17 00:00:00 2001 From: hnu202326010305 <1405671544@qq.com> Date: Sat, 27 Sep 2025 03:09:37 +0800 Subject: [PATCH 2/6] Update PrimaryProblem.java --- src/PrimaryProblem.java | 62 ++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 19 deletions(-) diff --git a/src/PrimaryProblem.java b/src/PrimaryProblem.java index 4b5e693..36601e7 100644 --- a/src/PrimaryProblem.java +++ b/src/PrimaryProblem.java @@ -1,20 +1,44 @@ -import java.util.Random; - -public class PrimaryProblem implements ProblemsGenerator { - private static final Random RANDOM = new Random(); - private static final char[] OPS = {'+', '-', '*', '/'}; - - @Override - public String generate() { - int count = RANDOM.nextInt(5) + 1; // 1~5个数 - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < count; i++) { - int num = RANDOM.nextInt(100) + 1; - sb.append(num); - if (i < count - 1) { - sb.append(" ").append(OPS[RANDOM.nextInt(OPS.length)]).append(" "); - } - } - return sb.toString(); - } +import java.util.Random; + +public class PrimaryProblem implements ProblemsGenerator { + private static final Random RANDOM = new Random(); + private static final String[] OPERATORS = {"+", "-", "*", "/"}; + + @Override + public String generate() { + int count = RANDOM.nextInt(4) + 2; + StringBuilder sb = new StringBuilder(); + + boolean addParentheses = count >= 3 && RANDOM.nextDouble() < 0.5; + if (addParentheses) { + int parenCount = RANDOM.nextInt(count - 2) + 2; + int startPos = RANDOM.nextInt(count - parenCount + 1); + + for (int i = 0; i < count; i++) { + if (i == startPos) { + sb.append("( "); + } + + int num = RANDOM.nextInt(100) + 1; + sb.append(num); + + if (i == startPos + parenCount - 1) { + sb.append(" )"); + } + + if (i < count - 1) { + sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" "); + } + } + } else { + for (int i = 0; i < count; i++) { + int num = RANDOM.nextInt(100) + 1; + sb.append(num); + if (i < count - 1) { + sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" "); + } + } + } + return sb.toString(); + } } \ No newline at end of file From 1b3ae88cf4890817654676dbd6f3d8c9f52e7327 Mon Sep 17 00:00:00 2001 From: hnu202326010305 <1405671544@qq.com> Date: Sat, 27 Sep 2025 03:10:26 +0800 Subject: [PATCH 3/6] Update SeniorProblem.java --- src/SeniorProblem.java | 126 ++++++++++++++++++++++++++++++++++------- 1 file changed, 106 insertions(+), 20 deletions(-) diff --git a/src/SeniorProblem.java b/src/SeniorProblem.java index a5675bf..72cae10 100644 --- a/src/SeniorProblem.java +++ b/src/SeniorProblem.java @@ -1,21 +1,107 @@ -import java.util.Random; - -public class SeniorProblem implements ProblemsGenerator{ - private static final Random RANDOM = new Random(); - private static final String[] FUNCS = {"sin", "cos", "tan"}; - - @Override - public String generate() { - int count = RANDOM.nextInt(5) + 1; // 1~5个数 - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < count; i++) { - int angle = RANDOM.nextInt(90) + 1; - String func = FUNCS[RANDOM.nextInt(FUNCS.length)]; - sb.append(func).append("(").append(angle).append("°)"); - if (i < count - 1) { - sb.append(" + "); - } - } - return sb.toString(); - } +import java.util.Random; + +public class SeniorProblem implements ProblemsGenerator { + private static final Random RANDOM = new Random(); + private static final String[] OPERATORS = {"+", "-", "*", "/"}; + private static final String[] POW_OPERATORS = {"√", "^2"}; + private static final String[] TRIG_OPERATORS = {"sin", "cos", "tan"}; + + @Override + public String generate() { + String primaryExpression = generatePrimaryExpression(); + + return addHighSchoolOperators(primaryExpression); + } + + private String generatePrimaryExpression() { + int count = RANDOM.nextInt(4) + 2; + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < count; i++) { + int num = RANDOM.nextInt(100) + 1; + sb.append(num); + if (i < count - 1) { + sb.append(" ").append(OPERATORS[RANDOM.nextInt(OPERATORS.length)]).append(" "); + } + } + return sb.toString(); + } + + private String addHighSchoolOperators(String primaryExpression) { + String[] parts = primaryExpression.split(" "); + StringBuilder result = new StringBuilder(); + boolean hasTrigonometry = false; + boolean hasAlgebra = false; + + for (int i = 0; i < parts.length; i++) { + String part = parts[i]; + + if (isNumber(part)) { + if (!hasTrigonometry || RANDOM.nextDouble() < 0.6) { + part = applyTrigOperator(part); + hasTrigonometry = true; + } + else if (RANDOM.nextDouble() < 0.3) { + part = applyAlgebraOperator(part); + hasAlgebra = true; + } + } + + result.append(part); + if (i < parts.length - 1) { + result.append(" "); + } + } + + if (!hasTrigonometry) { + return addTrigonometryForced(result.toString()); + } + + return result.toString(); + } + + private boolean isNumber(String str) { + try { + Integer.parseInt(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } + + private String applyTrigOperator(String number) { + String operator = TRIG_OPERATORS[RANDOM.nextInt(TRIG_OPERATORS.length)]; + int num = Integer.parseInt(number); + int angle = generateValidAngle(operator); + return operator + angle + "°"; + } + + private String applyAlgebraOperator(String number) { + String operator = POW_OPERATORS[RANDOM.nextInt(POW_OPERATORS.length)]; + int num = Integer.parseInt(number); + return operator.equals("√") ? "√" + num : num + "^2"; + } + + private int generateValidAngle(String trigOp) { + int angle = RANDOM.nextInt(100) + 1; + if (trigOp.equals("tan")) { + while (angle == 90) { + angle = RANDOM.nextInt(100) + 1; + } + } + return angle; + } + + private String addTrigonometryForced(String expression) { + String[] parts = expression.split(" "); + + for (int i = 0; i < parts.length; i++) { + if (isNumber(parts[i])) { + parts[i] = applyTrigOperator(parts[i]); + break; + } + } + + return String.join(" ", parts); + } } \ No newline at end of file From adeff0901c0d6003d59364a0a4242d5c893e5b9e Mon Sep 17 00:00:00 2001 From: hnu202326010305 <1405671544@qq.com> Date: Sat, 27 Sep 2025 03:10:50 +0800 Subject: [PATCH 4/6] Update Main.java --- src/Main.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/Main.java b/src/Main.java index 374dc2d..2cc2368 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,9 +1,11 @@ -public class Main { - public static void main(String[] args) { - ExamSystem system = new ExamSystem(); - while (true) { - Users users = system.login(); - system.generateProblems(users); - } - } +public class Main { + public static void main(String[] args) { + ExamSystem system = new ExamSystem(); + while (true) { + Users users = system.login(); + System.out.print("准备生成" + users.getType() + + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):"); + system.generateProblems(users); + } + } } \ No newline at end of file From 10cb5d4340fa532d07ab5532a4a3c476b1b1be19 Mon Sep 17 00:00:00 2001 From: hnu202326010305 <1405671544@qq.com> Date: Sat, 27 Sep 2025 03:11:21 +0800 Subject: [PATCH 5/6] Update Generator.java --- src/Generator.java | 66 ++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/src/Generator.java b/src/Generator.java index 200797f..e6bb1ef 100644 --- a/src/Generator.java +++ b/src/Generator.java @@ -1,34 +1,32 @@ -import java.io.FileWriter; -import java.io.IOException; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -public class Generator { - public static void generate(Users users, int count, ProblemsGenerator problemsGenerator) { - StringBuilder builder = new StringBuilder(); - for (int i = 1; i <= count; i++) { - builder.append(i).append(". ").append(problemsGenerator.generate()).append("\n\n"); - } - save(users, builder.toString()); - System.out.println("题目生成完成。"); - } - - private static void save(Users users, String content) { - try { - String folder = "doc/" + users.getType(); - java.io.File dir = new java.io.File(folder); - if (!dir.exists()) { - dir.mkdirs(); - } - String filename = LocalDateTime.now() - .format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")) + ".txt"; - FileWriter writer = new FileWriter(folder + "/" + filename); - writer.write(content); - writer.close(); - } catch (IOException e) { - System.out.println("保存失败:" + e.getMessage()); - } - } -} - - +import java.io.FileWriter; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class Generator { + public static void generate(Users users, int count, ProblemsGenerator problemsGenerator) { + StringBuilder builder = new StringBuilder(); + for (int i = 1; i <= count; i++) { + builder.append(i).append(". ").append(problemsGenerator.generate()).append("\n\n"); + } + save(users, builder.toString()); + System.out.println("题目生成完成。"); + } + + private static void save(Users users, String content) { + try { + String folder = "doc/" + users.getName(); + java.io.File dir = new java.io.File(folder); + if (!dir.exists()) { + dir.mkdirs(); + } + String filename = LocalDateTime.now() + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss")) + ".txt"; + FileWriter writer = new FileWriter(folder + "/" + filename); + writer.write(content); + writer.close(); + } catch (IOException e) { + System.out.println("保存失败:" + e.getMessage()); + } + } +} From bfb9eecf0fce2cd57abde1e1823d7131f4df2ca9 Mon Sep 17 00:00:00 2001 From: hnu202326010305 <1405671544@qq.com> Date: Sat, 27 Sep 2025 03:11:56 +0800 Subject: [PATCH 6/6] Update ExamSystem.java --- src/ExamSystem.java | 122 +++++++++++++++++++++++--------------------- 1 file changed, 63 insertions(+), 59 deletions(-) diff --git a/src/ExamSystem.java b/src/ExamSystem.java index 319b429..f307a25 100644 --- a/src/ExamSystem.java +++ b/src/ExamSystem.java @@ -1,59 +1,63 @@ -import java.util.Scanner; - -public class ExamSystem { - private final Scanner scanner = new Scanner(System.in); - public Users login() { - Users users = null; - while (users == null) { - System.out.print("请输入用户名和密码: "); - String input = scanner.nextLine(); - String[] parts = input.split(" "); - if (parts.length == 2) { - users = Users.login(parts[0], parts[1]); - } - if (users == null) { - System.out.println("请输入正确的用户名、密码"); - } - } - System.out.println("当前选择为" + users.getType() + "出题"); - return users; - } - - public void generateProblems(Users users) { - while (true) { - - System.out.print("准备生成" + users.getType() - + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):"); - String input = scanner.nextLine().trim(); - - if (input.equals("-1")) { - break; - } - - ProblemsGenerator generator = switch (users.getType()) { - case "小学" -> new PrimaryProblem(); - case "初中" -> new JuniorProblem(); - case "高中" -> new SeniorProblem(); - default -> null; - }; - - if (input.startsWith("切换为")) { - String target = input.replace("切换为", ""); - if (target.equals("小学") || target.equals("初中") || target.equals("高中")) { - users = new Users(users.getName(), users.getPassword(), target); - System.out.println("系统提示:准备生成" + users.getType() + "数学题目"); - } else { - System.out.println("请输入小学、初中和高中三个选项中的一个"); - } - continue; - } - - int num = Integer.parseInt(input); - if (num >= 10 && num <= 30 && generator != null) { - Generator.generate(users, num, generator); - } else { - System.out.println("请输入 10-30 之间的数字"); - } - } - } -} +import java.util.Scanner; + +public class ExamSystem { + private final Scanner scanner = new Scanner(System.in); + public Users login() { + Users users = null; + while (users == null) { + System.out.print("请输入用户名和密码: "); + String input = scanner.nextLine(); + String[] parts = input.split(" "); + if (parts.length == 2) { + users = Users.login(parts[0], parts[1]); + } + if (users == null) { + System.out.println("请输入正确的用户名、密码"); + } + } + System.out.println("当前选择为" + users.getType() + "出题"); + return users; + } + + public void generateProblems(Users users) { + while (true) { + String input = scanner.nextLine().trim(); + if (input.equals("-1")) { + break; + } + + ProblemsGenerator generator = switch (users.getType()) { + case "小学" -> new PrimaryProblem(); + case "初中" -> new JuniorProblem(); + case "高中" -> new SeniorProblem(); + default -> null; + }; + + if (input.startsWith("切换为")) { + String target = input.replace("切换为", ""); + if (target.equals("小学") || target.equals("初中") || target.equals("高中")) { + users = new Users(users.getName(), users.getPassword(), target); + System.out.print("系统提示:准备生成" + users.getType() + + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):"); + } else { + System.out.println("请输入小学、初中和高中三个选项中的一个"); + } + continue; + } + + try { + int num = Integer.parseInt(input); + if (num >= 10 && num <= 30 && generator != null) { + Generator.generate(users, num, generator); + } else { + System.out.println("请输入 10-30 之间的数字"); + } + } catch (NumberFormatException e) { + System.out.println("请输入小学、初中和高中三个选项中的一个"); + } + + System.out.print("准备生成" + users.getType() + + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):"); + } + } +}