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`T3Iled297aOY7w={4nauTXW^SI#T)yA|9ax{ab16M}cjkwC>5JE1
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
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
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
+
+
+ 1758627387353
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1758718169046
+
+
+
+ 1758718169046
+
+
+
+ 1758721030985
+
+
+
+ 1758721030986
+
+
+
+ 1758976924192
+
+
+
+ 1758976924192
+
+
+
+ 1758979600757
+
+
+
+ 1758979600757
+
+
+
+ 1759046417724
+
+
+
+ 1759046417724
+
+
+
+ 1759046442793
+
+
+
+ 1759046442793
+
+
+
+ 1759055214485
+
+
+
+ 1759055214485
+
+
+
+ 1759055292192
+
+
+
+ 1759055292192
+
+
+
+ 1759055353424
+
+
+
+ 1759055353424
+
+
+
+ 1759055878739
+
+
+
+ 1759055878739
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
--
2.34.1