From 0494840496cb317ef1758497a62fbec0bd6d21ff Mon Sep 17 00:00:00 2001 From: bx <2936213174@qq.com> Date: Wed, 24 Sep 2025 20:59:34 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 29 ++++ .idea/.gitignore | 8 ++ .idea/misc.xml | 6 + .idea/modules.xml | 8 ++ .idea/uiDesigner.xml | 124 ++++++++++++++++++ .idea/vcs.xml | 6 + PaperGenerator.iml | 11 ++ .../bx/generator_main/MathExamGenerator.java | 104 +++++++++++++++ src/com/bx/manager/ExamManager.java | 73 +++++++++++ src/com/bx/manager/UserManager.java | 71 ++++++++++ src/com/bx/question/QuestionFactory.java | 34 +++++ .../generator/HighQuestionGenerator.java | 83 ++++++++++++ .../generator/MiddleQuestionGenerator.java | 84 ++++++++++++ .../generator/PrimaryQuestionGenerator.java | 63 +++++++++ .../question/generator/QuestionGenerator.java | 5 + 15 files changed, 709 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 PaperGenerator.iml create mode 100644 src/com/bx/generator_main/MathExamGenerator.java create mode 100644 src/com/bx/manager/ExamManager.java create mode 100644 src/com/bx/manager/UserManager.java create mode 100644 src/com/bx/question/QuestionFactory.java create mode 100644 src/com/bx/question/generator/HighQuestionGenerator.java create mode 100644 src/com/bx/question/generator/MiddleQuestionGenerator.java create mode 100644 src/com/bx/question/generator/PrimaryQuestionGenerator.java create mode 100644 src/com/bx/question/generator/QuestionGenerator.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..779255b --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..dca0e52 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/PaperGenerator.iml b/PaperGenerator.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/PaperGenerator.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/com/bx/generator_main/MathExamGenerator.java b/src/com/bx/generator_main/MathExamGenerator.java new file mode 100644 index 0000000..dde5438 --- /dev/null +++ b/src/com/bx/generator_main/MathExamGenerator.java @@ -0,0 +1,104 @@ +package com.bx.generator_main; + +import com.bx.manager.ExamManager; +import com.bx.manager.UserManager; + +import java.util.Scanner; + + +// 数学试卷生成器主程序 +public class MathExamGenerator { + protected static UserManager userManager = new UserManager(); + protected static Scanner scanner = new Scanner(System.in); + + public static void main(String[] args) { + System.out.println("=== 中小学数学卷子自动生成程序 ==="); + + // 登录验证 + while (!performLogin()) { + // 继续尝试登录 + } + + // 登录成功后进入主菜单循环 + runMainMenu(); + } + + //执行用户登录 + public static boolean performLogin() { + System.out.print("请输入用户名和密码(空格分隔):"); + String input = scanner.nextLine().trim(); + String[] parts = input.split("\\s+"); + + if (parts.length == 2) { + String username = parts[0]; + String password = parts[1]; + + + + //和存储在map容器中的账号密码比对验证 + if (userManager.login(username, password)) { + System.out.println("当前选择为 " + userManager.getCurrentLevel()); + return true; + } + } + + System.out.println("请输入正确的用户名、密码,重新输入用户名、密码:"); + return false; + } + + //主菜单 + private static void runMainMenu() { + while (true) { + System.out.print("准备生成 " + userManager.getCurrentLevel() + " 数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录)(若要切换则输入切换为 xx):"); + String input = scanner.nextLine().trim(); + + if ("-1".equals(input)) { + userManager.logout(); + main(new String[0]); + return; + } + + // 检查切换命令 + if (handleSwitchCommand(input)) { + continue; + } + + // 处理题目数量输入 + handleQuestionCountInput(input); + } + } + + + //切换命令 + private static boolean handleSwitchCommand(String input) { + if (input.startsWith("切换为")) { + String newLevel = input.substring(3).trim(); + if ("小学".equals(newLevel) || "初中".equals(newLevel) || "高中".equals(newLevel)) { + userManager.setCurrentLevel(newLevel); + System.out.println("系统提示:准备生成 " + userManager.getCurrentLevel() + " 数学题目,请输入生成题目数量"); + return true; + } else { + System.out.println("请输入小学、初中和高中三个选项中的一个"); + return true; + } + } + return false; + } + + + //处理题目数量输入 + private static void handleQuestionCountInput(String input) { + try { + int count = Integer.parseInt(input); + if (count >= 10 && count <= 30) { + ExamManager.generateExam(count, userManager.getCurrentLevel(), userManager.getCurrentUser()); + } else { + System.out.println("题目数量必须在10-30之间"); + } + } catch (NumberFormatException e) { + System.out.println("请输入有效的数字"); + } + } +} + + diff --git a/src/com/bx/manager/ExamManager.java b/src/com/bx/manager/ExamManager.java new file mode 100644 index 0000000..6a97385 --- /dev/null +++ b/src/com/bx/manager/ExamManager.java @@ -0,0 +1,73 @@ +package com.bx.manager; + +import com.bx.question.QuestionFactory; +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.*; + + //考试管理类 - 负责生成试卷和文件保存 +public class ExamManager { + private static final Set generatedQuestions = new HashSet<>(); + + + //生成试卷 count为数量、level为难度 + public static void generateExam(int count, String level) { + generateExam(count, level, ""); + } + + //生成试卷 count为数量、level为难度、username为用户名 + public static void generateExam(int count, String level, String username) { + List questions = new ArrayList<>(); + Set currentExamQuestions = new HashSet<>(); + + for (int i = 1; i <= count; i++) { + String question = QuestionFactory.generateQuestion(level); + + // 确保题目不重复 + while (currentExamQuestions.contains(question) || generatedQuestions.contains(question)) { + question = QuestionFactory.generateQuestion(level); + } + + currentExamQuestions.add(question); + generatedQuestions.add(question); + questions.add(i + ". " + question); + } + + saveToFile(questions, username); + } + + //将题目保存到文件 + private static void saveToFile(List questions) { + saveToFile(questions, ""); + } + + //将题目保存到用户专属文件夹 + private static void saveToFile(List questions, String username) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); + String fileName = sdf.format(new Date()) + ".txt"; + + // 构建文件路径 + String filePath; + if (username != null && !username.trim().isEmpty()) { + // 使用相对路径,创建用户专属文件夹 + File userDir = new File("user_papers/" + username); + if (!userDir.exists()) { + userDir.mkdirs(); // 如果文件夹不存在则创建 + } + filePath = "user_papers/" + username + "/" + fileName; + } else { + // 如果没有用户名,保存在当前目录 + filePath = fileName; + } + + try (PrintWriter writer = new PrintWriter(new FileWriter(filePath), true)) { + for (String question : questions) { + writer.println(question); + writer.println(); // 空一行 + } + System.out.println("题目已生成并保存到文件:" + filePath); + } catch (IOException e) { + System.err.println("保存文件时出错:" + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/com/bx/manager/UserManager.java b/src/com/bx/manager/UserManager.java new file mode 100644 index 0000000..6f780bc --- /dev/null +++ b/src/com/bx/manager/UserManager.java @@ -0,0 +1,71 @@ +package com.bx.manager; + +import java.util.*; + + + // 用户管理类 - 存储好了用户的账号密码,在登录时调用login和getUserLevel方法验证登录是否成功以及查看等级 +public class UserManager { + private static final Map USERS = new HashMap<>(); + private String currentUser = ""; + private String currentLevel = ""; + + // 初始化用户数据 + static { + USERS.put("张三1", "123"); + USERS.put("张三2", "123"); + USERS.put("张三3", "123"); + USERS.put("李四1", "123"); + USERS.put("李四2", "123"); + USERS.put("李四3", "123"); + USERS.put("王五1", "123"); + USERS.put("王五2", "123"); + USERS.put("王五3", "123"); + } + + + // 用户登录验证 + public boolean login(String username, String password) { + if (USERS.containsKey(username) && USERS.get(username).equals(password)) { + currentUser = username; + currentLevel = getUserLevel(username); + return true; + } + return false; + } + + + + //根据用户名获取对应的教育级别 + private String getUserLevel(String username) { + switch (username) { + case "张三1": return "小学"; + case "张三2": return "小学"; + case "张三3": return "小学"; + case "李四1": return "初中"; + case "李四2": return "初中"; + case "李四3": return "初中"; + case "王五1": return "高中"; + case "王五2": return "高中"; + case "王五3": return "高中"; + default: return "小学"; + } + } + + public String getCurrentUser() { + return currentUser; + } + + public String getCurrentLevel() { + return currentLevel; + } + + public void setCurrentLevel(String level) { + this.currentLevel = level; + } + + //登出 + public void logout() + { currentUser = ""; + currentLevel = ""; + } +} \ No newline at end of file diff --git a/src/com/bx/question/QuestionFactory.java b/src/com/bx/question/QuestionFactory.java new file mode 100644 index 0000000..88f912a --- /dev/null +++ b/src/com/bx/question/QuestionFactory.java @@ -0,0 +1,34 @@ +package com.bx.question; + +import com.bx.question.generator.HighQuestionGenerator; +import com.bx.question.generator.MiddleQuestionGenerator; +import com.bx.question.generator.PrimaryQuestionGenerator; +import com.bx.question.generator.QuestionGenerator; + + +//题目工厂类 - 根据难度级别生成对应的题目 + +public class QuestionFactory { + + + //根据难度级别获取对应的题目生成器 + private static QuestionGenerator getGenerator(String level) { + switch (level) { + case "小学": + return new PrimaryQuestionGenerator(); + case "初中": + return new MiddleQuestionGenerator(); + case "高中": + return new HighQuestionGenerator(); + default: + return new PrimaryQuestionGenerator(); + } + } + + + //根据难度级别生成题目 + public static String generateQuestion(String level) { + QuestionGenerator generator = getGenerator(level); + return generator.generateQuestion(); + } +} diff --git a/src/com/bx/question/generator/HighQuestionGenerator.java b/src/com/bx/question/generator/HighQuestionGenerator.java new file mode 100644 index 0000000..08995ec --- /dev/null +++ b/src/com/bx/question/generator/HighQuestionGenerator.java @@ -0,0 +1,83 @@ +package com.bx.question.generator; +import java.util.Random; + + + // 高中题目生成器 - 生成高等数学题目 + +public class HighQuestionGenerator implements QuestionGenerator{ + private static final Random random = new Random(); + + @Override + public String generateQuestion() { + int type = random.nextInt(8); + switch (type) { + case 0: return generateQuadraticEquation(); + case 1: return generateFunctionQuestion(); + case 2: return generateTrigonometryQuestion(); + case 3: return generateSolidGeometryQuestion(); + case 4: return generateProbabilityQuestion(); + case 5: return generateSequenceQuestion(); + case 6: return generateDerivativeQuestion(); + case 7: return generateComplexNumberQuestion(); + default: return generateQuadraticEquation(); + } + } + + private static String generateQuadraticEquation() { + int a = random.nextInt(5) + 1, b = random.nextInt(10) - 5, c = random.nextInt(10) - 5; + String bStr = b >= 0 ? "+" + b : String.valueOf(b); + String cStr = c >= 0 ? "+" + c : String.valueOf(c); + return "解方程:" + a + "x² " + bStr + "x " + cStr + " = 0"; + } + + private static String generateFunctionQuestion() { + int a = random.nextInt(9) + 1, b = random.nextInt(10) - 5, x = random.nextInt(10) + 1; + String bStr = b >= 0 ? "+" + b : String.valueOf(b); + return "已知f(x) = " + a + "x " + bStr + ",求f(" + x + ")"; + } + + private static String generateTrigonometryQuestion() { + String[] functions = {"sin", "cos", "tan"}; + String func = functions[random.nextInt(functions.length)]; + int angle = random.nextInt(4) * 30; // 0, 30, 60, 90度 + return "计算:" + func + "(" + angle + "°)"; + } + + private static String generateSolidGeometryQuestion() { + String[] solids = {"正方体", "长方体", "圆柱体", "球体"}; + String solid = solids[random.nextInt(solids.length)]; + int size = random.nextInt(20) + 1; + switch (solid) { + case "正方体": return "正方体棱长为" + size + "cm,求体积"; + case "长方体": + int width = random.nextInt(15) + 1, height = random.nextInt(10) + 1; + return "长方体长" + size + "cm,宽" + width + "cm,高" + height + "cm,求体积"; + case "圆柱体": + int height2 = random.nextInt(20) + 1; + return "圆柱体底面半径" + size + "cm,高" + height2 + "cm,求体积"; + default: return "球的半径为" + size + "cm,求体积"; + } + } + + private static String generateProbabilityQuestion() { + int total = random.nextInt(20) + 10, favorable = random.nextInt(total / 2) + 1; + return "从" + total + "个球中任取1个,其中有" + favorable + "个红球,求取到红球的概率"; + } + + private static String generateSequenceQuestion() { + int first = random.nextInt(10) + 1, diff = random.nextInt(5) + 1, n = random.nextInt(10) + 5; + return "等差数列首项a₁=" + first + ",公差d=" + diff + ",求第" + n + "项"; + } + + private static String generateDerivativeQuestion() { + int a = random.nextInt(9) + 1, n = random.nextInt(4) + 2; + return "求函数f(x) = " + a + "x^" + n + "的导数"; + } + + private static String generateComplexNumberQuestion() { + int a = random.nextInt(9) + 1, b = random.nextInt(9) + 1; + int c = random.nextInt(9) + 1, d = random.nextInt(9) + 1; + return "计算:(" + a + "+" + b + "i) + (" + c + "+" + d + "i)"; + } +} + diff --git a/src/com/bx/question/generator/MiddleQuestionGenerator.java b/src/com/bx/question/generator/MiddleQuestionGenerator.java new file mode 100644 index 0000000..a564ff4 --- /dev/null +++ b/src/com/bx/question/generator/MiddleQuestionGenerator.java @@ -0,0 +1,84 @@ +package com.bx.question.generator; +import java.util.Random; + + + //初中题目生成器 - 生成分数、代数、几何等题目 + +public class MiddleQuestionGenerator implements QuestionGenerator { + private static final Random random = new Random(); + + @Override + public String generateQuestion() { + int type = random.nextInt(6); + int operandCount = random.nextInt(4) + 2; // 2-5个操作数 + + switch (type) { + case 0: return generateMixedArithmetic(operandCount); + case 1: return generateFractionQuestion(); + case 2: return generateAlgebraicExpression(); + case 3: return generateLinearEquation(); + case 4: return generateGeometryQuestion(); + case 5: return generatePercentageQuestion(); + default: return generateMixedArithmetic(operandCount); + } + } + + private static String generateMixedArithmetic(int count) { + StringBuilder question = new StringBuilder(); + String[] operators = {"+", "-", "×", "÷"}; + int num = random.nextInt(50) + 1; + question.append(num); + + for (int i = 1; i < count; i++) { + String op = operators[random.nextInt(operators.length)]; + int nextNum = random.nextInt(20) + 1; + question.append(" ").append(op).append(" ").append(nextNum); + } + question.append(" = ?"); + return question.toString(); + } + + private static String generateFractionQuestion() { + int num1 = random.nextInt(9) + 1, den1 = random.nextInt(9) + 2; + int num2 = random.nextInt(9) + 1, den2 = random.nextInt(9) + 2; + String[] ops = {"+", "-", "×", "÷"}; + String op = ops[random.nextInt(ops.length)]; + return num1 + "/" + den1 + " " + op + " " + num2 + "/" + den2 + " = ?"; + } + + private static String generateAlgebraicExpression() { + int a = random.nextInt(9) + 1, b = random.nextInt(20) + 1; + String[] vars = {"x", "y", "a", "b"}; + String var = vars[random.nextInt(vars.length)]; + String op = random.nextBoolean() ? "+" : "-"; + return "化简:" + a + var + " " + op + " " + b; + } + + private static String generateLinearEquation() { + int a = random.nextInt(9) + 1, b = random.nextInt(20) + 1, c = random.nextInt(30) + 1; + return "解方程:" + a + "x + " + b + " = " + c; + } + + private static String generateGeometryQuestion() { + String[] shapes = {"正方形", "长方形", "圆形", "三角形"}; + String shape = shapes[random.nextInt(shapes.length)]; + int size = random.nextInt(20) + 1; + + switch (shape) { + case "正方形": return "正方形边长为" + size + "cm,求面积"; + case "长方形": + int width = random.nextInt(15) + 1; + return "长方形长" + size + "cm,宽" + width + "cm,求面积"; + case "圆形": return "圆的半径为" + size + "cm,求面积(π取3.14)"; + default: + int height = random.nextInt(15) + 1; + return "三角形底边" + size + "cm,高" + height + "cm,求面积"; + } + } + + private static String generatePercentageQuestion() { + int total = (random.nextInt(10) + 1) * 100; + int percent = (random.nextInt(9) + 1) * 10; + return total + "的" + percent + "%是多少?"; + } +} \ No newline at end of file diff --git a/src/com/bx/question/generator/PrimaryQuestionGenerator.java b/src/com/bx/question/generator/PrimaryQuestionGenerator.java new file mode 100644 index 0000000..603fa6a --- /dev/null +++ b/src/com/bx/question/generator/PrimaryQuestionGenerator.java @@ -0,0 +1,63 @@ +package com.bx.question.generator; + +import java.util.Random; + + + //小学题目生成器(基础四则运算) +public class PrimaryQuestionGenerator implements QuestionGenerator { + private static final Random random = new Random(); + + @Override + public String generateQuestion() { + int type = random.nextInt(4); + int operandCount = random.nextInt(5) + 1; // 1-5个操作数 + + switch (type) { + case 0: return generateArithmeticQuestion("+", operandCount, 1, 100); + case 1: return generateSubtractionQuestion(operandCount); + case 2: return generateArithmeticQuestion("×", operandCount, 1, 20); + case 3: return generateDivisionQuestion(); + default: return generateArithmeticQuestion("+", operandCount, 1, 100); + } + } + + private static String generateArithmeticQuestion(String operator, int count, int min, int max) { + StringBuilder question = new StringBuilder(); + int num = random.nextInt(max - min + 1) + min; + question.append(num); + + for (int i = 1; i < count; i++) { + int nextNum = random.nextInt(max - min + 1) + min; + question.append(" ").append(operator).append(" ").append(nextNum); + } + question.append(" = ?"); + return question.toString(); + } + + private static String generateSubtractionQuestion(int count) { + StringBuilder question = new StringBuilder(); + int result = random.nextInt(80) + 20; // 确保初始结果足够大 (20-99) + question.append(result); + + for (int i = 1; i < count; i++) { + // 确保减数不会让结果变成负数,同时保证传入nextInt的参数为正数 + int maxSubtract = Math.min(result - 1, 20); // 最多减20,且保证结果至少为1 + if (maxSubtract <= 0) { + break; // 如果不能再减了,就停止 + } + int num = random.nextInt(maxSubtract) + 1; // 保证至少减1 + question.append(" - ").append(num); + result -= num; + } + + question.append(" = ?"); + return question.toString(); + } + + private static String generateDivisionQuestion() { + int divisor = random.nextInt(9) + 2; // 除数2-10 + int quotient = random.nextInt(20) + 1; // 商1-20 + int dividend = divisor * quotient; // 被除数 + return dividend + " ÷ " + divisor + " = ?"; + } +} \ No newline at end of file diff --git a/src/com/bx/question/generator/QuestionGenerator.java b/src/com/bx/question/generator/QuestionGenerator.java new file mode 100644 index 0000000..e985611 --- /dev/null +++ b/src/com/bx/question/generator/QuestionGenerator.java @@ -0,0 +1,5 @@ +package com.bx.question.generator; + +public interface QuestionGenerator { + String generateQuestion(); +} -- 2.34.1 From 2b6bd2bb1e3950fcc6234a0e003bcc0f797e4e74 Mon Sep 17 00:00:00 2001 From: bx <2936213174@qq.com> Date: Wed, 24 Sep 2025 21:05:54 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/PrimaryQuestionGenerator.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/com/bx/question/generator/PrimaryQuestionGenerator.java b/src/com/bx/question/generator/PrimaryQuestionGenerator.java index 603fa6a..a5084a2 100644 --- a/src/com/bx/question/generator/PrimaryQuestionGenerator.java +++ b/src/com/bx/question/generator/PrimaryQuestionGenerator.java @@ -16,7 +16,7 @@ public class PrimaryQuestionGenerator implements QuestionGenerator { case 0: return generateArithmeticQuestion("+", operandCount, 1, 100); case 1: return generateSubtractionQuestion(operandCount); case 2: return generateArithmeticQuestion("×", operandCount, 1, 20); - case 3: return generateDivisionQuestion(); + //case 3: return generateDivisionQuestion(); default: return generateArithmeticQuestion("+", operandCount, 1, 100); } } @@ -54,10 +54,10 @@ public class PrimaryQuestionGenerator implements QuestionGenerator { return question.toString(); } - private static String generateDivisionQuestion() { - int divisor = random.nextInt(9) + 2; // 除数2-10 - int quotient = random.nextInt(20) + 1; // 商1-20 - int dividend = divisor * quotient; // 被除数 - return dividend + " ÷ " + divisor + " = ?"; - } +// private static String generateDivisionQuestion() { +// int divisor = random.nextInt(9) + 2; // 除数2-10 +// int quotient = random.nextInt(20) + 1; // 商1-20 +// int dividend = divisor * quotient; // 被除数 +// return dividend + " ÷ " + divisor + " = ?"; +// } } \ No newline at end of file -- 2.34.1 From f5c932914c932bd5066f643201eefab44ad6f3bf Mon Sep 17 00:00:00 2001 From: bx <2936213174@qq.com> Date: Wed, 24 Sep 2025 21:37:04 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../generator/PrimaryQuestionGenerator.java | 116 ++++++++++++------ 1 file changed, 80 insertions(+), 36 deletions(-) diff --git a/src/com/bx/question/generator/PrimaryQuestionGenerator.java b/src/com/bx/question/generator/PrimaryQuestionGenerator.java index a5084a2..5e68d0e 100644 --- a/src/com/bx/question/generator/PrimaryQuestionGenerator.java +++ b/src/com/bx/question/generator/PrimaryQuestionGenerator.java @@ -5,59 +5,103 @@ import java.util.Random; //小学题目生成器(基础四则运算) public class PrimaryQuestionGenerator implements QuestionGenerator { - private static final Random random = new Random(); + private static final Random RANDOM = new Random(); + + // 运算类型常量 + private static final int ADDITION = 0; + private static final int SUBTRACTION = 1; + private static final int MULTIPLICATION = 2; + private static final int DIVISION = 3; + + // 数值范围常量 + private static final int MIN_OPERAND_COUNT = 1; + private static final int MAX_OPERAND_COUNT = 5; + private static final int MIN_NUMBER = 1; + private static final int MAX_ADDITION_NUMBER = 100; + private static final int MAX_MULTIPLICATION_NUMBER = 20; + private static final int MAX_SUBTRACTION_NUMBER = 20; + private static final int MIN_SUBTRACTION_RESULT = 20; + private static final int MAX_SUBTRACTION_RESULT = 99; + private static final int MIN_DIVISOR = 2; + private static final int MAX_DIVISOR = 10; + private static final int MAX_QUOTIENT = 20; @Override - public String generateQuestion() { - int type = random.nextInt(4); - int operandCount = random.nextInt(5) + 1; // 1-5个操作数 - - switch (type) { - case 0: return generateArithmeticQuestion("+", operandCount, 1, 100); - case 1: return generateSubtractionQuestion(operandCount); - case 2: return generateArithmeticQuestion("×", operandCount, 1, 20); - //case 3: return generateDivisionQuestion(); - default: return generateArithmeticQuestion("+", operandCount, 1, 100); - } + public String generateQuestion() { + int type = RANDOM.nextInt(4); + // 确保至少2个操作数 + int operandCount = RANDOM.nextInt(MAX_OPERAND_COUNT - 1) + 2; + + return switch (type) { + case ADDITION -> generateAdditionQuestion(operandCount); + case SUBTRACTION -> generateSubtractionQuestion(operandCount); + case MULTIPLICATION -> generateMultiplicationQuestion(operandCount); + case DIVISION -> generateDivisionQuestion(); + default -> generateAdditionQuestion(operandCount); + }; + } + + + //生成加法题目 + private String generateAdditionQuestion(int operandCount) { + return generateArithmeticQuestion("+", operandCount, MIN_NUMBER, MAX_ADDITION_NUMBER); } - private static String generateArithmeticQuestion(String operator, int count, int min, int max) { - StringBuilder question = new StringBuilder(); - int num = random.nextInt(max - min + 1) + min; - question.append(num); + //生成乘法题目 + private String generateMultiplicationQuestion(int operandCount) { + return generateArithmeticQuestion("*", operandCount, MIN_NUMBER, MAX_MULTIPLICATION_NUMBER); + } + + //生成基础算术题目(加法和乘法共用) + private String generateArithmeticQuestion(String operator, int count, int min, int max) { + if (count <= 0) { + return ""; + } + + StringBuilder question = new StringBuilder(50); // 预分配合理容量 + int range = max - min + 1; + + question.append(RANDOM.nextInt(range) + min); for (int i = 1; i < count; i++) { - int nextNum = random.nextInt(max - min + 1) + min; - question.append(" ").append(operator).append(" ").append(nextNum); + question.append(' ').append(operator).append(' ') + .append(RANDOM.nextInt(range) + min); } - question.append(" = ?"); - return question.toString(); + + return question.append(" = ?").toString(); } - private static String generateSubtractionQuestion(int count) { - StringBuilder question = new StringBuilder(); - int result = random.nextInt(80) + 20; // 确保初始结果足够大 (20-99) + + //生成减法题目 + private String generateSubtractionQuestion(int count) { + if (count <= 0) { + return ""; + } + + StringBuilder question = new StringBuilder(50); + int result = RANDOM.nextInt(MAX_SUBTRACTION_RESULT - MIN_SUBTRACTION_RESULT + 1) + MIN_SUBTRACTION_RESULT; question.append(result); - for (int i = 1; i < count; i++) { - // 确保减数不会让结果变成负数,同时保证传入nextInt的参数为正数 - int maxSubtract = Math.min(result - 1, 20); // 最多减20,且保证结果至少为1 + for (int i = 1; i < count && result > MIN_NUMBER; i++) { + int maxSubtract = Math.min(result - MIN_NUMBER, MAX_SUBTRACTION_NUMBER); if (maxSubtract <= 0) { - break; // 如果不能再减了,就停止 + break; } - int num = random.nextInt(maxSubtract) + 1; // 保证至少减1 + + int num = RANDOM.nextInt(maxSubtract) + MIN_NUMBER; question.append(" - ").append(num); result -= num; } - question.append(" = ?"); - return question.toString(); + return question.append(" = ?").toString(); } -// private static String generateDivisionQuestion() { -// int divisor = random.nextInt(9) + 2; // 除数2-10 -// int quotient = random.nextInt(20) + 1; // 商1-20 -// int dividend = divisor * quotient; // 被除数 -// return dividend + " ÷ " + divisor + " = ?"; -// } + //生成除法题目 + private String generateDivisionQuestion() { + int divisor = RANDOM.nextInt(MAX_DIVISOR - MIN_DIVISOR + 1) + MIN_DIVISOR; + int quotient = RANDOM.nextInt(MAX_QUOTIENT) + MIN_NUMBER; + int dividend = divisor * quotient; + + return dividend + " / " + divisor + " = ?"; + } } \ No newline at end of file -- 2.34.1 From 8e4dd868044d32b1efb7165fdd2b40f7f0475974 Mon Sep 17 00:00:00 2001 From: bx <2936213174@qq.com> Date: Sat, 27 Sep 2025 20:41:55 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bx/generator_main/MathExamGenerator.java | 4 +- src/com/bx/manager/ExamManager.java | 11 - .../generator/HighQuestionGenerator.java | 48 ++--- .../generator/MiddleQuestionGenerator.java | 118 ++++++---- .../generator/PrimaryQuestionGenerator.java | 202 +++++++++++------- 5 files changed, 223 insertions(+), 160 deletions(-) diff --git a/src/com/bx/generator_main/MathExamGenerator.java b/src/com/bx/generator_main/MathExamGenerator.java index dde5438..8222886 100644 --- a/src/com/bx/generator_main/MathExamGenerator.java +++ b/src/com/bx/generator_main/MathExamGenerator.java @@ -37,7 +37,7 @@ public class MathExamGenerator { //和存储在map容器中的账号密码比对验证 if (userManager.login(username, password)) { - System.out.println("当前选择为 " + userManager.getCurrentLevel()); + System.out.println("当前选择为" + userManager.getCurrentLevel()+"出题"); return true; } } @@ -49,7 +49,7 @@ public class MathExamGenerator { //主菜单 private static void runMainMenu() { while (true) { - System.out.print("准备生成 " + userManager.getCurrentLevel() + " 数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录)(若要切换则输入切换为 xx):"); + System.out.print("准备生成 " + userManager.getCurrentLevel() + " 数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录)(若要切换则输入切换为xx):"); String input = scanner.nextLine().trim(); if ("-1".equals(input)) { diff --git a/src/com/bx/manager/ExamManager.java b/src/com/bx/manager/ExamManager.java index 6a97385..ad0855f 100644 --- a/src/com/bx/manager/ExamManager.java +++ b/src/com/bx/manager/ExamManager.java @@ -9,12 +9,6 @@ import java.util.*; public class ExamManager { private static final Set generatedQuestions = new HashSet<>(); - - //生成试卷 count为数量、level为难度 - public static void generateExam(int count, String level) { - generateExam(count, level, ""); - } - //生成试卷 count为数量、level为难度、username为用户名 public static void generateExam(int count, String level, String username) { List questions = new ArrayList<>(); @@ -36,11 +30,6 @@ public class ExamManager { saveToFile(questions, username); } - //将题目保存到文件 - private static void saveToFile(List questions) { - saveToFile(questions, ""); - } - //将题目保存到用户专属文件夹 private static void saveToFile(List questions, String username) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); diff --git a/src/com/bx/question/generator/HighQuestionGenerator.java b/src/com/bx/question/generator/HighQuestionGenerator.java index 08995ec..8da10b0 100644 --- a/src/com/bx/question/generator/HighQuestionGenerator.java +++ b/src/com/bx/question/generator/HighQuestionGenerator.java @@ -3,26 +3,26 @@ import java.util.Random; // 高中题目生成器 - 生成高等数学题目 - public class HighQuestionGenerator implements QuestionGenerator{ private static final Random random = new Random(); @Override public String generateQuestion() { - int type = random.nextInt(8); - switch (type) { - case 0: return generateQuadraticEquation(); - case 1: return generateFunctionQuestion(); - case 2: return generateTrigonometryQuestion(); - case 3: return generateSolidGeometryQuestion(); - case 4: return generateProbabilityQuestion(); - case 5: return generateSequenceQuestion(); - case 6: return generateDerivativeQuestion(); - case 7: return generateComplexNumberQuestion(); - default: return generateQuadraticEquation(); - } + int type = random.nextInt(12); + return switch (type) { + case 0 -> generateQuadraticEquation(); + case 1 -> generateFunctionQuestion(); + case 2 -> generateTrigonometryQuestion(); + case 3 -> generateProbabilityQuestion(); + case 4 -> generateSequenceQuestion(); + case 5 -> generateDerivativeQuestion(); + case 6 -> generateComplexNumberQuestion(); + default -> generateTrigonometryQuestion(); + }; } + + //解一元二次方程 private static String generateQuadraticEquation() { int a = random.nextInt(5) + 1, b = random.nextInt(10) - 5, c = random.nextInt(10) - 5; String bStr = b >= 0 ? "+" + b : String.valueOf(b); @@ -30,12 +30,14 @@ public class HighQuestionGenerator implements QuestionGenerator{ return "解方程:" + a + "x² " + bStr + "x " + cStr + " = 0"; } + //函数计算 private static String generateFunctionQuestion() { int a = random.nextInt(9) + 1, b = random.nextInt(10) - 5, x = random.nextInt(10) + 1; String bStr = b >= 0 ? "+" + b : String.valueOf(b); return "已知f(x) = " + a + "x " + bStr + ",求f(" + x + ")"; } + //三角函数 private static String generateTrigonometryQuestion() { String[] functions = {"sin", "cos", "tan"}; String func = functions[random.nextInt(functions.length)]; @@ -43,37 +45,25 @@ public class HighQuestionGenerator implements QuestionGenerator{ return "计算:" + func + "(" + angle + "°)"; } - private static String generateSolidGeometryQuestion() { - String[] solids = {"正方体", "长方体", "圆柱体", "球体"}; - String solid = solids[random.nextInt(solids.length)]; - int size = random.nextInt(20) + 1; - switch (solid) { - case "正方体": return "正方体棱长为" + size + "cm,求体积"; - case "长方体": - int width = random.nextInt(15) + 1, height = random.nextInt(10) + 1; - return "长方体长" + size + "cm,宽" + width + "cm,高" + height + "cm,求体积"; - case "圆柱体": - int height2 = random.nextInt(20) + 1; - return "圆柱体底面半径" + size + "cm,高" + height2 + "cm,求体积"; - default: return "球的半径为" + size + "cm,求体积"; - } - } - + //概率问题 private static String generateProbabilityQuestion() { int total = random.nextInt(20) + 10, favorable = random.nextInt(total / 2) + 1; return "从" + total + "个球中任取1个,其中有" + favorable + "个红球,求取到红球的概率"; } + //数列 private static String generateSequenceQuestion() { int first = random.nextInt(10) + 1, diff = random.nextInt(5) + 1, n = random.nextInt(10) + 5; return "等差数列首项a₁=" + first + ",公差d=" + diff + ",求第" + n + "项"; } + //导数 private static String generateDerivativeQuestion() { int a = random.nextInt(9) + 1, n = random.nextInt(4) + 2; return "求函数f(x) = " + a + "x^" + n + "的导数"; } + //复数运算 private static String generateComplexNumberQuestion() { int a = random.nextInt(9) + 1, b = random.nextInt(9) + 1; int c = random.nextInt(9) + 1, d = random.nextInt(9) + 1; diff --git a/src/com/bx/question/generator/MiddleQuestionGenerator.java b/src/com/bx/question/generator/MiddleQuestionGenerator.java index a564ff4..d3f1481 100644 --- a/src/com/bx/question/generator/MiddleQuestionGenerator.java +++ b/src/com/bx/question/generator/MiddleQuestionGenerator.java @@ -1,43 +1,42 @@ package com.bx.question.generator; import java.util.Random; - - //初中题目生成器 - 生成分数、代数、几何等题目 +//初中题目生成器(混合运算、分数运算、方程、开方、开根号) public class MiddleQuestionGenerator implements QuestionGenerator { private static final Random random = new Random(); @Override - public String generateQuestion() { - int type = random.nextInt(6); + public String generateQuestion() { + int type = random.nextInt(7); int operandCount = random.nextInt(4) + 2; // 2-5个操作数 - switch (type) { - case 0: return generateMixedArithmetic(operandCount); - case 1: return generateFractionQuestion(); - case 2: return generateAlgebraicExpression(); - case 3: return generateLinearEquation(); - case 4: return generateGeometryQuestion(); - case 5: return generatePercentageQuestion(); - default: return generateMixedArithmetic(operandCount); - } + return switch (type) { + case 0 -> generateMixedArithmetic(operandCount); + case 1 -> generateFractionQuestion(); + case 2 -> generateEquationQuestion(); + case 3 -> generatePowerAndRootQuestion(); + default -> generatePowerAndRootQuestion(); + }; } + //生成混合运算题目 private static String generateMixedArithmetic(int count) { StringBuilder question = new StringBuilder(); String[] operators = {"+", "-", "×", "÷"}; - int num = random.nextInt(50) + 1; + int num = random.nextInt(100) + 1; question.append(num); for (int i = 1; i < count; i++) { String op = operators[random.nextInt(operators.length)]; - int nextNum = random.nextInt(20) + 1; + int nextNum = random.nextInt(20) + 1; //第二个数1-20 question.append(" ").append(op).append(" ").append(nextNum); } question.append(" = ?"); return question.toString(); } + //生成分数运算题目 private static String generateFractionQuestion() { int num1 = random.nextInt(9) + 1, den1 = random.nextInt(9) + 2; int num2 = random.nextInt(9) + 1, den2 = random.nextInt(9) + 2; @@ -46,39 +45,70 @@ public class MiddleQuestionGenerator implements QuestionGenerator { return num1 + "/" + den1 + " " + op + " " + num2 + "/" + den2 + " = ?"; } - private static String generateAlgebraicExpression() { - int a = random.nextInt(9) + 1, b = random.nextInt(20) + 1; - String[] vars = {"x", "y", "a", "b"}; - String var = vars[random.nextInt(vars.length)]; - String op = random.nextBoolean() ? "+" : "-"; - return "化简:" + a + var + " " + op + " " + b; - } + //方程 + private static String generateEquationQuestion() { + int type = random.nextInt(4); - private static String generateLinearEquation() { - int a = random.nextInt(9) + 1, b = random.nextInt(20) + 1, c = random.nextInt(30) + 1; - return "解方程:" + a + "x + " + b + " = " + c; + switch (type) { + case 0: { + // 一元一次方程:ax + b = c + int a = random.nextInt(9) + 1; + int b = random.nextInt(20) + 1; + int c = random.nextInt(30) + 1; + return "解方程:" + a + "x + " + b + " = " + c; + } + case 1: { + // 含分母的方程:(x + a)/b = c + int a = random.nextInt(10) + 1; + int b = random.nextInt(5) + 2; + int c = random.nextInt(8) + 1; + return "解方程:(x + " + a + ")/" + b + " = " + c; + } + case 2: { + // 两边都含x:ax + b = cx + d + int a = random.nextInt(9) + 2; + int b = random.nextInt(20) + 1; + int c = random.nextInt(5) + 1; + int d = random.nextInt(15) + 1; + return "解方程:" + a + "x + " + b + " = " + c + "x + " + d; + } + default: { + // 含括号的方程:a(x + b) = c + int a = random.nextInt(5) + 2; + int b = random.nextInt(10) + 1; + int c = random.nextInt(30) + 10; + return "解方程:" + a + "(x + " + b + ") = " + c; + } + } } - private static String generateGeometryQuestion() { - String[] shapes = {"正方形", "长方形", "圆形", "三角形"}; - String shape = shapes[random.nextInt(shapes.length)]; - int size = random.nextInt(20) + 1; + //平方、开方、立方、幂运算 + private static String generatePowerAndRootQuestion() { + int type = random.nextInt(4); - switch (shape) { - case "正方形": return "正方形边长为" + size + "cm,求面积"; - case "长方形": - int width = random.nextInt(15) + 1; - return "长方形长" + size + "cm,宽" + width + "cm,求面积"; - case "圆形": return "圆的半径为" + size + "cm,求面积(π取3.14)"; - default: - int height = random.nextInt(15) + 1; - return "三角形底边" + size + "cm,高" + height + "cm,求面积"; + switch (type) { + case 0: { + // 平方运算:a² + int base = random.nextInt(15) + 1; + return "计算:" + base + "² = ?"; + } + case 1: { + // 开平方运算:√a + int[] perfectSquares = {4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225}; + int square = perfectSquares[random.nextInt(perfectSquares.length)]; + return "计算:√" + square + " = ?"; + } + case 2: { + // 立方运算:a³ + int base = random.nextInt(8) + 1; + return "计算:" + base + "³ = ?"; + } + default: { + // 幂运算:a^n + int base = random.nextInt(10) + 2; + int exponent = random.nextInt(3) + 2; // 指数2-4 + return "计算:" + base + "^" + exponent + " = ?"; + } } } - - private static String generatePercentageQuestion() { - int total = (random.nextInt(10) + 1) * 100; - int percent = (random.nextInt(9) + 1) * 10; - return total + "的" + percent + "%是多少?"; - } } \ No newline at end of file diff --git a/src/com/bx/question/generator/PrimaryQuestionGenerator.java b/src/com/bx/question/generator/PrimaryQuestionGenerator.java index 5e68d0e..2cd3aee 100644 --- a/src/com/bx/question/generator/PrimaryQuestionGenerator.java +++ b/src/com/bx/question/generator/PrimaryQuestionGenerator.java @@ -2,106 +2,160 @@ package com.bx.question.generator; import java.util.Random; - - //小学题目生成器(基础四则运算) +//小学题目生成器 public class PrimaryQuestionGenerator implements QuestionGenerator { - private static final Random RANDOM = new Random(); - - // 运算类型常量 - private static final int ADDITION = 0; - private static final int SUBTRACTION = 1; - private static final int MULTIPLICATION = 2; - private static final int DIVISION = 3; + private static final Random random = new Random(); - // 数值范围常量 - private static final int MIN_OPERAND_COUNT = 1; - private static final int MAX_OPERAND_COUNT = 5; + // 操作数范围 private static final int MIN_NUMBER = 1; - private static final int MAX_ADDITION_NUMBER = 100; - private static final int MAX_MULTIPLICATION_NUMBER = 20; - private static final int MAX_SUBTRACTION_NUMBER = 20; - private static final int MIN_SUBTRACTION_RESULT = 20; - private static final int MAX_SUBTRACTION_RESULT = 99; - private static final int MIN_DIVISOR = 2; - private static final int MAX_DIVISOR = 10; - private static final int MAX_QUOTIENT = 20; + private static final int MAX_NUMBER = 100; + + // 运算符数组 + private static final String[] OPERATORS = {"+", "-", "x", "÷"}; @Override public String generateQuestion() { - int type = RANDOM.nextInt(4); - // 确保至少2个操作数 - int operandCount = RANDOM.nextInt(MAX_OPERAND_COUNT - 1) + 2; - - return switch (type) { - case ADDITION -> generateAdditionQuestion(operandCount); - case SUBTRACTION -> generateSubtractionQuestion(operandCount); - case MULTIPLICATION -> generateMultiplicationQuestion(operandCount); - case DIVISION -> generateDivisionQuestion(); - default -> generateAdditionQuestion(operandCount); - }; - } - - - //生成加法题目 - private String generateAdditionQuestion(int operandCount) { - return generateArithmeticQuestion("+", operandCount, MIN_NUMBER, MAX_ADDITION_NUMBER); + // 50%概率生成单一运算符,50%概率生成复合运算符 + if (random.nextBoolean()) { + return generateSingleOperatorQuestion(); + } else { + return generateMixedOperatorQuestion(); + } } - //生成乘法题目 - private String generateMultiplicationQuestion(int operandCount) { - return generateArithmeticQuestion("*", operandCount, MIN_NUMBER, MAX_MULTIPLICATION_NUMBER); + //生成符合范围的操作数 + private int generateRandomNumber() { + return random.nextInt(MAX_NUMBER) + MIN_NUMBER; } - //生成基础算术题目(加法和乘法共用) - private String generateArithmeticQuestion(String operator, int count, int min, int max) { - if (count <= 0) { - return ""; - } + //单一运算符 + private String generateSingleOperatorQuestion() { + String operator = OPERATORS[random.nextInt(4)]; // 随机选择一个运算符 + int operandCount = random.nextInt(4) + 2; // 2-5个操作数 - StringBuilder question = new StringBuilder(50); // 预分配合理容量 - int range = max - min + 1; + StringBuilder question = new StringBuilder(); - question.append(RANDOM.nextInt(range) + min); + // 生成第一个数 + question.append(generateRandomNumber()); - for (int i = 1; i < count; i++) { - question.append(' ').append(operator).append(' ') - .append(RANDOM.nextInt(range) + min); + // 生成后续的数和运算符 + for (int i = 1; i < operandCount; i++) { + question.append(" ").append(operator).append(" ").append(generateRandomNumber()); } return question.append(" = ?").toString(); } + //复合运算符 + private String generateMixedOperatorQuestion() { + int choice = random.nextInt(3); + if (choice == 0) { + return generateMixedWithoutBrackets(); + } else if (choice == 1) { + return generateMixedWithBrackets3(); + } else + return generateMixedWithBrackets4(); + } - //生成减法题目 - private String generateSubtractionQuestion(int count) { - if (count <= 0) { - return ""; - } - - StringBuilder question = new StringBuilder(50); - int result = RANDOM.nextInt(MAX_SUBTRACTION_RESULT - MIN_SUBTRACTION_RESULT + 1) + MIN_SUBTRACTION_RESULT; - question.append(result); + //生成无括号的混合运算 + private String generateMixedWithoutBrackets() { + StringBuilder question = new StringBuilder(); + int count = random.nextInt(4) + 2; + String[] operators = {"+", "-", "×", "÷"}; + int num = random.nextInt(100) + 1; + question.append(num); - for (int i = 1; i < count && result > MIN_NUMBER; i++) { - int maxSubtract = Math.min(result - MIN_NUMBER, MAX_SUBTRACTION_NUMBER); - if (maxSubtract <= 0) { - break; - } + for (int i = 1; i < count; i++) { + String op = operators[random.nextInt(operators.length)]; + int nextNum = random.nextInt(20) + 1; //下一个数1-20 + question.append(" ").append(op).append(" ").append(nextNum); + } + question.append(" = ?"); + return question.toString(); + + } - int num = RANDOM.nextInt(maxSubtract) + MIN_NUMBER; - question.append(" - ").append(num); - result -= num; + //生成带括号的混合运算(三个操作数) + private String generateMixedWithBrackets3() { + StringBuilder question = new StringBuilder(); + + // 括号内的运算 + int innerNum1 = generateRandomNumber(); + int innerNum2 = generateRandomNumber(); + String innerOp = OPERATORS[random.nextInt(4)]; + + // 括号外的数字和运算符 + int outerNum = generateRandomNumber(); + String outerOp = OPERATORS[random.nextInt(4)]; + + // 随机决定括号在前还是在后 + if (random.nextBoolean()) { + // 括号在前:(a op b) op c + question.append("(").append(innerNum1).append(" ").append(innerOp) + .append(" ").append(innerNum2).append(") ").append(outerOp) + .append(" ").append(outerNum); + } else { + // 括号在后:a op (b op c) + question.append(outerNum).append(" ").append(outerOp).append(" (") + .append(innerNum1).append(" ").append(innerOp).append(" ") + .append(innerNum2).append(")"); } return question.append(" = ?").toString(); } - //生成除法题目 - private String generateDivisionQuestion() { - int divisor = RANDOM.nextInt(MAX_DIVISOR - MIN_DIVISOR + 1) + MIN_DIVISOR; - int quotient = RANDOM.nextInt(MAX_QUOTIENT) + MIN_NUMBER; - int dividend = divisor * quotient; + //生成带括号的混合运算(四个操作数) + private String generateMixedWithBrackets4() { + StringBuilder question = new StringBuilder(); + + int choice = random.nextInt(3); + + if (choice == 0) { + // 格式1: (a op b) op (c op d) + int num1 = generateRandomNumber(); + int num2 = generateRandomNumber(); + int num3 = generateRandomNumber(); + int num4 = generateRandomNumber(); + + String op1 = OPERATORS[random.nextInt(4)]; + String op2 = OPERATORS[random.nextInt(4)]; + String op3 = OPERATORS[random.nextInt(4)]; + + question.append("(").append(num1).append(" ").append(op1).append(" ") + .append(num2).append(") ").append(op2).append(" (") + .append(num3).append(" ").append(op3).append(" ").append(num4).append(")"); + + } else if (choice == 1) { + // 格式2: (a op b op c) op d + int num1 = generateRandomNumber(); + int num2 = generateRandomNumber(); + int num3 = generateRandomNumber(); + int num4 = generateRandomNumber(); + + String op1 = OPERATORS[random.nextInt(4)]; + String op2 = OPERATORS[random.nextInt(4)]; + String op3 = OPERATORS[random.nextInt(4)]; + + question.append("(").append(num1).append(" ").append(op1).append(" ") + .append(num2).append(" ").append(op2).append(" ").append(num3) + .append(") ").append(op3).append(" ").append(num4); + + } else { + // 格式3: a op (b op c op d) + int num1 = generateRandomNumber(); + int num2 = generateRandomNumber(); + int num3 = generateRandomNumber(); + int num4 = generateRandomNumber(); + + String op1 = OPERATORS[random.nextInt(4)]; + String op2 = OPERATORS[random.nextInt(4)]; + String op3 = OPERATORS[random.nextInt(4)]; + + question.append(num1).append(" ").append(op1).append(" (") + .append(num2).append(" ").append(op2).append(" ").append(num3) + .append(" ").append(op3).append(" ").append(num4).append(")"); + } - return dividend + " / " + divisor + " = ?"; + return question.append(" = ?").toString(); } } \ No newline at end of file -- 2.34.1 From 668988c38d157f134af6e6344627b86f4463686e Mon Sep 17 00:00:00 2001 From: bx <2936213174@qq.com> Date: Sat, 27 Sep 2025 21:26:35 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 168 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 167 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fb79287..ed4e8e7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,168 @@ -# paper_generator +# 中小学数学试卷生成系统 + +一个基于Java的命令行应用程序,能够根据不同年级自动生成相应难度的数学试卷。 + +## 项目简介 + +这是一个专为中小学教师、学生和家长设计的数学试卷自动生成工具。系统支持小学、初中、高中三个教育阶段,能够生成符合各阶段教学要求的数学题目,并自动保存为试卷文件。 + +## 功能特性 + +### 🎯 用户管理 +- 支持9个预置用户账号(张三1-3、李四1-3、王五1-3) +- 自动识别用户对应的教育级别(小学/初中/高中) +- 安全的用户名密码验证机制 + +### 📚 题目生成 +- **小学阶段**:四则运算、混合运算、带括号运算 +- **初中阶段**:混合运算、分数运算、方程求解、幂运算和开方 +- **高中阶段**:二次方程、函数计算、三角函数、概率、数列、导数、复数运算 + +### 📄 试卷管理 +- 支持生成10-30道题目 +- 智能题目去重机制,确保题目不重复 +- 按用户分类自动保存试卷文件 +- 时间戳命名,便于管理 + +### 💻 交互体验 +- 友好的命令行交互界面 +- 支持切换年级级别 +- 用户登出和重新登录功能 + +## 技术架构 + +### 开发环境 +- **编程语言**:Java 21 +- **开发工具**:IntelliJ IDEA +- **项目类型**:纯Java控制台应用程序 + +### 项目结构 +``` +src/com/bx/ +├── generator_main/ # 主程序入口 +├── manager/ # 业务管理层 +├── question/ # 题目相关 +│ └── generator/ # 题目生成器 +``` + +### 设计模式 +- **工厂模式**:`QuestionFactory`根据难度级别分发题目生成 +- **策略模式**:不同年级采用不同的题目生成策略 +- **分层架构**:清晰的职责分离,便于维护和扩展 + +## 快速开始 + +### 环境要求 +- Java 21或更高版本 +- 支持UTF-8编码 + +### 运行步骤 +1. 克隆项目到本地 +2. 使用IntelliJ IDEA打开项目 +3. 运行 `src/com/bx/generator_main/MathExamGenerator.java` +4. 使用预置账号登录: + - 小学用户:张三1/123、李四1/123、王五1/123 + - 初中用户:张三2/123、李四2/123、王五2/123 + - 高中用户:张三3/123、李四3/123、王五3/123 + +### 使用流程 +1. 输入用户名和密码登录系统 +2. 选择要生成的题目数量(10-30道) +3. 系统自动生成相应难度的数学试卷 +4. 试卷自动保存到 `user_papers/{用户名}/` 目录下 + +## 核心功能详解 + +### 题目类型 + +#### 小学题目 +- 基础四则运算:`1 + 2 =`、`5 × 3 =` +- 混合运算:`2 + 3 × 4 =`、`(1 + 2) × 3 =` +- 带括号运算:`(4 + 5) × 2 =`、`8 ÷ (2 + 2) =` + +#### 初中题目 +- 分数运算:`1/2 + 1/3 =`、`2/3 × 3/4 =` +- 方程求解:`2x + 5 = 13`、`x² - 4 = 0` +- 幂运算:`2³ =`、`√16 =` + +#### 高中题目 +- 二次方程:`x² + 5x + 6 = 0` +- 三角函数:`sin(30°) =`、`cos(45°) =` +- 函数计算:`f(x) = x² + 2x + 1, f(2) =` +- 概率统计:基础概率计算题 +- 数列计算:等差数列、等比数列 +- 导数计算:基础函数求导 +- 复数运算:`(2 + 3i) + (1 - 2i) =` + +### 智能特性 + +#### 题目去重机制 +系统采用哈希算法确保生成的题目不重复,每份试卷都是独一无二的。 + +#### 难度自适应 +根据用户级别自动调整题目复杂度,确保题目符合相应年级的教学要求。 + +#### 文件管理 +- 按用户分类存储试卷 +- 时间戳命名便于查找 +- 支持查看历史生成的试卷 + +## 扩展开发 + +### 添加新题目类型 +1. 在相应的生成器类中添加新的题目生成方法 +2. 遵循现有的命名规范和代码风格 +3. 确保题目符合对应年级的难度要求 + +### 添加新用户 +1. 修改 `UserManager.java` 中的用户列表 +2. 遵循用户名密码的格式规范 +3. 指定用户的教育级别 + +### 自定义题目数量 +系统支持10-30道题目生成,可通过修改 `ExamManager.java` 中的参数进行调整。 + +## 项目优势 + +### 教育价值 +- 减轻教师出题负担 +- 提供个性化练习题目 +- 支持不同学习阶段的需求 + +### 技术特点 +- **零依赖**:纯Java实现,无需额外库 +- **跨平台**:支持所有Java运行环境 +- **易扩展**:清晰的架构便于功能扩展 +- **高可靠**:完善的错误处理机制 + +### 用户体验 +- 简洁的命令行界面 +- 直观的操作流程 +- 即时的反馈提示 + +## 注意事项 + +1. **编码要求**:确保系统使用UTF-8编码,避免中文乱码 +2. **文件权限**:确保程序有权限在 `user_papers` 目录下创建文件 +3. **用户安全**:预置密码为演示用途,实际使用请修改 + +## 更新日志 + +### 第四版 (当前版本) +- 优化题目生成算法 +- 增强用户体验 +- 修复已知问题 + +### 第三版 +- 添加高中题目类型 +- 改进文件管理系统 + +### 第二版 +- 扩展初中题目类型 +- 优化用户界面 + +### 第一版 +- 基础功能实现 +- 小学题目生成 + -- 2.34.1 From 70e834f2708a73367aa5dabdd1f1319c6ca77aed Mon Sep 17 00:00:00 2001 From: bx <2936213174@qq.com> Date: Sun, 28 Sep 2025 16:00:10 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 168 ------------------ .../bx/generator_main/MathExamGenerator.java | 2 - 2 files changed, 170 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index ed4e8e7..0000000 --- a/README.md +++ /dev/null @@ -1,168 +0,0 @@ -# 中小学数学试卷生成系统 - -一个基于Java的命令行应用程序,能够根据不同年级自动生成相应难度的数学试卷。 - -## 项目简介 - -这是一个专为中小学教师、学生和家长设计的数学试卷自动生成工具。系统支持小学、初中、高中三个教育阶段,能够生成符合各阶段教学要求的数学题目,并自动保存为试卷文件。 - -## 功能特性 - -### 🎯 用户管理 -- 支持9个预置用户账号(张三1-3、李四1-3、王五1-3) -- 自动识别用户对应的教育级别(小学/初中/高中) -- 安全的用户名密码验证机制 - -### 📚 题目生成 -- **小学阶段**:四则运算、混合运算、带括号运算 -- **初中阶段**:混合运算、分数运算、方程求解、幂运算和开方 -- **高中阶段**:二次方程、函数计算、三角函数、概率、数列、导数、复数运算 - -### 📄 试卷管理 -- 支持生成10-30道题目 -- 智能题目去重机制,确保题目不重复 -- 按用户分类自动保存试卷文件 -- 时间戳命名,便于管理 - -### 💻 交互体验 -- 友好的命令行交互界面 -- 支持切换年级级别 -- 用户登出和重新登录功能 - -## 技术架构 - -### 开发环境 -- **编程语言**:Java 21 -- **开发工具**:IntelliJ IDEA -- **项目类型**:纯Java控制台应用程序 - -### 项目结构 -``` -src/com/bx/ -├── generator_main/ # 主程序入口 -├── manager/ # 业务管理层 -├── question/ # 题目相关 -│ └── generator/ # 题目生成器 -``` - -### 设计模式 -- **工厂模式**:`QuestionFactory`根据难度级别分发题目生成 -- **策略模式**:不同年级采用不同的题目生成策略 -- **分层架构**:清晰的职责分离,便于维护和扩展 - -## 快速开始 - -### 环境要求 -- Java 21或更高版本 -- 支持UTF-8编码 - -### 运行步骤 -1. 克隆项目到本地 -2. 使用IntelliJ IDEA打开项目 -3. 运行 `src/com/bx/generator_main/MathExamGenerator.java` -4. 使用预置账号登录: - - 小学用户:张三1/123、李四1/123、王五1/123 - - 初中用户:张三2/123、李四2/123、王五2/123 - - 高中用户:张三3/123、李四3/123、王五3/123 - -### 使用流程 -1. 输入用户名和密码登录系统 -2. 选择要生成的题目数量(10-30道) -3. 系统自动生成相应难度的数学试卷 -4. 试卷自动保存到 `user_papers/{用户名}/` 目录下 - -## 核心功能详解 - -### 题目类型 - -#### 小学题目 -- 基础四则运算:`1 + 2 =`、`5 × 3 =` -- 混合运算:`2 + 3 × 4 =`、`(1 + 2) × 3 =` -- 带括号运算:`(4 + 5) × 2 =`、`8 ÷ (2 + 2) =` - -#### 初中题目 -- 分数运算:`1/2 + 1/3 =`、`2/3 × 3/4 =` -- 方程求解:`2x + 5 = 13`、`x² - 4 = 0` -- 幂运算:`2³ =`、`√16 =` - -#### 高中题目 -- 二次方程:`x² + 5x + 6 = 0` -- 三角函数:`sin(30°) =`、`cos(45°) =` -- 函数计算:`f(x) = x² + 2x + 1, f(2) =` -- 概率统计:基础概率计算题 -- 数列计算:等差数列、等比数列 -- 导数计算:基础函数求导 -- 复数运算:`(2 + 3i) + (1 - 2i) =` - -### 智能特性 - -#### 题目去重机制 -系统采用哈希算法确保生成的题目不重复,每份试卷都是独一无二的。 - -#### 难度自适应 -根据用户级别自动调整题目复杂度,确保题目符合相应年级的教学要求。 - -#### 文件管理 -- 按用户分类存储试卷 -- 时间戳命名便于查找 -- 支持查看历史生成的试卷 - -## 扩展开发 - -### 添加新题目类型 -1. 在相应的生成器类中添加新的题目生成方法 -2. 遵循现有的命名规范和代码风格 -3. 确保题目符合对应年级的难度要求 - -### 添加新用户 -1. 修改 `UserManager.java` 中的用户列表 -2. 遵循用户名密码的格式规范 -3. 指定用户的教育级别 - -### 自定义题目数量 -系统支持10-30道题目生成,可通过修改 `ExamManager.java` 中的参数进行调整。 - -## 项目优势 - -### 教育价值 -- 减轻教师出题负担 -- 提供个性化练习题目 -- 支持不同学习阶段的需求 - -### 技术特点 -- **零依赖**:纯Java实现,无需额外库 -- **跨平台**:支持所有Java运行环境 -- **易扩展**:清晰的架构便于功能扩展 -- **高可靠**:完善的错误处理机制 - -### 用户体验 -- 简洁的命令行界面 -- 直观的操作流程 -- 即时的反馈提示 - -## 注意事项 - -1. **编码要求**:确保系统使用UTF-8编码,避免中文乱码 -2. **文件权限**:确保程序有权限在 `user_papers` 目录下创建文件 -3. **用户安全**:预置密码为演示用途,实际使用请修改 - -## 更新日志 - -### 第四版 (当前版本) -- 优化题目生成算法 -- 增强用户体验 -- 修复已知问题 - -### 第三版 -- 添加高中题目类型 -- 改进文件管理系统 - -### 第二版 -- 扩展初中题目类型 -- 优化用户界面 - -### 第一版 -- 基础功能实现 -- 小学题目生成 - - diff --git a/src/com/bx/generator_main/MathExamGenerator.java b/src/com/bx/generator_main/MathExamGenerator.java index 8222886..2113e9c 100644 --- a/src/com/bx/generator_main/MathExamGenerator.java +++ b/src/com/bx/generator_main/MathExamGenerator.java @@ -33,8 +33,6 @@ public class MathExamGenerator { String username = parts[0]; String password = parts[1]; - - //和存储在map容器中的账号密码比对验证 if (userManager.login(username, password)) { System.out.println("当前选择为" + userManager.getCurrentLevel()+"出题"); -- 2.34.1 From 1f90ada8b4cf618cc03c12fffc7e985567e000e5 Mon Sep 17 00:00:00 2001 From: bx <2936213174@qq.com> Date: Sun, 28 Sep 2025 16:00:39 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/README.md | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 doc/README.md diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..51a3cba --- /dev/null +++ b/doc/README.md @@ -0,0 +1,170 @@ +# 中小学数学试卷生成系统 + +一个基于Java的命令行应用程序,能够根据不同年级自动生成相应难度的数学试卷。 + +## 项目简介 + +这是一个专为中小学教师、学生和家长设计的数学试卷自动生成工具。系统支持小学、初中、高中三个教育阶段,能够生成符合各阶段教学要求的数学题目,并自动保存为试卷文件。 + +## 功能特性 + +### 🎯 用户管理 +- 支持9个预置用户账号(张三1-3、李四1-3、王五1-3) +- 自动识别用户对应的教育级别(小学/初中/高中) +- 安全的用户名密码验证机制 + +### 📚 题目生成 +- **小学阶段**:四则运算、混合运算、带括号运算 +- **初中阶段**:混合运算、分数运算、方程求解、幂运算和开方 +- **高中阶段**:二次方程、函数计算、三角函数、概率、数列、导数、复数运算 + +### 📄 试卷管理 +- 支持生成10-30道题目 +- 智能题目去重机制,确保题目不重复 +- 按用户分类自动保存试卷文件 +- 时间戳命名,便于管理 + +### 💻 交互体验 +- 友好的命令行交互界面 +- 支持切换年级级别 +- 用户登出和重新登录功能 + +## 技术架构 + +### 开发环境 +- **编程语言**:Java 21 +- **开发工具**:IntelliJ IDEA +- **项目类型**:纯Java控制台应用程序 + +### 项目结构 +``` +src/com/bx/ +├── generator_main/ # 主程序入口 +├── manager/ # 业务管理层 +├── question/ # 题目相关 +│ └── generator/ # 题目生成器 +``` + +### 设计模式 +- **工厂模式**:`QuestionFactory`根据难度级别分发题目生成 +- **策略模式**:不同年级采用不同的题目生成策略 +- **分层架构**:清晰的职责分离,便于维护和扩展 + +## 快速开始 + +### 环境要求 +- Java 21或更高版本 +- 支持UTF-8编码 + +### 运行步骤 +1. 克隆项目到本地 +2. 使用IntelliJ IDEA打开项目 +3. 运行 `src/com/bx/generator_main/MathExamGenerator.java` +4. 使用预置账号登录: + - 小学用户:张三1/123、李四1/123、王五1/123 + - 初中用户:张三2/123、李四2/123、王五2/123 + - 高中用户:张三3/123、李四3/123、王五3/123 + +### 使用流程 +1. 输入用户名和密码登录系统 +2. 选择要生成的题目数量(10-30道) +3. 系统自动生成相应难度的数学试卷 +4. 试卷自动保存到 `user_papers/{用户名}/` 目录下 + +## 核心功能详解 + +### 题目类型 + +#### 小学题目 +- 基础四则运算:`1 + 2 =`、`5 × 3 =` +- 混合运算:`2 + 3 × 4 =`、`(1 + 2) × 3 =` +- 带括号运算:`(4 + 5) × 2 =`、`8 ÷ (2 + 2) =` + +#### 初中题目 +- 分数运算:`1/2 + 1/3 =`、`2/3 × 3/4 =` +- 方程求解:`2x + 5 = 13`、`x² - 4 = 0` +- 幂运算:`2³ =`、`√16 =` + +#### 高中题目 +- 二次方程:`x² + 5x + 6 = 0` +- 三角函数:`sin(30°) =`、`cos(45°) =` +- 函数计算:`f(x) = x² + 2x + 1, f(2) =` +- 概率统计:基础概率计算题 +- 数列计算:等差数列、等比数列 +- 导数计算:基础函数求导 +- 复数运算:`(2 + 3i) + (1 - 2i) =` + +### 特点功能 + +#### 题目去重机制 +系统采用哈希算法确保生成的题目不重复,每份试卷都是独一无二的。 + +#### 难度自适应 +根据用户级别自动调整题目复杂度,确保题目符合相应年级的教学要求。 + +#### 文件管理 +- 按用户分类存储试卷 +- 时间戳命名便于查找 +- 支持查看历史生成的试卷 + +## 扩展开发 + +### 添加新题目类型 +1. 在相应的生成器类中添加新的题目生成方法 +2. 遵循现有的命名规范和代码风格 +3. 确保题目符合对应年级的难度要求 + +### 添加新用户 +1. 修改 `UserManager.java` 中的用户列表 +2. 遵循用户名密码的格式规范 +3. 指定用户的教育级别 + +### 自定义题目数量 +系统支持10-30道题目生成,可通过修改 `ExamManager.java` 中的参数进行调整。 + +## 项目优势 + +### 教育价值 +- 减轻教师出题负担 +- 提供个性化练习题目 +- 支持不同学习阶段的需求 + +### 技术特点 +- **零依赖**:纯Java实现,无需额外库 +- **跨平台**:支持所有Java运行环境 +- **易扩展**:清晰的架构便于功能扩展 +- **高可靠**:完善的错误处理机制 + +### 用户体验 +- 简洁的命令行界面 +- 直观的操作流程 +- 即时的反馈提示 + +## 注意事项 + +1. **编码要求**:确保系统使用UTF-8编码,避免中文乱码 +2. **文件权限**:确保程序有权限在 `user_papers` 目录下创建文件 + - 文件夹会在程序首次运行时自动创建 + - 生成的题目文件保存在此文件夹中 +3. **用户安全**:预置密码为演示用途,实际使用请修改 + +## 更新日志 + +### 第四版 (当前版本) +- 优化题目生成算法 +- 增强用户体验 +- 修复已知问题 + +### 第三版 +- 添加高中题目类型 +- 改进文件管理系统 + +### 第二版 +- 扩展初中题目类型 +- 优化用户界面 + +### 第一版 +- 基础功能实现 +- 小学题目生成 + + -- 2.34.1 From e67f37c13e24f34658693379b14d8bb71dca5b75 Mon Sep 17 00:00:00 2001 From: bx <2936213174@qq.com> Date: Sun, 28 Sep 2025 18:26:50 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/README.md | 4 +- src/META-INF/MANIFEST.MF | 3 ++ .../bx/generator_main/MathExamGenerator.java | 51 +++++++++++++++++-- 3 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 src/META-INF/MANIFEST.MF diff --git a/doc/README.md b/doc/README.md index 51a3cba..a82cd63 100644 --- a/doc/README.md +++ b/doc/README.md @@ -60,6 +60,7 @@ src/com/bx/ 1. 克隆项目到本地 2. 使用IntelliJ IDEA打开项目 3. 运行 `src/com/bx/generator_main/MathExamGenerator.java` +4. 或者使用 `java -jar PaperGenerator.jar` 指令运行提供的jar包 4. 使用预置账号登录: - 小学用户:张三1/123、李四1/123、王五1/123 - 初中用户:张三2/123、李四2/123、王五2/123 @@ -152,8 +153,7 @@ src/com/bx/ ### 第四版 (当前版本) - 优化题目生成算法 -- 增强用户体验 -- 修复已知问题 +- 修复终端执行jar包显示乱码问题 ### 第三版 - 添加高中题目类型 diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF new file mode 100644 index 0000000..a2b4134 --- /dev/null +++ b/src/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: com.bx.generator_main.MathExamGenerator + diff --git a/src/com/bx/generator_main/MathExamGenerator.java b/src/com/bx/generator_main/MathExamGenerator.java index 2113e9c..8308ea4 100644 --- a/src/com/bx/generator_main/MathExamGenerator.java +++ b/src/com/bx/generator_main/MathExamGenerator.java @@ -3,13 +3,56 @@ package com.bx.generator_main; import com.bx.manager.ExamManager; import com.bx.manager.UserManager; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; import java.util.Scanner; // 数学试卷生成器主程序 public class MathExamGenerator { protected static UserManager userManager = new UserManager(); - protected static Scanner scanner = new Scanner(System.in); + protected static Scanner scanner; + + static { + try { + // 检测系统默认编码 + String defaultEncoding = System.getProperty("file.encoding"); + System.out.println("系统默认编码: " + defaultEncoding); + + // 检测操作系统 + String osName = System.getProperty("os.name").toLowerCase(); + String encoding = "UTF-8"; + + // Windows系统使用GBK编码以避免乱码 + if (osName.contains("windows")) { + encoding = "GBK"; + System.out.println("检测到Windows系统,使用GBK编码"); + } else { + System.out.println("检测到非Windows系统,使用UTF-8编码"); + } + + // 设置控制台编码 + System.setOut(new PrintStream(System.out, true, encoding)); + System.setErr(new PrintStream(System.err, true, encoding)); + + // 设置系统属性 + System.setProperty("file.encoding", encoding); + System.setProperty("sun.stdout.encoding", encoding); + System.setProperty("sun.stderr.encoding", encoding); + + // 使用对应编码创建Scanner + scanner = new Scanner(System.in, encoding); + + } catch (UnsupportedEncodingException e) { + // 如果指定编码不支持,回退到默认编码 + System.err.println("指定编码不支持,使用默认编码"); + scanner = new Scanner(System.in); + } catch (Exception e) { + // 其他异常也回退到默认 + System.err.println("编码设置失败,使用默认编码: " + e.getMessage()); + scanner = new Scanner(System.in); + } + } public static void main(String[] args) { System.out.println("=== 中小学数学卷子自动生成程序 ==="); @@ -67,7 +110,7 @@ public class MathExamGenerator { } - //切换命令 + //切换命令 private static boolean handleSwitchCommand(String input) { if (input.startsWith("切换为")) { String newLevel = input.substring(3).trim(); @@ -84,7 +127,7 @@ public class MathExamGenerator { } - //处理题目数量输入 + //处理题目数量输入 private static void handleQuestionCountInput(String input) { try { int count = Integer.parseInt(input); @@ -98,5 +141,3 @@ public class MathExamGenerator { } } } - - -- 2.34.1 From 4b753993a862824f4cc6078a3dd429a84be8c337 Mon Sep 17 00:00:00 2001 From: bx <2936213174@qq.com> Date: Sun, 28 Sep 2025 18:37:54 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/终端运行说明.md | 107 ++++++++++++++++++ .../PaperGenerator_jar/PaperGenerator.jar | Bin 0 -> 13302 bytes .../PaperGenerator/META-INF/MANIFEST.MF | 3 + .../bx/generator_main/MathExamGenerator.class | Bin 0 -> 5060 bytes .../com/bx/manager/ExamManager.class | Bin 0 -> 3061 bytes .../com/bx/manager/UserManager.class | Bin 0 -> 2073 bytes .../com/bx/question/QuestionFactory.class | Bin 0 -> 1052 bytes .../generator/HighQuestionGenerator.class | Bin 0 -> 2808 bytes .../generator/MiddleQuestionGenerator.class | Bin 0 -> 3004 bytes .../generator/PrimaryQuestionGenerator.class | Bin 0 -> 2827 bytes .../generator/QuestionGenerator.class | Bin 0 -> 191 bytes 11 files changed, 110 insertions(+) create mode 100644 doc/终端运行说明.md create mode 100644 out/artifacts/PaperGenerator_jar/PaperGenerator.jar create mode 100644 out/production/PaperGenerator/META-INF/MANIFEST.MF create mode 100644 out/production/PaperGenerator/com/bx/generator_main/MathExamGenerator.class create mode 100644 out/production/PaperGenerator/com/bx/manager/ExamManager.class create mode 100644 out/production/PaperGenerator/com/bx/manager/UserManager.class create mode 100644 out/production/PaperGenerator/com/bx/question/QuestionFactory.class create mode 100644 out/production/PaperGenerator/com/bx/question/generator/HighQuestionGenerator.class create mode 100644 out/production/PaperGenerator/com/bx/question/generator/MiddleQuestionGenerator.class create mode 100644 out/production/PaperGenerator/com/bx/question/generator/PrimaryQuestionGenerator.class create mode 100644 out/production/PaperGenerator/com/bx/question/generator/QuestionGenerator.class diff --git a/doc/终端运行说明.md b/doc/终端运行说明.md new file mode 100644 index 0000000..85d9456 --- /dev/null +++ b/doc/终端运行说明.md @@ -0,0 +1,107 @@ +# 数学试卷生成器 - 终端运行说明 + +## 项目简介 +这是一个中小学数学试卷自动生成程序,支持小学、初中、高中三个级别的数学题目生成。 + +## 编码说明 +程序已智能适配不同操作系统的编码: +- **Windows系统**:自动使用GBK编码,避免CMD/PowerShell中文乱码 +- **Linux/Mac系统**:自动使用UTF-8编码 + +## 运行前准备 + +### 1. 编译项目 +```bash +# 在项目根目录执行 +javac -encoding UTF-8 -d out/production/PaperGenerator -cp src src/com/bx/generator_main/MathExamGenerator.java src/com/bx/manager/*.java src/com/bx/question/generator/*.java src/com/bx/question/QuestionFactory.java +``` + +### 2. 运行程序 +```bash +# 在项目根目录执行 +java -cp out/production/PaperGenerator com.bx.generator_main.MathExamGenerator +``` + +## 各终端运行方法 + +### Windows CMD +```cmd +# 直接运行(程序会自动检测为Windows系统,使用GBK编码) +java -cp out/production/PaperGenerator com.bx.generator_main.MathExamGenerator +``` + +### Windows PowerShell +```powershell +# 直接运行(程序会自动检测为Windows系统,使用GBK编码) +java -cp out/production/PaperGenerator com.bx.generator_main.MathExamGenerator +``` + +### Linux/Mac 终端 +```bash +# 直接运行(程序会自动检测为非Windows系统,使用UTF-8编码) +java -cp out/production/PaperGenerator com.bx.generator_main.MathExamGenerator +``` + +## 使用方法 + +### 登录流程 +1. 程序启动后会显示: + ``` + 系统默认编码: GBK + === 中小学数学卷子自动生成程序 === + 请输入用户名和密码(空格分隔): + ``` + +2. 输入用户名和密码(空格分隔),例如: + ``` + admin 123456 + ``` + +3. 登录成功后会显示当前选择的年级级别 + +### 功能操作 +- **生成题目**:输入题目数量(10-30道) +- **切换年级**:输入`切换为小学`、`切换为初中`或`切换为高中` +- **重新登录**:输入`-1` + +### 示例操作流程 +``` +系统默认编码: GBK +=== 中小学数学卷子自动生成程序 === +请输入用户名和密码(空格分隔):admin 123456 +当前选择为小学出题 +准备生成 小学 数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录)(若要切换则输入切换为xx):10 +成功生成小学数学试卷到当前文件夹! +``` + +## 注意事项 + +1. **编码兼容性**:程序已自动适配不同操作系统,无需手动设置编码 +2. **中文输入**:确保终端支持中文输入 +3. **文件保存**:生成的试卷文件会保存在程序运行的当前目录 +4. **用户管理**:用户账号信息存储在程序内置的数据结构中 + +## 常见问题 + +### Q: 运行后中文显示乱码? +A: 程序会自动检测操作系统并选择合适的编码,一般不会出现乱码。如果仍有乱码问题,请检查: +- 终端是否支持中文显示 +- Java版本是否过旧(建议Java 8及以上) + +### Q: 无法输入中文? +A: 确保你的终端输入法正常工作,程序已正确处理中文输入流。 + +### Q: 登录失败? +A: 请检查: +- 用户名和密码是否正确 +- 用户名和密码之间是否有空格分隔 +- 是否有多余的空格或特殊字符 + +## 技术实现 + +程序通过以下方式实现编码兼容: +1. 检测操作系统类型(`System.getProperty("os.name")`) +2. Windows系统使用GBK编码,其他系统使用UTF-8 +3. 设置控制台输出流和错误流的编码 +4. 使用对应编码创建Scanner对象处理输入 +5. 设置相关系统属性确保Java运行时编码一致 \ No newline at end of file diff --git a/out/artifacts/PaperGenerator_jar/PaperGenerator.jar b/out/artifacts/PaperGenerator_jar/PaperGenerator.jar new file mode 100644 index 0000000000000000000000000000000000000000..4eb72d10f804c76af18815b241ccf9358c1c1b62 GIT binary patch literal 13302 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 literal 0 HcmV?d00001 diff --git a/out/production/PaperGenerator/com/bx/manager/ExamManager.class b/out/production/PaperGenerator/com/bx/manager/ExamManager.class new file mode 100644 index 0000000000000000000000000000000000000000..cc40712c6c6d3f5290df57b3271814e05617cfb0 GIT binary patch literal 3061 zcmaJ@U2q%K75=U*X=QndV-Y8jDM@HdV#kqH(h!1V48+8-!FB){yEag|mKJ+sX;`~+Z324?a0JtpfjEJq0em}JJT5)hNnK$p}61Ol@dADR36{E zd+xdCp7WjWoV$PheCY!KcjMg%>QJvBpdyHnz{X?RaV?S4%&ElD$zyuP6$o`3rs4Jo z)VFtxDhLZ)?iMdN;h>|bM?xKz^?YetNx{3+c2k69qUDn*n}1Z zn^kPVR)OoTIz(p#!WqkSHN$iSTB;5D0jD}98qkUx6nsI&jo2p8T6Q(Bnc9?YCl1eQ z`62&VAX@PPhk|y24Ob)ebJB`EDmt-OAmV7p^%1Mj$ms$%m&5iPl$xm; z2Qk-O4Bj*8>a%VlZR86%{T^nd&$9EH8^)K&g*pD>LqqXwHs0SK&*$Tg6G0sNB%!{1 z4Z@X_(e$lryp={H*e_WU$3YdhBT3>t?j0l0R_(4-t(EjB1iB@r(Fl5Qr-Hjw^83&l zO8e&v1W28{z^3*ZXv*F9s5p#10mX0*=L;^$NbXN4=oe5uJPa!#k&Lo`m`x>c;>UdefRSOyWr0$5l*Wn#h|JT#J0U@T7~!RLn@)C| zd|kG|U?yidx`J<1RK1QkGHqK=YLhuq^#s19;@kKRy9?_%T`UxA-Es7+z}D)#UfGe7 zt@G)MH3C0y^zdv(FUZy>BYQ^0_heZ0x@|}B6i%u*CCM9^(%m6iX5)!6dEEjHX=BRN z+@j4o-s#6$=`-Ey$UWo4J^9gc>EG|qQ}yQpF@M3AUVg2#a&qaD(`V&! zQwVQG@C*D>!LMX_FR*8Mb?DK?Fppa^dcv=9ztdm2l*>Q^ z|9*_;%c_54msKcrmZ6L-uKWU9jk+MY#&sP8xTel zKX{rMT@*Xe!kcX~4k3m?O2%*lyJ9o)jN8U`yuck>5d0jQ6zo>8NqmMz1wC8CpJER` zp?HteIKdDl0u!e4Kb8?6k0usz%h29s>}QY%O1NzaDPXwsFF4Ry!W|{_&V#E*#ygiV z04(C(WH1&i;l6n^$a#3IGroiefMj3+p?ET|jFItWjE=_wi}(uv$CJT5m+*)H5hGq- z6F7@)@`)|vkLXD%v0zLo!H~vs3#wK=KQUn6weXc61P*gT&`9 zBGiX297O^T;uh}OPfNGrSsY+eZo^B|dW9)Cha|13MU}A%=FbAQt(uBnc6Qh zcQ0Kb_D;qme~o39{vNSw>CLZayiAokoTmH0E^aTT@$A7+pI7atMbc94^)tC{zS;BL<4J4GmNZ7P+)GTr8q937&yqNHCX9eNi9O zQQN^6AFQ3u_@s_)XYkU}i{tdk2Os?npw|DOHnFNNKA8$l#n&S>cnSv`cv{6l91^HCtd~~h=9zRp zo=oQ^^tS~XyDht$?nS%{(nO1jRve~_%Q`*o+>f{SQwQ1~3z+GT6K!}#MTb02mHt*C zp2|7tNT-S}bkjrbAVXnz_{3JlfOsui6{n<8p9(($0?JA}w=$A>LpL%quAoQ2vGdcH z+jl<>D|oI9dKL7RL7#%71ixS3*tvF%wCBr!v}0vJ+6jU`HZE`9|BST3G9Zm5P+TEx znBMJde!6q(D+Mpe@kiIU@7_{yn&U?|KIhnhF@d_>gq-2AnKCCvVOKED(}#QeWbh|c zOk#?7y};lf+b8&zfRxgSm6y=P5HXjLP6rs@S*ASf-F&(#Mk04UeTcdt`FZ&g!)BGO)9S*lQ4& zCbHoyh3##O*__l0*LX|teU2#1b>0Q2^KC)+G{aL{KeS1P8R#C=aNI3a zc!e82p}{X2c^4f(P#og@(~6L2=hf4Ju;@ask$`42{EbBi+C;7KxLh@1Tj^m=W-(`G zhRGBB0hPWVQ7tz$i$~U(Ji5UAzEt;<)Cj4s-~!*WJdg0~vaG9Q0a}(e=SU0=F!(ymI6dEQ_&oDJWXRl|`gm=jhSfuMV Gy!J1<@4U+Z literal 0 HcmV?d00001 diff --git a/out/production/PaperGenerator/com/bx/question/QuestionFactory.class b/out/production/PaperGenerator/com/bx/question/QuestionFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..86e3a1fb90cf6136ac9f681b50ea29f8866a7e3a GIT binary patch literal 1052 zcmb7DOK%cU7(JIqXF3cNfznz*ied!@JC>NZK-9*h)<}H>HPPJw6PU`Q9R}0xbl06O zb>UVMn51xPYnkpDTJw@jm6W)Le{vvR9Z z(mRAZB0MB<*nWMu^MRASGETuqOZs|Ct2P-X`4$g1+8BBICkE#04Z|B%v@U|G}ja_ml^DVF<(%$7Jn4 z6{^$+?!2WHpRZ_ZJ%4UwL`PjPP?YkGmRZ!746YLB2i8l}JSR|YqtwBC*ui)Y(>Fz4 zn2-@VlY3yF$zZrdU%n0MU5OWiY<~0ye*%PWk~v#e*@du84vo7s?T~J?3Da=Bx=I*> z-}9L8rs8w&V&Wa5_UuQ56raE2`5okW6yIdWb2_u3Pjr~Zl`eFy8X`MJGj)Ker+YZv zKEMoNh%ihTA?&Wx8C&PpK?)4;VhuiQAb^($Vhhul@2rZykrE&>w_6Gcf`D-yMVggHkuV3f_Yv z5Q>U%bkhh8X@(Y4Ei)F{qYn)q%1-aj&5|vq8iVGjfUnm!m9X?^=&(K4 z>ct|IxlyiQF?=~Kc>n>op-osl235I&J@q|as#&UF87c%;WKC;_66zo&=#j272|i3i zU}>=4v1U6Kwqm+5L~9;YDp(;GSLPOXCya<(lT$81RSK#ls5%Ea64QrF!yMJD*x7tw zt%CO@uqp>U7&8ad0X?c)b8ssad@#pqSYrT<2&Fq=lve8$td<~uj%=3})5q!1_#D_8 z1wjd`$-z3!(XpsDu|F|7pv7{8K5lk{f<~+rSU#$bXq~1JQLSUTHOx`mQVlCEu#7P+ z6sKl{+*qezybUwJyA=h*YR0MkpLyFNQA>9lq zA%!s|=-(6C<-P}D}POeUKP!lNY)eX(r@+0a%lr!bI ze8?>lSQxg{$jCl*EDQ0pMWWf#_J++wETVPma;d*y={C!9C2xmmT5&6;j_uQ|VRMji zJ|o<9hPiGT>S2iAFTf`yTue31F&_fx@%dd|sD zubzB2bN}3_ps4rY3;OZm?v2ddYjSZ=Jio`uF9r5YKfWxcQ@1kTe?6VLGyV8+`pVVy zeCOKq`G=gE`T3Iled5JE1 z-n{zq#v}Egb6>SfDe3dK`DxG|QoZNbkTL|9*ZPhWV-WpCA=6l6~S`Gj*GFm9D^ z#Ro;B(CY(@0cTKFf*~)4p}TQfCc=n7-RwE58{_7P7IKQosmpFP!Xxyoz>oR)ngu#> z-@_v_s>SPiO>-nM);d3}^JeBOJaTqSD*!){hj&i?*8JMcQgo`(Xjr#2)|k>`@Tl*M zs`0oMcY~+w>UlmDlIq5oK<)oSc}+NeVI@z(A|5NfY<_v?@F4SY%*%@Xe!kW4DfldI zn1r~`fxrRw^0U()L6;0_=+R4c6h2I%gkSG*MUkzenWDi~O6eQ15L;R3 zJ5Yvhl+&rjI1C?-V+l@TDO6$(5xp3tuX%VYKORVg&>ujWj3Zl;Lz7igaJ2 znv%w9B;{=IrL)ETwzA#xX|^%7wv&c`BeFCyj&ct-&85jQ=Iw0zEMOZ|)=bG#k$L3A z(%HRT1 dncaVG_b2VX-|h$Oeh^Wvljp@KOq{`re*ri-w!8oU literal 0 HcmV?d00001 diff --git a/out/production/PaperGenerator/com/bx/question/generator/MiddleQuestionGenerator.class b/out/production/PaperGenerator/com/bx/question/generator/MiddleQuestionGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..b1ad796c02d2064259e678606b61f9df26d66382 GIT binary patch literal 3004 zcmaJ@OK=ob6g@BLneGe&=@|%;4=|Ak2?LD$0+J7eNN_Y^fI;JkpLAy0Fl5plW;z&j zXSuLSt#YGSET~e;in^fuR6z{tLUf^3mOIO>F2tRCe|X;O9x|BVP<`LaedoS=@45HA z$9MlMdr5(nlb*8)05yrD7iYBZTxF>LKj}&L^!a%v` zotd(|VqTz$P~Vx#EbEnv&IFwqSQkYzS_IZrZHLNMUS?7aTwqP-U2NN;SbvA@k#jRv zt*vyhF^Yr)wN)J)cb~J%15V+j>v~luI__ooi`4r89-b+d3U)byc3GkOs&v$(U|@@Y zNE+zku-!mXpzg*+1KZ_zO&X@6xF0)7x-~s*I|atE92J459s|3%Q9>H-m4@8{+dG#M zx0H{?4feAziN3@^xyOMhdSvc~=lU7N*>inS^y47Yow6qFLD$J!-Y6@@S;ey)uOhIu zGo4=QG`(C2;}95-8y@C{G+Q21hk-ciaYO=#SZfJf9;r!W2x*C28%G%FICLotj7Z%v zfwi<=N`UHIR_TO5^6qD%TJM_EpbfeOTcB~c=-9_*rpE2^DQmn$jahA&s*%9TtY_sX zN33ZD(J?Bp`t(w!NO*6)6dc+})}1Nm?V+OFv+XX2a))d^x;)IDtaxQ>dc^k5xP^*= zr|4CrM1ub)Syuzkkb~dm-u?B>&u+f|%I}|F60?aU*ZUH}05@r_UF%e9UCNZpJc_Ng z%ZsK8XMi!Ty8{qx;O{=c5P!S!_RT97rQ5GQ@#859#BOVUdHGTh=H#8=Pkk`2otiD4 zR@lZc+z6&|PDfc5nJw6{covJ!d3VxI`3>y%>kzL9w|qh1t=hv80DbBn;(b=KD;>kG zJ2^Amv$RMxnmY_nU6{6)f!CJVznFV!n=sg7&?=R(MbGXLh^8Ih#DgWPQn4#K&I{bP zB&X#<)iEou;s2q$PW-%h#tpt70>}Ba$R~jZT<4r`3FS%twVtEk7}|Ob;$uz(vXpY! zm#1jxLodsxh}sjMKsWWPSlP>o97AJ$tsioMzX$w5;S!v0;kTXN?zVZXp2NC%+%t#x zJX+@voyUebgegBFpia5nj0VnEP)4zuZ_OSw@`^I~5XNv6ag0!Vocc$JYDD;N>=7ay z3WW~q=s-k1GeN9BLSv%93)j(}yM|4}`WNWP)yFqyb6UJJn+wIaW^>{Aw(N*Zrobe$ zvHs-xtJpEBb!$yp%RAV&jZ53UjxVb+0%J0`1{GXSbs8Fz#R;^1)oEy~|86`S(3&;EnzbO|me%G_ z+xi9c0x}W5E7sB@&_$NFGKnOHC{MAz5&6*iQHi5uUZQ^DZn8OgTKv{{k2?9QWk8M{s@<&?Ekz`+10$p{!&+%f=4n?_~R ztopeqA|ArKNaG6Id7j7{$lwRIwJduBw7<|Hx;nc_D*s~=ka{mkl}GP; zMqf+n9Ch+nB~>1^Hx@JOZC#)*d}OZrJd&%|Gday{$mBw%naPFC=1fjEJ2E-L+?mOl zVe=5BZl0ht%mQVDd4Vz#!|NPY#P9)!XbfL-SQ*35nc*ZIC1tzp=xbZR!vXg`&C>HD zfku+)SAz#dT^587*D|?FT}-27GDjw#B$H2}8x~&0IN8eMGA8f=&ae|pxQ;1&Lrx`I zD}1(Me_|p=mG0~U9i}3QXmU!x)2nt% zo3VIkNX<35unfyJ6u7Yho~)c41A!$8W7h0UCgVmVp)?(IQB$ECMJN`i%m^^TvBZ(M zF)(eZ$*K@2toB>Gsu;s&igw&p$0|2UrH6{FhrZaX5q;W$)K~6?7Zn1URML|mB1d(P zzel23?S>C)1o8(4yM{W32Zq7|D-SK+P{Ue*k_Fb5j?Q!}9yL-fRKYGKZE#~Fs;N0E z$%53Mo|-UHD)t^}TjNFmFOh3xdfG@t1-z8AXwQuECLOf`!Y5zcBwySt5UgHg-Si>{ z^^Dlp;%k#Wwz|g3PK9s?#2!|>CFmPEJtGI(PY}}OhqPNH_RDn*yKjDG%Q+9?qq6cocbZ0U#V@49@{zyD+ z*jau;z}44rAY&zGczBMT$*3W)yf>CGtdky&OvE`;kY$wJj4s0_S@uPym5C-ZPj8-# zXX@1zPNq|n#_pJWyW)BESSzy-Ye?A!fqihGOx8BVlwkx1I5*0^4F@?slruieF>{@3 z`LyBX!RMtfd8tKT|eUx*B|{B z^we=-4qF!FR}n0T$<10R#yV6|^+wcS6HBj~Z69h?NF}g6;?Su<*U&CBRFTY|e90!S zrHtxPj%;-2qtZM|ZZ5x~m~FdR?)X;q8YR7!h3(4-9;l~?EtIg8w<@a@+fdE|9p{P$ z+h15A^68cpo7v_MCV^CaHiIDtjCK$0qjpbcc+}z96&`hZc85pvJTHg)7r-|-0!0ps znX|}AX4`^X4BnTB8}p=Hp*o-jEuavVG7<}B5s$$?a>hxNzXTM@5rWQvS*P-{mEzjq zK|2w4FqTfVVi#d{A&lJ^V=v9|o9MwQ>`_s!l5jhar{Go*ZbT@$I~X?aA1iE8!ko|; z_Kj@V@^D+^qctZ>8Xa<`!I?WHqf!aHJ>c2HXuOQWij5$w*ec{yFGo4yI%T-mu{BU6 zdpR)rU*KbqYap3^dj+2;RtirBlIoMr z;~Hz!atC_uAm3uAK*<^_CDKe@$aJ#c>2glu$w8L?*p5Q{9tG&SDDtu-&i}89luD&Y z_AEu}h@Vu%BR=;Zbvy+{0Z>q$B|*(SDZzsBjI6oHD+!ol)+AAYMc;A@JoHR4% z1S@P7+i{Y$^#+FU7A@b#dw2(5<6V5u`uY*4aSLZKkN0s8XYl~%@GCyV?>LV~xFA;H zBN4#Iq86WudR!Dc@R?}C=b{T=h#_1OWB5|UaYdZMRdE$xi97g4W#e+#|HgMR5g+2h zLvEmB;_)Y@llPPS+i(}lcuf!8Vb(rQjFKI4Q)hTvC*omu}6-z!jWdT9lmX rmYI{v$RGw&4!1xLq=k) Date: Sun, 28 Sep 2025 18:43:04 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/workspace.xml | 257 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 .idea/workspace.xml diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..e0086d8 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + {} + { + "isMigrated": true +} + + + { + "associatedIndex": 1 +} + + + + + + + { + "keyToString": { + "RunOnceActivity.ShowReadmeOnStart": "true", + "SHARE_PROJECT_CONFIGURATION_FILES": "true", + "git-widget-placeholder": "develop", + "kotlin-language-version-configured": "true", + "last_opened_file_path": "C:/Users/ASUS/OneDrive/Desktop/paper_generator/src", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "nodejs_package_manager_path": "npm", + "project.structure.last.edited": "工件", + "project.structure.proportion": "0.15", + "project.structure.side.proportion": "0.2", + "settings.editor.selected.configurable": "configurable.group.tools", + "vue.rearranger.settings.migration": "true", + "应用程序.MathExamGenerator.executor": "Run" + } +} + + + + + + + + + + + + + + + + 1758627387353 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- 2.34.1