From fee26f0203813da2fe73e64a4db429ff6b1e163f Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:25:28 +0800 Subject: [PATCH 01/30] ADD file via upload --- src/users.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/users.txt diff --git a/src/users.txt b/src/users.txt new file mode 100644 index 0000000..3a21863 --- /dev/null +++ b/src/users.txt @@ -0,0 +1,9 @@ +张三1 123 primary +张三2 123 primary +张三3 123 primary +李四1 123 junior +李四2 123 junior +李四3 123 junior +王五1 123 senior +王五2 123 senior +王五3 123 senior -- 2.34.1 From 102c3da7d88a4ef8d3c125f36ded332ade80ec4d Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:26:03 +0800 Subject: [PATCH 02/30] ADD file via upload --- src/AbstractQuestionGenerator.java | 134 +++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/AbstractQuestionGenerator.java diff --git a/src/AbstractQuestionGenerator.java b/src/AbstractQuestionGenerator.java new file mode 100644 index 0000000..7e39d09 --- /dev/null +++ b/src/AbstractQuestionGenerator.java @@ -0,0 +1,134 @@ +import java.io.*; +import java.util.HashSet; +import java.util.Random; +import java.util.Set; +import java.util.Stack; + +public abstract class AbstractQuestionGenerator implements QuestionGenerator { + + protected Random random = new Random(); + protected Set generatedQuestions = new HashSet<>(); + protected String username; + + // 设置用户名用于查重 + public void setUsername(String username) { + this.username = username; + loadExistingQuestions(); + } + + // 从文件中加载已存在的题目 + protected void loadExistingQuestions() { + if (username == null) return; + + File[] userFiles = QuestionManager.getUserQuestionFiles(username); + for (File file : userFiles) { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + String line; + while ((line = reader.readLine()) != null) { + line = line.trim(); + if (!line.isEmpty() && line.matches("^\\d+\\. .+")) { + // 提取题目内容(去除题号) + String question = line.replaceFirst("^\\d+\\. ", ""); + String normalized = normalizeQuestion(question); + generatedQuestions.add(normalized); + } + } + } catch (IOException e) { + System.out.println("读取题目文件出错: " + e.getMessage()); + } + } + } + + // 标准化题目格式用于比较 + public String normalizeQuestion(String question) { + return question.replaceAll("\\s+", ""); + } + + protected String generateNumber() { + return String.valueOf(random.nextInt(100) + 1); + } + + public String generateOperator(String[] operators) { + return operators[random.nextInt(operators.length)]; + } + + protected boolean isQuestionUnique(String question) { + String normalized = normalizeQuestion(question); + return !generatedQuestions.contains(normalized); + } + + protected void addToGeneratedQuestions(String question) { + String normalized = normalizeQuestion(question); + generatedQuestions.add(normalized); + } + + + protected boolean hasBalancedParentheses(String expression) { + Stack stack = new Stack<>(); + for (char c : expression.toCharArray()) { + if (c == '(') { + stack.push(c); + } else if (c == ')') { + if (stack.isEmpty()) return false; + stack.pop(); + } + } + return stack.isEmpty(); + } + + public boolean isValidParentheses(String expression) { + expression = expression.replaceAll("\\s+", ""); + + if (!hasBalancedParentheses(expression)) { + return false; + } + + if (expression.startsWith("(") && expression.endsWith(")") && + hasBalancedParentheses(expression.substring(1, expression.length() - 1))) { + return false; + } + + String[] parts = expression.split("[+\\-×÷]"); + for (String part : parts) { + part = part.trim(); + if (part.startsWith("(") && part.endsWith(")")) { + String inside = part.substring(1, part.length() - 1); + if (isSimpleOperand(inside)) { + return false; + } + } + } + + return true; + } + + private boolean isSimpleOperand(String str) { + return str.matches("\\d+") || str.matches("√\\d+") || str.matches("\\d²+") || + str.matches("sin[\\d°]+") || str.matches("cos[\\d°]+") || str.matches("tan[\\d°]+") || + str.matches("sincos[\\d°]+") || str.matches("sintan[\\d°]+") || str.matches("cossin[\\d°]+") || + str.matches("costan[\\d°]+") || str.matches("tansin[\\d°]+") || str.matches("tancos[\\d°]+"); + } + + protected boolean hasOperator(String expression) { + return expression.contains("+") || expression.contains("-") || + expression.contains("×") || expression.contains("÷"); + } + + protected String ensureBalancedParentheses(String expression) { + int openCount = 0; + int closeCount = 0; + + for (char c : expression.toCharArray()) { + if (c == '(') openCount++; + if (c == ')') closeCount++; + } + + while (openCount > closeCount) { + expression += ")"; + closeCount++; + } + + return expression; + } + +} -- 2.34.1 From 0c7e5751761d51d9839002d17f4db2354af6947e Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:26:18 +0800 Subject: [PATCH 03/30] ADD file via upload --- src/JuniorQuestionGenerator.java | 122 +++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/JuniorQuestionGenerator.java diff --git a/src/JuniorQuestionGenerator.java b/src/JuniorQuestionGenerator.java new file mode 100644 index 0000000..a72fbe3 --- /dev/null +++ b/src/JuniorQuestionGenerator.java @@ -0,0 +1,122 @@ +public class JuniorQuestionGenerator extends AbstractQuestionGenerator { + private static final String[] OPERATORS = {"+", "-", "×", "÷"}; + private static boolean h = false; + private static StringBuilder q; + + @Override + public String generateQuestion() { + int attempts = 0; + while (attempts < 100) { + attempts++; + + int operandCount = random.nextInt(5) + 1; // 1~5个操作数 + StringBuilder question = new StringBuilder(); + boolean hasSpecialOperator = false; + + AddSpecialOperator(operandCount, hasSpecialOperator, question); + hasSpecialOperator = h; + question = q; + + + String result = addReasonableParentheses(question.toString(), operandCount); + result = ensureBalancedParentheses(result); + + // 检查平方后是否有运算符 + if (!hasProperOperatorSpacing(result)) { + continue; + } + + if (isQuestionUnique(result) && isValidParentheses(result) && + (hasOperator(result) || hasSpecialOperator)) { + addToGeneratedQuestions(result); + String regex = "(?= parts.length) pos = parts.length - 1; + if (random.nextBoolean()) { + parts[pos] = parts[pos] + "²"; + } else { + parts[pos] = "√" + parts[pos]; + } + question = new StringBuilder(String.join(" ", parts)); + hasSpecialOperator = true; + } + h = hasSpecialOperator; + q = question; + } + + private boolean hasProperOperatorSpacing(String expression) { + String[] parts = expression.split(" "); + for (int i = 0; i < parts.length - 1; i++) { + // 如果当前部分是平方或开方,下一部分必须是运算符 + if ((parts[i].endsWith("²") || parts[i].startsWith("√")) && + i + 1 < parts.length && !isOperator(parts[i + 1])) { + return false; + } + // 如果当前部分是数字,下一部分不是运算符,也不合理 + if (parts[i].matches("\\d+") && i + 1 < parts.length && !isOperator(parts[i + 1])) { + return false; + } + } + return true; + } + + private boolean isOperator(String str) { + return str.equals("+") || str.equals("-") || str.equals("×") || str.equals("÷"); + } + + public String addReasonableParentheses(String expression, int operandCount) { + if (operandCount <= 2 || random.nextDouble() < 0.4) { + return expression; + } + + String[] parts = expression.split(" "); + if (parts.length < 5) return expression; + + StringBuilder newExpr = new StringBuilder(); + int start = random.nextInt(Math.max(1, parts.length / 2 - 1)); + int end = start + 1 + random.nextInt(Math.max(1, parts.length / 2 - start - 1)); + + for (int i = 0; i < parts.length; i++) { + if (i == start * 2 && start * 2 < parts.length - 3) { + newExpr.append("( "); + } + newExpr.append(parts[i]); + if (i == end * 2 && i < parts.length - 2 && end * 2 > start * 2 + 2) { + newExpr.append(" )"); + } + if (i < parts.length - 1) { + newExpr.append(" "); + } + } + + return newExpr.toString().trim(); + + } + +} -- 2.34.1 From 69f6214223d73f3b56a3883fc036f04679d03dc0 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:26:28 +0800 Subject: [PATCH 04/30] ADD file via upload --- src/Login.java | 133 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 src/Login.java diff --git a/src/Login.java b/src/Login.java new file mode 100644 index 0000000..9e9b785 --- /dev/null +++ b/src/Login.java @@ -0,0 +1,133 @@ +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class Login { + private static final String USER_FILE = "users.txt"; + private static List users = new ArrayList<>(); + public void Main() { + load(); + Scanner scanner = new Scanner(System.in); + while (true) { + System.out.println("\n---------登录系统---------"); + System.out.println("请输入用户名和密码(用空格隔开): "); + String input = scanner.nextLine().trim(); + if (input.equalsIgnoreCase("q")) { + System.out.println("已退出!"); + break; + } + String[] NandP = input.split(" "); + if (NandP.length != 2) { + System.out.println("请输入正确的用户名、密码"); + continue; + } + String username = NandP[0]; + String password = NandP[1]; + User user = Prove(username, password); + if (user != null) { + Success(user, scanner); + } else { + System.out.println("请输入正确的用户名、密码"); + } + } + scanner.close(); + } + + private static void load() { + users.clear(); + try (BufferedReader reader = new BufferedReader(new FileReader(USER_FILE))) { + String line; + while ((line = reader.readLine()) != null) { + line = line.trim(); + if (!line.isEmpty()) { + String[] parts = line.split(" "); + if (parts.length == 3) { + users.add(new User(parts[0], parts[1], parts[2])); + } + } + } + reader.close(); + System.out.println("Loading..."); + } catch (IOException e) { + System.out.println("出错!" + e.getMessage()); + } + } + + private static User Prove(String username, String password) { + for (User user : users) { + if (user.getUsername().equals(username) && user.getPassword().equals(password)) { + return user; + } + } + return null; + } + + private static void Success(User user, Scanner scanner) { + String role = getRole(user.getRole()); + System.out.println("登录成功!\n" + user.getUsername() + " [" + role + "]"); + QuestionManager questionManager = new QuestionManager(user.getUsername(), user.getRole()); + while (true) { + System.out.println("准备生成[" + questionManager.getCurrentRoleChinese() + "]数学题目,请输入生成题目数量(10~30):"); + System.out.println("输入 -1 退出登录,输入 q 退出程序,输入\"切换为XX\"切换难度(XX为小学、初中、高中)"); + String input = scanner.nextLine().trim(); + if (input.equals("-1")) { + System.out.println("返回登录界面..."); + break; + } else if (input.equalsIgnoreCase("q")) { + System.out.println("已退出!"); + System.exit(0); + } else if (input.startsWith("切换为")) { + Switch(questionManager, input); + } else { + try { + int count = Integer.parseInt(input); + if (count >= 10 && count <= 30) { + questionManager.generateQuestions(count); + } else if (count == -1) { + System.out.println("返回登录界面..."); + break; + } else { + System.out.println("题目数量应在10~30之间"); + } + } catch (NumberFormatException e) { + System.out.println("请输入有效的数字(10~30)或指定命令"); + } + } + } + } + + private static void Switch(QuestionManager questionManager, String input) { + String newRole = input.substring(3).trim(); + switch (newRole) { + case "小学": + questionManager.setRole("primary"); + System.out.println("已切换为小学难度"); + break; + case "初中": + questionManager.setRole("junior"); + System.out.println("已切换为初中难度"); + break; + case "高中": + questionManager.setRole("senior"); + System.out.println("已切换为高中难度"); + break; + default: + System.out.println("请输入小学、初中和高中三个选项中的一个"); + } + } + + private static String getRole(String role) { + switch (role) { + case "primary": + return "小学"; + case "junior": + return "初中"; + case "senior": + return "高中"; + default: + return "未知"; + } + } + +} -- 2.34.1 From 0c511840c311e25bb26891cbb6119214412bbb49 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:26:36 +0800 Subject: [PATCH 05/30] ADD file via upload --- src/PrimaryQuestionGenerator.java | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/PrimaryQuestionGenerator.java diff --git a/src/PrimaryQuestionGenerator.java b/src/PrimaryQuestionGenerator.java new file mode 100644 index 0000000..c177f06 --- /dev/null +++ b/src/PrimaryQuestionGenerator.java @@ -0,0 +1,64 @@ +public class PrimaryQuestionGenerator extends AbstractQuestionGenerator { + private static final String[] OPERATORS = {"+", "-", "×", "÷"}; + + @Override + public String generateQuestion() { + int attempts = 0; + while (attempts < 100) { + attempts++; + int operandCount = random.nextInt(4) + 2; // 2~5个操作数 + StringBuilder question = new StringBuilder(); + + // 生成操作数和运算符 + for (int i = 0; i < operandCount; i++) { + question.append(generateNumber()); + if (i < operandCount - 1) { + question.append(" ").append(generateOperator(OPERATORS)).append(" "); + } + } + // 随机添加括号 + String result = addReasonableParentheses(question.toString(), operandCount); + result = ensureBalancedParentheses(result); // 确保括号平衡 + + if (isQuestionUnique(result) && isValidParentheses(result) && hasOperator(result)) { + addToGeneratedQuestions(result); + String regex = "(?= start * 2 + 2) { + newExpr.append(" )"); + } + if (i < parts.length - 1) { + newExpr.append(" "); + } + } + + return newExpr.toString().trim(); + } + +} -- 2.34.1 From 4ef4cba91236d29c1ca21625b08eb1842754f11f Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:26:46 +0800 Subject: [PATCH 06/30] ADD file via upload --- src/QuestionGenerator.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/QuestionGenerator.java diff --git a/src/QuestionGenerator.java b/src/QuestionGenerator.java new file mode 100644 index 0000000..3e89dad --- /dev/null +++ b/src/QuestionGenerator.java @@ -0,0 +1,6 @@ +public interface QuestionGenerator { + String generateQuestion(); + String normalizeQuestion(String question); + String generateOperator(String[] operators); + boolean isValidParentheses(String expression); +} -- 2.34.1 From 177a9efeae9391f71a2ad5a5fa1b04e660aee9ca Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:26:56 +0800 Subject: [PATCH 07/30] ADD file via upload --- src/QuestionManager.java | 94 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/QuestionManager.java diff --git a/src/QuestionManager.java b/src/QuestionManager.java new file mode 100644 index 0000000..c7490dc --- /dev/null +++ b/src/QuestionManager.java @@ -0,0 +1,94 @@ +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class QuestionManager { + private QuestionGenerator generator; + private String currentRole; + private String username; + private static final String QUESTIONS_DIR = "questions"; + + public QuestionManager(String username, String role) { + this.username = username; + setRole(role); + createQuestionsDirectory(); + } + + public void setRole(String role) { + this.currentRole = role; + switch (role) { + case "primary": + generator = new PrimaryQuestionGenerator(); + break; + case "junior": + generator = new JuniorQuestionGenerator(); + break; + case "senior": + generator = new SeniorQuestionGenerator(); + break; + } + } + + // 创建questions目录 + private void createQuestionsDirectory() { + File questionsDir = new File(QUESTIONS_DIR); + if (!questionsDir.exists()) { + questionsDir.mkdir(); + } + + // 创建用户子目录 + File userDir = new File(questionsDir, username); + if (!userDir.exists()) { + userDir.mkdir(); + } + } + + public void generateQuestions(int count) { + if (count < 10 || count > 30) { + System.out.println("题目数量应在10~30之间"); + return; + } + + // 使用questions目录下的用户文件夹 + File userDir = new File(QUESTIONS_DIR, username); + if (!userDir.exists()) { + userDir.mkdir(); + } + + // 生成文件名 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); + String fileName = sdf.format(new Date()) + ".txt"; + File outputFile = new File(userDir, fileName); + + try (PrintWriter writer = new PrintWriter(new FileWriter(outputFile))) { + for (int i = 1; i <= count; i++) { + String question = generator.generateQuestion(); + writer.println(i + ". " + question); + if (i < count) { + writer.println(); // 题目之间空一行 + } + } + System.out.println("题目已生成到: " + outputFile.getPath()); + } catch (IOException e) { + System.out.println("生成题目时出错: " + e.getMessage()); + } + } + + public String getCurrentRoleChinese() { + switch (currentRole) { + case "primary": return "小学"; + case "junior": return "初中"; + case "senior": return "高中"; + default: return "未知"; + } + } + + // 获取指定用户的所有题目文件(用于查重功能) + public static File[] getUserQuestionFiles(String username) { + File userDir = new File(QUESTIONS_DIR, username); + if (userDir.exists() && userDir.isDirectory()) { + return userDir.listFiles((dir, name) -> name.endsWith(".txt")); + } + return new File[0]; + } +} -- 2.34.1 From 7fb667e8b6901d1492598071fdad5d78c3957a05 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:27:03 +0800 Subject: [PATCH 08/30] ADD file via upload --- src/SeniorQuestionGenerator.java | 163 +++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 src/SeniorQuestionGenerator.java diff --git a/src/SeniorQuestionGenerator.java b/src/SeniorQuestionGenerator.java new file mode 100644 index 0000000..7489673 --- /dev/null +++ b/src/SeniorQuestionGenerator.java @@ -0,0 +1,163 @@ +public class SeniorQuestionGenerator extends AbstractQuestionGenerator{ + private static final String[] OPERATORS = {"+", "-", "×", "÷"}; + private static boolean h = false; + private static StringBuilder q; + + @Override + public String generateQuestion() { + int attempts = 0; + while (attempts < 100) { + attempts++; + + int operandCount = random.nextInt(5) + 1; // 1~5个操作数 + StringBuilder question = new StringBuilder(); + boolean hasTrigOperator = false; + + AddTrigOperator(operandCount, hasTrigOperator, question); + hasTrigOperator = h; + question = q; + ForceAddTrigOperator(hasTrigOperator, question); + hasTrigOperator = h; + question = q; + + String result = addReasonableParentheses(question.toString(), operandCount); + result = ensureBalancedParentheses(result); + result = Revise(result); + + + if (isQuestionUnique(result) && isValidParentheses(result) && + (hasOperator(result) || hasTrigOperator)) { + addToGeneratedQuestions(result); + String regex = "(? start * 2 + 2) { + newExpr.append(" )"); + } + if (i < parts.length - 1) { + newExpr.append(" "); + } + } + + return newExpr.toString().trim(); + } + + private String Revise(String expression) { + + if(!expression.contains("(")) { + return expression; + } + + String[] parts = expression.split(" "); + int count = 0; + while(count < 2) { + count++; + for (int i = 1; i < parts.length - 1; i++) { + if (parts[i].equals("(") && (parts[i+1].equals("+") || parts[i+1].equals("-") || parts[i+1].equals("×") || parts[i+1].equals("÷"))) { + String t = parts[i]; + parts[i] = parts[i+1]; + parts[i+1] = t; + } + if (parts[i].equals(")") && (parts[i-1].equals("+") || parts[i-1].equals("-") || parts[i-1].equals("×") || parts[i-1].equals("÷") + || parts[i-1].equals("cos") || parts[i-1].equals("sin") || parts[i-1].equals("tan") || parts[i-1].equals("sincos") || parts[i-1].equals("sintan") + || parts[i-1].equals("cossin") || parts[i-1].equals("costan") || parts[i-1].equals("tansin") || parts[i-1].equals("tancos"))) { + String t = parts[i]; + parts[i] = parts[i-1]; + parts[i-1] = t; + } + + } + } + StringBuilder result = new StringBuilder(); + for (int i = 0; i < parts.length; i++) { + if (!parts[i].isEmpty()) { + result.append(parts[i]).append(" "); + } + } + return result.toString(); + + } + + + private void AddTrigOperator(int operandCount, boolean hasTrigOperator, StringBuilder question) { + for (int i = 0; i < operandCount; i++) { + // 决定是否添加三角函数 + if (!hasTrigOperator && random.nextDouble() < 0.4) { + String trigOp = generateOperator(new String[]{"sin", "cos", "tan"}); + int angle = random.nextInt(101); + + // 随机决定是否嵌套三角函数(30%概率) + if (random.nextDouble() < 0.3) { + String nestedTrig = generateOperator(new String[]{"sin", "cos", "tan"}); + while (nestedTrig.equals(trigOp)) { + nestedTrig = generateOperator(new String[]{"sin", "cos", "tan"}); + } + question.append(trigOp).append(nestedTrig).append(" ").append(angle).append("°"); + } else { + question.append(trigOp).append(" ").append(angle).append("°"); + } + hasTrigOperator = true; + } else { + question.append(generateNumber()); + } + + if (i < operandCount - 1) { + String operator = generateOperator(OPERATORS); + question.append(" ").append(operator).append(" "); + } + } + h = hasTrigOperator; + q = question; + } + + private void ForceAddTrigOperator(boolean hasTrigOperator, StringBuilder question) { + // 如果还没有三角函数,强制添加一个 + if (!hasTrigOperator) { + String[] parts = question.toString().split(" "); + int pos = random.nextInt(parts.length / 2 + 1) * 2; + if (pos >= parts.length) pos = parts.length - 1; + + String trigOp = generateOperator(new String[]{"sin", "cos", "tan"}); + int angle = random.nextInt(101); + + // 随机决定是否嵌套 + if (random.nextDouble() < 0.3) { + String nestedTrig = generateOperator(new String[]{"sin", "cos", "tan"}); + while (nestedTrig.equals(trigOp)) { + nestedTrig = generateOperator(new String[]{"sin", "cos", "tan"}); + } + parts[pos] = trigOp + nestedTrig + " " + angle + "°"; + } else { + parts[pos] = trigOp + " " + angle + "°"; + } + question = new StringBuilder(String.join(" ", parts)); + hasTrigOperator = true; + } + h = hasTrigOperator; + q = question; + } + +} -- 2.34.1 From 6df81e2d30c19dca7d84bd00f124d01dbe1b85a9 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:27:11 +0800 Subject: [PATCH 09/30] ADD file via upload --- src/Start.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/Start.java diff --git a/src/Start.java b/src/Start.java new file mode 100644 index 0000000..6af142e --- /dev/null +++ b/src/Start.java @@ -0,0 +1,7 @@ +public class Start { + + public static void main(String[] args) { + Login login = new Login(); + login.Main(); + } +} -- 2.34.1 From 81625b65848d66a956223492f02c376f32d4745b Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:27:22 +0800 Subject: [PATCH 10/30] ADD file via upload --- src/User.java | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/User.java diff --git a/src/User.java b/src/User.java new file mode 100644 index 0000000..9ea6bad --- /dev/null +++ b/src/User.java @@ -0,0 +1,28 @@ +public class User { + private String username; + private String password; + private String role; + + public User(String username, String password, String role) { + this.username = username; + this.password = password; + this.role = role; + } + + public String getUsername() { + return username; + } + + public String getPassword() { + return password; + } + + public String getRole() { + return role; + } + + @Override + public String toString() { + return username + " " + password + " " + role; + } +} -- 2.34.1 From 6869a28e8357bb3f201c585df747d2ef27f64efc Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 20:28:04 +0800 Subject: [PATCH 11/30] ADD file via upload --- doc | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc diff --git a/doc b/doc new file mode 100644 index 0000000..e69de29 -- 2.34.1 From 1ee1e55e2d0ff1557332d48c1c8f4546371ab111 Mon Sep 17 00:00:00 2001 From: psoyzuart Date: Sun, 28 Sep 2025 20:32:23 +0800 Subject: [PATCH 12/30] Delete 'doc' --- doc | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc diff --git a/doc b/doc deleted file mode 100644 index e69de29..0000000 -- 2.34.1 From 9d9f624e36410e7fc86e2d68cf97f127875cf0b0 Mon Sep 17 00:00:00 2001 From: psoyzuart Date: Sun, 28 Sep 2025 20:36:02 +0800 Subject: [PATCH 13/30] Delete 'README.md' --- README.md | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 8f8370e..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# individual - -- 2.34.1 From 4df8380a2c803bfc747f11dbc71452d5109a46de Mon Sep 17 00:00:00 2001 From: psoyzuart Date: Sun, 28 Sep 2025 21:02:20 +0800 Subject: [PATCH 14/30] Delete 'src/Login.java' --- src/Login.java | 133 ------------------------------------------------- 1 file changed, 133 deletions(-) delete mode 100644 src/Login.java diff --git a/src/Login.java b/src/Login.java deleted file mode 100644 index 9e9b785..0000000 --- a/src/Login.java +++ /dev/null @@ -1,133 +0,0 @@ -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; - -public class Login { - private static final String USER_FILE = "users.txt"; - private static List users = new ArrayList<>(); - public void Main() { - load(); - Scanner scanner = new Scanner(System.in); - while (true) { - System.out.println("\n---------登录系统---------"); - System.out.println("请输入用户名和密码(用空格隔开): "); - String input = scanner.nextLine().trim(); - if (input.equalsIgnoreCase("q")) { - System.out.println("已退出!"); - break; - } - String[] NandP = input.split(" "); - if (NandP.length != 2) { - System.out.println("请输入正确的用户名、密码"); - continue; - } - String username = NandP[0]; - String password = NandP[1]; - User user = Prove(username, password); - if (user != null) { - Success(user, scanner); - } else { - System.out.println("请输入正确的用户名、密码"); - } - } - scanner.close(); - } - - private static void load() { - users.clear(); - try (BufferedReader reader = new BufferedReader(new FileReader(USER_FILE))) { - String line; - while ((line = reader.readLine()) != null) { - line = line.trim(); - if (!line.isEmpty()) { - String[] parts = line.split(" "); - if (parts.length == 3) { - users.add(new User(parts[0], parts[1], parts[2])); - } - } - } - reader.close(); - System.out.println("Loading..."); - } catch (IOException e) { - System.out.println("出错!" + e.getMessage()); - } - } - - private static User Prove(String username, String password) { - for (User user : users) { - if (user.getUsername().equals(username) && user.getPassword().equals(password)) { - return user; - } - } - return null; - } - - private static void Success(User user, Scanner scanner) { - String role = getRole(user.getRole()); - System.out.println("登录成功!\n" + user.getUsername() + " [" + role + "]"); - QuestionManager questionManager = new QuestionManager(user.getUsername(), user.getRole()); - while (true) { - System.out.println("准备生成[" + questionManager.getCurrentRoleChinese() + "]数学题目,请输入生成题目数量(10~30):"); - System.out.println("输入 -1 退出登录,输入 q 退出程序,输入\"切换为XX\"切换难度(XX为小学、初中、高中)"); - String input = scanner.nextLine().trim(); - if (input.equals("-1")) { - System.out.println("返回登录界面..."); - break; - } else if (input.equalsIgnoreCase("q")) { - System.out.println("已退出!"); - System.exit(0); - } else if (input.startsWith("切换为")) { - Switch(questionManager, input); - } else { - try { - int count = Integer.parseInt(input); - if (count >= 10 && count <= 30) { - questionManager.generateQuestions(count); - } else if (count == -1) { - System.out.println("返回登录界面..."); - break; - } else { - System.out.println("题目数量应在10~30之间"); - } - } catch (NumberFormatException e) { - System.out.println("请输入有效的数字(10~30)或指定命令"); - } - } - } - } - - private static void Switch(QuestionManager questionManager, String input) { - String newRole = input.substring(3).trim(); - switch (newRole) { - case "小学": - questionManager.setRole("primary"); - System.out.println("已切换为小学难度"); - break; - case "初中": - questionManager.setRole("junior"); - System.out.println("已切换为初中难度"); - break; - case "高中": - questionManager.setRole("senior"); - System.out.println("已切换为高中难度"); - break; - default: - System.out.println("请输入小学、初中和高中三个选项中的一个"); - } - } - - private static String getRole(String role) { - switch (role) { - case "primary": - return "小学"; - case "junior": - return "初中"; - case "senior": - return "高中"; - default: - return "未知"; - } - } - -} -- 2.34.1 From bfc10a2b47a8cd685fa544843ea5eb5cf7d97d7d Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 21:02:32 +0800 Subject: [PATCH 15/30] ADD file via upload --- src/Login.java | 133 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 src/Login.java diff --git a/src/Login.java b/src/Login.java new file mode 100644 index 0000000..54dd768 --- /dev/null +++ b/src/Login.java @@ -0,0 +1,133 @@ +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class Login { + private static final String USER_FILE = "users.txt"; + private static List users = new ArrayList<>(); + public void Main() { + load(); + Scanner scanner = new Scanner(System.in); + while (true) { + System.out.println("\n---------登录系统---------"); + System.out.println("请输入用户名和密码(用空格隔开): "); + String input = scanner.nextLine().trim(); + if (input.equalsIgnoreCase("q")) { + System.out.println("\n已退出!"); + break; + } + String[] NandP = input.split(" "); + if (NandP.length != 2) { + System.out.println("请输入正确的用户名和密码!"); + continue; + } + String username = NandP[0]; + String password = NandP[1]; + User user = Prove(username, password); + if (user != null) { + Success(user, scanner); + } else { + System.out.println("请输入正确的用户名和密码!"); + } + } + scanner.close(); + } + + private static void load() { + users.clear(); + try (BufferedReader reader = new BufferedReader(new FileReader(USER_FILE))) { + String line; + while ((line = reader.readLine()) != null) { + line = line.trim(); + if (!line.isEmpty()) { + String[] parts = line.split(" "); + if (parts.length == 3) { + users.add(new User(parts[0], parts[1], parts[2])); + } + } + } + reader.close(); + System.out.println("Loading..."); + } catch (IOException e) { + System.out.println("出错!" + e.getMessage()); + } + } + + private static User Prove(String username, String password) { + for (User user : users) { + if (user.getUsername().equals(username) && user.getPassword().equals(password)) { + return user; + } + } + return null; + } + + private static void Success(User user, Scanner scanner) { + String role = getRole(user.getRole()); + System.out.println("\n登录成功!\n" + user.getUsername() + " [" + role + "]"); + QuestionManager questionManager = new QuestionManager(user.getUsername(), user.getRole()); + while (true) { + System.out.println("\n输入 -1 退出登录,输入 q 退出程序,输入\"切换为XX\"切换难度(XX为小学、初中、高中)"); + System.out.println("准备生成[" + questionManager.getCurrentRoleChinese() + "]数学题目,请输入生成题目数量(10~30):"); + String input = scanner.nextLine().trim(); + if (input.equals("-1")) { + System.out.println("返回登录界面..."); + break; + } else if (input.equalsIgnoreCase("q")) { + System.out.println("\n已退出!"); + System.exit(0); + } else if (input.startsWith("切换为")) { + Switch(questionManager, input); + } else { + try { + int count = Integer.parseInt(input); + if (count >= 10 && count <= 30) { + questionManager.generateQuestions(count); + } else if (count == -1) { + System.out.println("返回登录界面..."); + break; + } else { + System.out.println("题目数量应在10~30之间!"); + } + } catch (NumberFormatException e) { + System.out.println("请输入有效的数字(10~30)或指定命令!"); + } + } + } + } + + private static void Switch(QuestionManager questionManager, String input) { + String newRole = input.substring(3).trim(); + switch (newRole) { + case "小学": + questionManager.setRole("primary"); + System.out.println("已切换为小学难度"); + break; + case "初中": + questionManager.setRole("junior"); + System.out.println("已切换为初中难度"); + break; + case "高中": + questionManager.setRole("senior"); + System.out.println("已切换为高中难度"); + break; + default: + System.out.println("请输入小学、初中和高中三个选项中的一个"); + } + } + + private static String getRole(String role) { + switch (role) { + case "primary": + return "小学"; + case "junior": + return "初中"; + case "senior": + return "高中"; + default: + return "未知"; + } + } + +} -- 2.34.1 From a5c29bbcdd472e2ea3989538eecf8ef33ce20d57 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 22:10:16 +0800 Subject: [PATCH 16/30] ADD file via upload --- src/main.jar | Bin 0 -> 19132 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main.jar diff --git a/src/main.jar b/src/main.jar new file mode 100644 index 0000000000000000000000000000000000000000..f1de3375ad2a11cb01169eb9bbf838585b733fbc GIT binary patch literal 19132 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≪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 wH)^C Date: Sun, 28 Sep 2025 22:10:28 +0800 Subject: [PATCH 17/30] Delete 'src/Login.java' --- src/Login.java | 133 ------------------------------------------------- 1 file changed, 133 deletions(-) delete mode 100644 src/Login.java diff --git a/src/Login.java b/src/Login.java deleted file mode 100644 index 54dd768..0000000 --- a/src/Login.java +++ /dev/null @@ -1,133 +0,0 @@ -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; - -public class Login { - private static final String USER_FILE = "users.txt"; - private static List users = new ArrayList<>(); - public void Main() { - load(); - Scanner scanner = new Scanner(System.in); - while (true) { - System.out.println("\n---------登录系统---------"); - System.out.println("请输入用户名和密码(用空格隔开): "); - String input = scanner.nextLine().trim(); - if (input.equalsIgnoreCase("q")) { - System.out.println("\n已退出!"); - break; - } - String[] NandP = input.split(" "); - if (NandP.length != 2) { - System.out.println("请输入正确的用户名和密码!"); - continue; - } - String username = NandP[0]; - String password = NandP[1]; - User user = Prove(username, password); - if (user != null) { - Success(user, scanner); - } else { - System.out.println("请输入正确的用户名和密码!"); - } - } - scanner.close(); - } - - private static void load() { - users.clear(); - try (BufferedReader reader = new BufferedReader(new FileReader(USER_FILE))) { - String line; - while ((line = reader.readLine()) != null) { - line = line.trim(); - if (!line.isEmpty()) { - String[] parts = line.split(" "); - if (parts.length == 3) { - users.add(new User(parts[0], parts[1], parts[2])); - } - } - } - reader.close(); - System.out.println("Loading..."); - } catch (IOException e) { - System.out.println("出错!" + e.getMessage()); - } - } - - private static User Prove(String username, String password) { - for (User user : users) { - if (user.getUsername().equals(username) && user.getPassword().equals(password)) { - return user; - } - } - return null; - } - - private static void Success(User user, Scanner scanner) { - String role = getRole(user.getRole()); - System.out.println("\n登录成功!\n" + user.getUsername() + " [" + role + "]"); - QuestionManager questionManager = new QuestionManager(user.getUsername(), user.getRole()); - while (true) { - System.out.println("\n输入 -1 退出登录,输入 q 退出程序,输入\"切换为XX\"切换难度(XX为小学、初中、高中)"); - System.out.println("准备生成[" + questionManager.getCurrentRoleChinese() + "]数学题目,请输入生成题目数量(10~30):"); - String input = scanner.nextLine().trim(); - if (input.equals("-1")) { - System.out.println("返回登录界面..."); - break; - } else if (input.equalsIgnoreCase("q")) { - System.out.println("\n已退出!"); - System.exit(0); - } else if (input.startsWith("切换为")) { - Switch(questionManager, input); - } else { - try { - int count = Integer.parseInt(input); - if (count >= 10 && count <= 30) { - questionManager.generateQuestions(count); - } else if (count == -1) { - System.out.println("返回登录界面..."); - break; - } else { - System.out.println("题目数量应在10~30之间!"); - } - } catch (NumberFormatException e) { - System.out.println("请输入有效的数字(10~30)或指定命令!"); - } - } - } - } - - private static void Switch(QuestionManager questionManager, String input) { - String newRole = input.substring(3).trim(); - switch (newRole) { - case "小学": - questionManager.setRole("primary"); - System.out.println("已切换为小学难度"); - break; - case "初中": - questionManager.setRole("junior"); - System.out.println("已切换为初中难度"); - break; - case "高中": - questionManager.setRole("senior"); - System.out.println("已切换为高中难度"); - break; - default: - System.out.println("请输入小学、初中和高中三个选项中的一个"); - } - } - - private static String getRole(String role) { - switch (role) { - case "primary": - return "小学"; - case "junior": - return "初中"; - case "senior": - return "高中"; - default: - return "未知"; - } - } - -} -- 2.34.1 From 2548d4c757b21b35afe959c043c30c667976c548 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 22:10:40 +0800 Subject: [PATCH 18/30] ADD file via upload --- src/Login.java | 158 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 src/Login.java diff --git a/src/Login.java b/src/Login.java new file mode 100644 index 0000000..0936322 --- /dev/null +++ b/src/Login.java @@ -0,0 +1,158 @@ +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class Login { + private static final String USER_FILE = "users.txt"; + private static List users = new ArrayList<>(); + public void Main() { + initializeUserFile(); + load(); + Scanner scanner = new Scanner(System.in); + while (true) { + System.out.println("\n---------登录系统---------"); + System.out.println("请输入用户名和密码(用空格隔开): "); + String input = scanner.nextLine().trim(); + if (input.equalsIgnoreCase("q")) { + System.out.println("\n已退出!"); + break; + } + String[] NandP = input.split(" "); + if (NandP.length != 2) { + System.out.println("请输入正确的用户名和密码!"); + continue; + } + String username = NandP[0]; + String password = NandP[1]; + User user = Prove(username, password); + if (user != null) { + Success(user, scanner); + } else { + System.out.println("请输入正确的用户名和密码!"); + } + } + scanner.close(); + } + + + private static void initializeUserFile() { + File file = new File(USER_FILE); + if (!file.exists()) { + try (PrintWriter writer = new PrintWriter(new FileWriter(file))) { + + writer.println("张三1 123 primary\r\n" + + "张三2 123 primary\r\n" + + "张三3 123 primary\r\n" + + "李四1 123 junior\r\n" + + "李四2 123 junior\r\n" + + "李四3 123 junior\r\n" + + "王五1 123 senior\r\n" + + "王五2 123 senior\r\n" + + "王五3 123 senior"); + writer.close(); + System.out.println("已创建users.txt"); + } catch (IOException e) { + System.out.println("创建用户文件失败: " + e.getMessage()); + } + } + } + + + private static void load() { + users.clear(); + try (BufferedReader reader = new BufferedReader(new FileReader(USER_FILE))) { + String line; + while ((line = reader.readLine()) != null) { + line = line.trim(); + if (!line.isEmpty()) { + String[] parts = line.split(" "); + if (parts.length == 3) { + users.add(new User(parts[0], parts[1], parts[2])); + } + } + } + reader.close(); + System.out.println("Loading..."); + } catch (IOException e) { + System.out.println("出错!" + e.getMessage()); + } + } + + private static User Prove(String username, String password) { + for (User user : users) { + if (user.getUsername().equals(username) && user.getPassword().equals(password)) { + return user; + } + } + return null; + } + + private static void Success(User user, Scanner scanner) { + String role = getRole(user.getRole()); + System.out.println("\n登录成功!\n" + user.getUsername() + " [" + role + "]"); + QuestionManager questionManager = new QuestionManager(user.getUsername(), user.getRole()); + while (true) { + System.out.println("\n输入 -1 退出登录,输入 q 退出程序,输入\"切换为XX\"切换难度(XX为小学、初中、高中)"); + System.out.println("准备生成[" + questionManager.getCurrentRoleChinese() + "]数学题目,请输入生成题目数量(10~30):"); + String input = scanner.nextLine().trim(); + if (input.equals("-1")) { + System.out.println("返回登录界面..."); + break; + } else if (input.equalsIgnoreCase("q")) { + System.out.println("\n已退出!"); + System.exit(0); + } else if (input.startsWith("切换为")) { + Switch(questionManager, input); + } else { + try { + int count = Integer.parseInt(input); + if (count >= 10 && count <= 30) { + questionManager.generateQuestions(count); + } else if (count == -1) { + System.out.println("返回登录界面..."); + break; + } else { + System.out.println("题目数量应在10~30之间!"); + } + } catch (NumberFormatException e) { + System.out.println("请输入有效的数字(10~30)或指定命令!"); + } + } + } + } + + private static void Switch(QuestionManager questionManager, String input) { + String newRole = input.substring(3).trim(); + switch (newRole) { + case "小学": + questionManager.setRole("primary"); + System.out.println("已切换为小学难度"); + break; + case "初中": + questionManager.setRole("junior"); + System.out.println("已切换为初中难度"); + break; + case "高中": + questionManager.setRole("senior"); + System.out.println("已切换为高中难度"); + break; + default: + System.out.println("请输入小学、初中和高中三个选项中的一个"); + } + } + + private static String getRole(String role) { + switch (role) { + case "primary": + return "小学"; + case "junior": + return "初中"; + case "senior": + return "高中"; + default: + return "未知"; + } + } + +} -- 2.34.1 From d9bd77272af7ad7dda2872c8d0252ca48160558d Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 28 Sep 2025 22:15:51 +0800 Subject: [PATCH 19/30] Delete 'src/users.txt' --- src/users.txt | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 src/users.txt diff --git a/src/users.txt b/src/users.txt deleted file mode 100644 index 3a21863..0000000 --- a/src/users.txt +++ /dev/null @@ -1,9 +0,0 @@ -张三1 123 primary -张三2 123 primary -张三3 123 primary -李四1 123 junior -李四2 123 junior -李四3 123 junior -王五1 123 senior -王五2 123 senior -王五3 123 senior -- 2.34.1 From ae9ded3e68bbfdb93298f424dfd24c361f6bab20 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Mon, 29 Sep 2025 17:46:17 +0800 Subject: [PATCH 20/30] Delete 'src/main.jar' --- src/main.jar | Bin 19132 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main.jar diff --git a/src/main.jar b/src/main.jar deleted file mode 100644 index f1de3375ad2a11cb01169eb9bbf838585b733fbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19132 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≪V#;fZ7E2u#jsWwT00(=9nKcKSvs`a^lWr!@e$G42 zO2LC=oR4d&Ma}_1gfS7<0`cXjr1sGNd zjaV4A8eDb@lXg}fYc_-33=1|f&{w{Blx^(zGm3Hfs9YTp;Ei@ksN(G~>WZZep$`H@ zEx@a{i>XE?VnW>cRnXJX5hdrD+{B$#duHJ!*Qd9@Qv0H0uv%LHrbF7IuFx-9ZcKv= zn`Afbg|$_zjFM?8E*xcaJ@x*AE+@l*3no>gLFuMF!ftC?QJ zg8#%+v*hZxJipyDgN3__JN#k}yXNQ>cXH3n=EC??y&mlc%QWmB9oMKq5}Z@mkLWOE zbFd%IQ*cNKzc3-!z6mjA_b8mGO{+~aDRq;g5b7S`+Ur9=F$~mRTQ!UsJ ziF#!kEZ`I$Tyz%iH)Fc0Lb`1&NOX!4x{7EY@j%SYI>TxPi-$JF0%x0>GrjzL5Zj%4 z2(@@b@iD7UET0$~bBs=Vwe{8SQ4k%=U_ZrFH|L}C_{mVelgN!V00y;9Muh+J^PT10Gm1RTo^at7IfB6l^~81Po}<)mY+C{ zmY?Ocd>FR%ToG%HO&3i^;94}BYslM6YC$FxDI(BYZn-Sv`^zd5Ae0FyzI+veSUD#j zk?817j2dYgAa*3O2+)fw+l&y@B7=O9UDi%#M5SJe3sX%jp+cgU|~sS0LCi7=?z``Yh*#k@&O|_ zae`2u&y>03Y+g6j@zX@f~V zLh%oft~4Ow%}bIe$Z?b<6tBQ7tHj~1m?Q*%04NYQR9Kmyq}s^t2;!6>yOe1P_FjB` zy>)B#gs^KFyilXO1?St4=e8mrdW7Z=gXCfO=y zT)~Qo=#rlI7tdosyGy?^VWt)pak@abF%dZ@vY?_YDp_^Um7u~otzZ=amNV=VoM* zeMPMc`Cb9m)0U`aUw|&3>w;C0P84#f4J@V(agym`D_J zF5hBWh)wYITvA)LAHm1q@26-!}Yxp z{430_$kSgY{L?1d_)n<+pZmNC|2@qASA3T zc5$(PKue{#qK#-QC1sQ`k_mSMNX*sDhE}M4Qkh(_-J-S55nUO(y2x@y(F&PxaW8qT z+>(#CTzygLTypu}$G7Fay{iG|)}Klmmc0|-GoCZPvz|SUwZBU)XamY$GGQV^s(j~5 z9+!O;e;76}SBT5-q1CH}TE$pQNoB^@D{s_gzN{NcO+}96YbR0?HjBX6MA$^aLNe7% zY64sh`*el1RhAiB3OcEd*GN69kpEcAi6FEo0?=YD#TDTk`TdU4)LOG?IBM$se9cbC zUuc8}BPzjXxK{{PbS2Mjy07$zk#l683he2V?*wlwM~WpL{*aPtg!pFRNZnCp{FXva za(?`yOhlw3M6GMzcB8@wrVr&T+B`FhFXE@4n~+;(*fq~wIx(-Rf+I-Sq|6baHh!MK zn22a~SsW-nvtGkKsszba`NO?3FSds-%dX?r#p*{Zc>No(+B6s(%H@nQA+*!w{&$Sm z@ZmpoRU!HZNc(DRD>QzcJoPR`!F6}>VDE9n=x9{b;t-KddV5T)18d&H6R$1Z428@H z^0dx|-|Hc8d1%CVHvt81O%zj_Pn6+j9*4zRF0FB$&5bZU9D+SCbT-R@iC>t zp*F2fA?X9dC6#O|Wo_1MwnQ{XNKjEH$@tV-wVznuCl!bbuTiViVAb~(f(3f<8Avc? zcE&}@gW61q$d->6VVIT3(N!1qv5B<~IkGD5a8lq~;6o zpBe7mYn-O@Hx@jNrdoU=7&x2oxQ~0v4wW#mQhIJz1vg+mK!AZ({WdI$A!iP69a`R; zNz&#+e6gXq82pofq$r1xVV}(XR$tN8HGW2;-CRbANEs!%Z7CWWqdsI*8<*A9FIwYL z42I9NRW=Y0G`wJIm6Tu-%txu6$ARsDfJIkA7^6qK_j|J}kt0jhrP{s?o)MBMmqQ&Z z9zO{QD{@R-gaeF7T&qW97?Z$b7=ZsvmdAvPm;+P}^Q|M}8?=?&{78l?KTP333QM8k z<#x0bnm@KY1Cqo=Oj!LUBSP}6M)25bFfR4=xTC=}-17=8F`xAC+Y8J9achz;ORG4m z7M~Llnb<(}j!ejxO72H77U0H@nIv8Xi-)I zE*DEq@K8Dc{6R#_ut^jhlO>pQrcD?eaP136&NwP$q;| zLyM9@QDI_jMxM}7oc=O{WJ2av-iMYCgjh^qJD$0p6>>x7>d%7A8`UG7)9rUU=NC%z z(GHKOFUhoaI1kQaI!uemMW-4dvHWc1PkEXtXR{uXp(EzqRPfceRB!zLf@IqB7)Y&r zvlFtLG7nJ3a&ddq+pUEa3ne4L*=&c3bm*5_8Z^R0EXLT@9oj59BK*oL3U?}44#|PY zJm-Tuh3qrCl(S6LYA~`&*0++J%**&X+;xtz*iT4xIaP`kblCXATleVpH<0mQ^23;C zPnKwCReJ_gHFWvs05=T(LFz=%9Qv=QJIRq(8Tzj<#!-dHzMJTF_`HtJTfx1)I%cM4 z9d#>T0KYi=*vHGu69Mm}7KeYlz~mc9{HfBGx|UMexAh|sZ@`d`Y`>tfW@^g*eEORk{%r8lF;JE)9q_&Vv1@_P*T^iooB zFh*(Za{wlcnXof3=sNIDA}za>t3K4*zATWd865)Bhm2<|!6ejUfDftno$+agj+mOS zAx!eKF~;YhRzvXol=( z1~4Q%7p%Uu5&89{&#Sr@8=Br&fwHurGp*mbl0C4C{F2s4;Va$bn`IZ6EH>Aq6#O|a zNaKM>i??Js1AA2{z(Thd3U?j+)2gE{^#-|xmEcgUIJ(`^((?3#0NEnqi?QB^Poh7x zwx~~A|4O-|sicNDJZa*1-)dfsNjKgfQe$6JO&_Cx8WkB5%YsEq2oVIv!W7?jYyuDc zMk@;Ca0m4zWB0k8q8$%+C=+;JWi(}^#r-R8D}&bL-A?u(`4Oj)%D%if5tEVYO)dGr zAF6VR**q`E8L2hz0~4Db5F5Ys-e~0hQq;J6bSeJ$QKa93Xvi0q%LfT;Hesw*$dOr> zS}JKKUnzSNs5mjyIRO(c{l-cgtip@^BwMFO4a7PaQ|2d<5@WWE6Axxi(GSBX@o3g#MY1qt6NR zsYKb@MXEycmdyJIO=Q zZlod835Cq$3{!_;zXNUf^$L@IRL2v^pcwDc5sM-taANxewr_R=^`;e%L8&>Kqea;_ z*hZzZ9;2M|@Khd)Gd5ico)|^8gr;umjv3}=o|fZ6&{#*Dx6Z> z1MKQrAjM6&PCHB?I?i@Q^2N5XYTZM~&eL|&L_t{gPBrW7DO>9kV0ku7zOO4nQSO^{ zq|1|UM5%+;y;e%<$jOr9e<20hEXlwGj?U+5&lqaY>TA!s(dGVv1&j$e4ilq6`E`W) zd;W#_7uLH8+h5N62j@v3|8H3DzsZ7BT#cMv|5FxZr!XZyB#6oSIpG8$Th z@>p_u#B%hJQmIFk-gYwXJx78oUF(Sxvs`3kUl*EcnJswb;sxs}+c@Q;K@mnVba*}{ zRF=RzSxB4zUMP?G3NVsz=BE#hSD)18ji#cvwY^om83Hpgf71iF{Enm!o%Y`8i@xr6 zKO#n1l!(X*+X3>~4EJ*owbeIoDSwVf6=7Q|#-WeFMf)zvNF9Dsx9sk_cQ0gfgyzQo zP&=29KS6>+gdi!Rlps_zCOSc;#Dn33 zdCqGPp|xG~ih8x)_5giRs}-GE12bWZrC908rdqeQO|8xAh`n|8&ueey1Zj-Fe_*E1 z9N+7<%g*iOGda{3 z&n$7;?iF;(siiAc+^SU9EWWgxr*hc9%3+PORs^q=ixS!D^2$t}pzpTCrYC+9563?6 zoh%FOvL#wYU6pR}fwiOvEF#omVKJ;pG*$EAnMaP0#tO>70Z%mOAZT*P7%XM&s;ypE z%8-b1wb~+3BCI$otf|jWcAQGJkJFAzr6Qg9`URD;9E%YC@-@>tmd!mGe#}A2El2gU zpqd&kw#iMl#n=mKX(n#KLMFAfqWq4ha6H|v(PGI;@-SZr_q1vOlq_Y!0{qURPfSXb z_cSu*)=_S*o*ml}xL>~ZcqF}oIXQNTdUDV!RLoQq`m@7^aY@X&v`9Rb>4t4ka{bMO z2q%n-sWHFcfKAv|wH}Hv$ZT4*3mA2ndT;HGH|irQD;!C~S#H$3W!ikXEVHYv+;!#8 z)DDa)Er9sfNDIa*S#B=94L$rJFSEakXqs;ychs7&R0InPcna#E1j!RljW z$_BP*H_-9R3AOq@@Gmwq(j)Ko1?w_f2}Ao|IAAsC4|;~BQSvp!_Ugnd6Efs00^<;HmQn#`=MXl; z)B4ucj-=yiejn_`WJYe6v)W4+C*$s}Q$}`nWAI?L^|ymO$IUeR0t)yqbM0KLnmafqmcqCPF8Usg}4lmm5dKc6EN92GCX*_K04uf zuAiwvdeC(wYLB^)herVS-s{yNIBI^P3Eas9FQc4+_}LeqdVnJ~vn$6< z+S3t@CG{T$rTDUUNVi~Ff^C7k~=H3z2R3a zXQ$ymPTo7817=qUYG057JF_mSth*rU#Y2JF9A0H^~xtu*hH$Rn8`3Gmn zm8RRSq@jE7{CFE@0hNbb7Z#aT9$9`99U4&R(VO`xMiZis+5E|s<}qMB91$31oue&; z`bA$OmoHsM8XabSR|^oFzH&vz+Il(o>jUq%oVW7po$myk7Qs_9e*x@5-@d8+o<+X3 z{Ys*#zQYdxx(rYTc=fIJ^DQKJbt$B15!Te%o{9Co(M*jUDBdnXsmU0nQ8d zv%L>(UI~2O%XAF-FJClnJ8n~T>isS>KTd4o`}`mC&P|a})k5@_AC#?{BNSwG+s&d; zea#gD6r8Axkq7-f)R1>nUgV6hqu=-D6!LxNABkTlD0s|@Iq8EYx%Osp)0Ic}z`k&Y zH$rdt4UKn|z~zrDGQ%&-u-nFL>T4 zcD~r|1ZTJ-_XR(ELRxRNx+(p=7dLQv1cDd)T50AHWhE?{WMZx132R=R;f;AE5I14v z{9Ps~g?%O}bG+8+!^EPDY%gVUkDoKBq~ocDjklnvN18Gkx}d}=K*jursD^%MQ<5>Z z&TZlUY|`ZBewQZygqd^lWgNUs6qY-dOL5xBgeo;o=5U>ok-(6w)YwtPpZ>?odHU%_ z_6x$COD>j+Xe#vnyL)ueu1nkV3vN0#8HtBKtYWKB`}T>y<&omQ$e4*6Oogi!bXoQZ zOyZ20dqVbV#-mqCO*^_K`T98WPfiG~6HR*{k!$OEH~q(9k3)OrH3%QzIrFqaW_q&t z!?{h>g{}ipbNeN=+YH8|s+A&{Z$z(Db#92ECijzr@h7H!ah=(G_%PqJqlTNdoL_pB_0DF4_g4zu z0a1u)@hbm)X?ucQT8dkv<{sbBU;E-6pWL^jr56u;bgM61oX@aXxzX$XoM*2-&9V+O z+x&}T-<)IDukkHdwQJ8ezn+;hj~%rAApZXOgT}49YZqM#e|g{h$CfGY%V#exDQ=5q z>-PKCFXpbK~1SYs8>xS=Ot!_%{MgKcrSeZR>9C$Dc-+Zvo+X1C0AbgJnO30qdi^!)~OxTJ5=)T znw_-x<~3#$FsCnrh412MoXaBtQZswdDfzIB(-ldK&IiRpnUDn|04DyI{YgO^QIJjkHMTp9Lg+dMPDM=NH0JGLwIP4VLB&I1apj{WwZ zD(C9n{G_<>1gE#(Rh>ye@qVW~Hx|rKaS~msch7ZE)2ZaU=L?he+^%Zv=;&M|HSs?) zsIM0xuvSoxhk@Y{usavv&B!FefH)-w`Oq5BDLJSB*O@uUrhqovARi?II^YHYx`9lL z<8DCOxfpPtH-pe_4eThPoIZnaJ;+|_+tpx$vfJbN` zIRtTb3$hWQQ#FuxB!Rlm2%rd@T0t@b>5L6zGeF)#UO5TcyMzG$g;C7FyORmsRODHF zR8wcmqnL_!4JNv&$dg8(6#xj33gjaB7yo(ybYqdnClnB70$D!#D8|BK7G?ek-8AHW wH)^C Date: Mon, 29 Sep 2025 17:46:36 +0800 Subject: [PATCH 21/30] ADD file via upload --- src/main.jar | Bin 0 -> 16537 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main.jar diff --git a/src/main.jar b/src/main.jar new file mode 100644 index 0000000000000000000000000000000000000000..09d8582b44367f1e6ca90caced510272f8aadaab GIT binary patch literal 16537 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 Date: Mon, 29 Sep 2025 17:46:55 +0800 Subject: [PATCH 22/30] Delete 'src/Login.java' --- src/Login.java | 158 ------------------------------------------------- 1 file changed, 158 deletions(-) delete mode 100644 src/Login.java diff --git a/src/Login.java b/src/Login.java deleted file mode 100644 index 0936322..0000000 --- a/src/Login.java +++ /dev/null @@ -1,158 +0,0 @@ -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.Scanner; - -public class Login { - private static final String USER_FILE = "users.txt"; - private static List users = new ArrayList<>(); - public void Main() { - initializeUserFile(); - load(); - Scanner scanner = new Scanner(System.in); - while (true) { - System.out.println("\n---------登录系统---------"); - System.out.println("请输入用户名和密码(用空格隔开): "); - String input = scanner.nextLine().trim(); - if (input.equalsIgnoreCase("q")) { - System.out.println("\n已退出!"); - break; - } - String[] NandP = input.split(" "); - if (NandP.length != 2) { - System.out.println("请输入正确的用户名和密码!"); - continue; - } - String username = NandP[0]; - String password = NandP[1]; - User user = Prove(username, password); - if (user != null) { - Success(user, scanner); - } else { - System.out.println("请输入正确的用户名和密码!"); - } - } - scanner.close(); - } - - - private static void initializeUserFile() { - File file = new File(USER_FILE); - if (!file.exists()) { - try (PrintWriter writer = new PrintWriter(new FileWriter(file))) { - - writer.println("张三1 123 primary\r\n" - + "张三2 123 primary\r\n" - + "张三3 123 primary\r\n" - + "李四1 123 junior\r\n" - + "李四2 123 junior\r\n" - + "李四3 123 junior\r\n" - + "王五1 123 senior\r\n" - + "王五2 123 senior\r\n" - + "王五3 123 senior"); - writer.close(); - System.out.println("已创建users.txt"); - } catch (IOException e) { - System.out.println("创建用户文件失败: " + e.getMessage()); - } - } - } - - - private static void load() { - users.clear(); - try (BufferedReader reader = new BufferedReader(new FileReader(USER_FILE))) { - String line; - while ((line = reader.readLine()) != null) { - line = line.trim(); - if (!line.isEmpty()) { - String[] parts = line.split(" "); - if (parts.length == 3) { - users.add(new User(parts[0], parts[1], parts[2])); - } - } - } - reader.close(); - System.out.println("Loading..."); - } catch (IOException e) { - System.out.println("出错!" + e.getMessage()); - } - } - - private static User Prove(String username, String password) { - for (User user : users) { - if (user.getUsername().equals(username) && user.getPassword().equals(password)) { - return user; - } - } - return null; - } - - private static void Success(User user, Scanner scanner) { - String role = getRole(user.getRole()); - System.out.println("\n登录成功!\n" + user.getUsername() + " [" + role + "]"); - QuestionManager questionManager = new QuestionManager(user.getUsername(), user.getRole()); - while (true) { - System.out.println("\n输入 -1 退出登录,输入 q 退出程序,输入\"切换为XX\"切换难度(XX为小学、初中、高中)"); - System.out.println("准备生成[" + questionManager.getCurrentRoleChinese() + "]数学题目,请输入生成题目数量(10~30):"); - String input = scanner.nextLine().trim(); - if (input.equals("-1")) { - System.out.println("返回登录界面..."); - break; - } else if (input.equalsIgnoreCase("q")) { - System.out.println("\n已退出!"); - System.exit(0); - } else if (input.startsWith("切换为")) { - Switch(questionManager, input); - } else { - try { - int count = Integer.parseInt(input); - if (count >= 10 && count <= 30) { - questionManager.generateQuestions(count); - } else if (count == -1) { - System.out.println("返回登录界面..."); - break; - } else { - System.out.println("题目数量应在10~30之间!"); - } - } catch (NumberFormatException e) { - System.out.println("请输入有效的数字(10~30)或指定命令!"); - } - } - } - } - - private static void Switch(QuestionManager questionManager, String input) { - String newRole = input.substring(3).trim(); - switch (newRole) { - case "小学": - questionManager.setRole("primary"); - System.out.println("已切换为小学难度"); - break; - case "初中": - questionManager.setRole("junior"); - System.out.println("已切换为初中难度"); - break; - case "高中": - questionManager.setRole("senior"); - System.out.println("已切换为高中难度"); - break; - default: - System.out.println("请输入小学、初中和高中三个选项中的一个"); - } - } - - private static String getRole(String role) { - switch (role) { - case "primary": - return "小学"; - case "junior": - return "初中"; - case "senior": - return "高中"; - default: - return "未知"; - } - } - -} -- 2.34.1 From 9454e695582398e3cb8b2560db3c405172f1ae5f Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Mon, 29 Sep 2025 17:47:04 +0800 Subject: [PATCH 23/30] ADD file via upload --- src/Login.java | 158 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 src/Login.java diff --git a/src/Login.java b/src/Login.java new file mode 100644 index 0000000..0936322 --- /dev/null +++ b/src/Login.java @@ -0,0 +1,158 @@ +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class Login { + private static final String USER_FILE = "users.txt"; + private static List users = new ArrayList<>(); + public void Main() { + initializeUserFile(); + load(); + Scanner scanner = new Scanner(System.in); + while (true) { + System.out.println("\n---------登录系统---------"); + System.out.println("请输入用户名和密码(用空格隔开): "); + String input = scanner.nextLine().trim(); + if (input.equalsIgnoreCase("q")) { + System.out.println("\n已退出!"); + break; + } + String[] NandP = input.split(" "); + if (NandP.length != 2) { + System.out.println("请输入正确的用户名和密码!"); + continue; + } + String username = NandP[0]; + String password = NandP[1]; + User user = Prove(username, password); + if (user != null) { + Success(user, scanner); + } else { + System.out.println("请输入正确的用户名和密码!"); + } + } + scanner.close(); + } + + + private static void initializeUserFile() { + File file = new File(USER_FILE); + if (!file.exists()) { + try (PrintWriter writer = new PrintWriter(new FileWriter(file))) { + + writer.println("张三1 123 primary\r\n" + + "张三2 123 primary\r\n" + + "张三3 123 primary\r\n" + + "李四1 123 junior\r\n" + + "李四2 123 junior\r\n" + + "李四3 123 junior\r\n" + + "王五1 123 senior\r\n" + + "王五2 123 senior\r\n" + + "王五3 123 senior"); + writer.close(); + System.out.println("已创建users.txt"); + } catch (IOException e) { + System.out.println("创建用户文件失败: " + e.getMessage()); + } + } + } + + + private static void load() { + users.clear(); + try (BufferedReader reader = new BufferedReader(new FileReader(USER_FILE))) { + String line; + while ((line = reader.readLine()) != null) { + line = line.trim(); + if (!line.isEmpty()) { + String[] parts = line.split(" "); + if (parts.length == 3) { + users.add(new User(parts[0], parts[1], parts[2])); + } + } + } + reader.close(); + System.out.println("Loading..."); + } catch (IOException e) { + System.out.println("出错!" + e.getMessage()); + } + } + + private static User Prove(String username, String password) { + for (User user : users) { + if (user.getUsername().equals(username) && user.getPassword().equals(password)) { + return user; + } + } + return null; + } + + private static void Success(User user, Scanner scanner) { + String role = getRole(user.getRole()); + System.out.println("\n登录成功!\n" + user.getUsername() + " [" + role + "]"); + QuestionManager questionManager = new QuestionManager(user.getUsername(), user.getRole()); + while (true) { + System.out.println("\n输入 -1 退出登录,输入 q 退出程序,输入\"切换为XX\"切换难度(XX为小学、初中、高中)"); + System.out.println("准备生成[" + questionManager.getCurrentRoleChinese() + "]数学题目,请输入生成题目数量(10~30):"); + String input = scanner.nextLine().trim(); + if (input.equals("-1")) { + System.out.println("返回登录界面..."); + break; + } else if (input.equalsIgnoreCase("q")) { + System.out.println("\n已退出!"); + System.exit(0); + } else if (input.startsWith("切换为")) { + Switch(questionManager, input); + } else { + try { + int count = Integer.parseInt(input); + if (count >= 10 && count <= 30) { + questionManager.generateQuestions(count); + } else if (count == -1) { + System.out.println("返回登录界面..."); + break; + } else { + System.out.println("题目数量应在10~30之间!"); + } + } catch (NumberFormatException e) { + System.out.println("请输入有效的数字(10~30)或指定命令!"); + } + } + } + } + + private static void Switch(QuestionManager questionManager, String input) { + String newRole = input.substring(3).trim(); + switch (newRole) { + case "小学": + questionManager.setRole("primary"); + System.out.println("已切换为小学难度"); + break; + case "初中": + questionManager.setRole("junior"); + System.out.println("已切换为初中难度"); + break; + case "高中": + questionManager.setRole("senior"); + System.out.println("已切换为高中难度"); + break; + default: + System.out.println("请输入小学、初中和高中三个选项中的一个"); + } + } + + private static String getRole(String role) { + switch (role) { + case "primary": + return "小学"; + case "junior": + return "初中"; + case "senior": + return "高中"; + default: + return "未知"; + } + } + +} -- 2.34.1 From b0f8a6c22edcb2e215829db6c72ceb04eb97de89 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Mon, 29 Sep 2025 17:47:23 +0800 Subject: [PATCH 24/30] ADD file via upload --- doc | 265 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 doc diff --git a/doc b/doc new file mode 100644 index 0000000..f842c6a --- /dev/null +++ b/doc @@ -0,0 +1,265 @@ +# **中小学数学卷子自动生成程序说明** +## 一、概述 +该项目是一个基于 Java 的中小学数学卷子自动生成系统,支持小学、初中和高中三个难度级别,具备用户登录、题目生成、查重、文件存储等功能。 +## 二、类 +### 1.Start - 程序入口类 +#### **功能:** +程序的启动入口,调用 Login 类启动登录流程。 + +#### **方法:** + +main(String[] args): 启动程序,创建 Login 实例并调用其 Main() 方法。 +### 2. Login - 用户登录类 +#### **功能:** + +处理用户登录、验证、权限管理和难度切换。 + +#### **方法:** + +Main(): 主登录循环,接收用户输入并验证。 + +initializeUserFile(): 初始化用户文件 users.txt,如果不存在则创建。 + +load(): 从 users.txt 加载用户信息到内存。 + +Prove(String username, String password): 验证用户名和密码。 + +Success(User user, Scanner scanner): 登录成功后进入题目生成流程。 + +Switch(QuestionManager questionManager, String input): 切换题目生成难度。 + +getRole(String role):将英文角色转换为中文显示。 +### 3. User - 用户信息类 +#### **功能:** + +封装用户的基本信息。 + +#### **属性:** + +username: 用户名 + +password: 密码 + +role: 角色(primary/junior/senior) + +#### **方法:** + +构造方法和 getter 方法 +### 4. QuestionManager - 题目管理器 +#### **功能:** + +管理题目生成、文件存储和用户目录。 + +#### **方法:** + +setRole(String role): 设置当前题目生成器(小学/初中/高中)。 + +createQuestionsDirectory(): 创建用户题目存储目录。 + +generateQuestions(int count): 生成指定数量的题目并保存到文件。 + +getCurrentRoleChinese(): 返回当前难度的中文名称。 + +getUserQuestionFiles(String username): 获取用户所有题目文件(用于查重)。 +### 5. QuestionGenerator - 题目生成器接口 +#### **功能:** + +定义题目生成器的基本行为。 + +#### **方法:** + +generateQuestion(): 生成一道题目。 + +normalizeQuestion(String question): 标准化题目格式用于比较。 + +generateOperator(String[] operators): 随机生成运算符。 + +isValidParentheses(String expression): 验证括号是否合法。 +### 6. AbstractQuestionGenerator - 抽象题目生成器 +#### **功能:** + +提供题目生成的通用方法和查重机制。 + +#### **方法:** + +setUsername(String username): 设置用户名并加载历史题目。 + +loadExistingQuestions(): 加载用户已生成的题目用于查重。 + +normalizeQuestion(String question): 去除空格标准化题目。 + +generateNumber(): 生成 1~100 的随机数。 + +isQuestionUnique(String question): 判断题目是否重复。 + +isValidParentheses(String expression): 验证括号是否合法且不冗余。 + +ensureBalancedParentheses(String expression): 确保括号成对出现。 +### 7. PrimaryQuestionGenerator - 小学题目生成器 +#### **功能:** + +生成小学难度题目,仅包含加减乘除和括号。 + +#### **方法:** + +generateQuestion(): 生成小学题目,支持括号和多个操作数。 + +addReasonableParentheses(String expression, int operandCount): 随机添加合理括号。 +### 8. JuniorQuestionGenerator - 初中题目生成器 +#### **功能:** + +生成初中难度题目,至少包含一个平方或开方运算。 + +#### **方法:** + +generateQuestion(): 生成初中题目,确保包含平方或开方。 + +AddSpecialOperator(...): 添加平方或开方运算符。 + +hasProperOperatorSpacing(String expression): 检查运算符间距是否合理。 +### 9. SeniorQuestionGenerator - 高中题目生成器 +#### **功能:** + +生成高中难度题目,至少包含一个三角函数(sin/cos/tan),支持嵌套。 + +#### **方法:** + +generateQuestion(): 生成高中题目,确保包含三角函数。 + +AddTrigOperator(...): 添加三角函数运算符。 + +ForceAddTrigOperator(...): 若未包含三角函数,则强制添加。 + +Revise(String expression): 调整括号位置,避免语法错误。 +## 三、流程 +### 1.登录流程 +(1)用户输入用户名和密码; + +(2)系统验证身份并显示角色; + +(3)用户选择生成题目数量或切换难度; + +(4)系统生成题目并保存到用户目录。 + +### 2.题目生成流程 +(1)根据难度选择对应的生成器; + +(2)生成操作数和运算符; + +(3)添加括号和特殊运算符(初中/高中); + +(4)查重和括号合法性检查; + +(5)保存到文件,格式为 年-月-日-时-分-秒.txt。 + +### 3.文件存储结构 + src + ├── questions/ + | └── 用户名/ + | ├── 2025-09-20-10-30-45.txt + | └── 2025-09-20-10-35-22.txt + └── users.txt + +### 4.难度特征 +|难度| 运算符类型| 特殊要求| +|:---:|:---|:---| +|小学| +, -, ×, ÷| 可含括号| +|初中| +, -, ×, ÷, ², √| 至少一个平方或开方| +|高中| +, -, ×, ÷, sin, cos, tan| 至少一个三角函数,可嵌套| +## 四、运行 +### 1. Linux bash +```bash +~/src$ javac *.java +~/src$ java Start +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或先生成jar: +```bash +~/src$ javac *.java +~/src$ jar -cfve main.jar Start *.class +已添加清单 +正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2649)(压缩了 44%) +正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) +正在添加: Login.class(输入 = 5877) (输出 = 3401)(压缩了 42%) +正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) +正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) +正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) +正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) +正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) +正在添加: User.class(输入 = 1121) (输出 = 540)(压缩了 51%) +~/src$ java -jar main +Error: Unable to access jarfile main +~/src$ java -jar main.jar +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +### 2.Windows cmd + +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>java Start.java +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或 +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>javac -encoding UTF-8 *.java + +D:\src>java Start +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或先生成jar: +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>javac -encoding UTF-8 *.java + +D:\src>jar cfve main.jar Start *.class +已添加清单 +正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2647)(压缩了 44%) +正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) +正在添加: Login.class(输入 = 5877) (输出 = 3402)(压缩了 42%) +正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) +正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) +正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) +正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) +正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) +正在添加: User.class(输入 = 1121) (输出 = 539)(压缩了 51%) + +D:\src>java -jar main.jar +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +### 3.Windows PowerShell +与cmd类似,只需将 +```cmd +D:\src>chcp 65001 +``` +换成 +```powershell +PS D:\src> [Console]::InputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 +``` + -- 2.34.1 From 933c229262dd0742f6d98046757355e752056b6d Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Mon, 29 Sep 2025 17:47:32 +0800 Subject: [PATCH 25/30] Delete 'doc' --- doc | 265 ------------------------------------------------------------ 1 file changed, 265 deletions(-) delete mode 100644 doc diff --git a/doc b/doc deleted file mode 100644 index f842c6a..0000000 --- a/doc +++ /dev/null @@ -1,265 +0,0 @@ -# **中小学数学卷子自动生成程序说明** -## 一、概述 -该项目是一个基于 Java 的中小学数学卷子自动生成系统,支持小学、初中和高中三个难度级别,具备用户登录、题目生成、查重、文件存储等功能。 -## 二、类 -### 1.Start - 程序入口类 -#### **功能:** -程序的启动入口,调用 Login 类启动登录流程。 - -#### **方法:** - -main(String[] args): 启动程序,创建 Login 实例并调用其 Main() 方法。 -### 2. Login - 用户登录类 -#### **功能:** - -处理用户登录、验证、权限管理和难度切换。 - -#### **方法:** - -Main(): 主登录循环,接收用户输入并验证。 - -initializeUserFile(): 初始化用户文件 users.txt,如果不存在则创建。 - -load(): 从 users.txt 加载用户信息到内存。 - -Prove(String username, String password): 验证用户名和密码。 - -Success(User user, Scanner scanner): 登录成功后进入题目生成流程。 - -Switch(QuestionManager questionManager, String input): 切换题目生成难度。 - -getRole(String role):将英文角色转换为中文显示。 -### 3. User - 用户信息类 -#### **功能:** - -封装用户的基本信息。 - -#### **属性:** - -username: 用户名 - -password: 密码 - -role: 角色(primary/junior/senior) - -#### **方法:** - -构造方法和 getter 方法 -### 4. QuestionManager - 题目管理器 -#### **功能:** - -管理题目生成、文件存储和用户目录。 - -#### **方法:** - -setRole(String role): 设置当前题目生成器(小学/初中/高中)。 - -createQuestionsDirectory(): 创建用户题目存储目录。 - -generateQuestions(int count): 生成指定数量的题目并保存到文件。 - -getCurrentRoleChinese(): 返回当前难度的中文名称。 - -getUserQuestionFiles(String username): 获取用户所有题目文件(用于查重)。 -### 5. QuestionGenerator - 题目生成器接口 -#### **功能:** - -定义题目生成器的基本行为。 - -#### **方法:** - -generateQuestion(): 生成一道题目。 - -normalizeQuestion(String question): 标准化题目格式用于比较。 - -generateOperator(String[] operators): 随机生成运算符。 - -isValidParentheses(String expression): 验证括号是否合法。 -### 6. AbstractQuestionGenerator - 抽象题目生成器 -#### **功能:** - -提供题目生成的通用方法和查重机制。 - -#### **方法:** - -setUsername(String username): 设置用户名并加载历史题目。 - -loadExistingQuestions(): 加载用户已生成的题目用于查重。 - -normalizeQuestion(String question): 去除空格标准化题目。 - -generateNumber(): 生成 1~100 的随机数。 - -isQuestionUnique(String question): 判断题目是否重复。 - -isValidParentheses(String expression): 验证括号是否合法且不冗余。 - -ensureBalancedParentheses(String expression): 确保括号成对出现。 -### 7. PrimaryQuestionGenerator - 小学题目生成器 -#### **功能:** - -生成小学难度题目,仅包含加减乘除和括号。 - -#### **方法:** - -generateQuestion(): 生成小学题目,支持括号和多个操作数。 - -addReasonableParentheses(String expression, int operandCount): 随机添加合理括号。 -### 8. JuniorQuestionGenerator - 初中题目生成器 -#### **功能:** - -生成初中难度题目,至少包含一个平方或开方运算。 - -#### **方法:** - -generateQuestion(): 生成初中题目,确保包含平方或开方。 - -AddSpecialOperator(...): 添加平方或开方运算符。 - -hasProperOperatorSpacing(String expression): 检查运算符间距是否合理。 -### 9. SeniorQuestionGenerator - 高中题目生成器 -#### **功能:** - -生成高中难度题目,至少包含一个三角函数(sin/cos/tan),支持嵌套。 - -#### **方法:** - -generateQuestion(): 生成高中题目,确保包含三角函数。 - -AddTrigOperator(...): 添加三角函数运算符。 - -ForceAddTrigOperator(...): 若未包含三角函数,则强制添加。 - -Revise(String expression): 调整括号位置,避免语法错误。 -## 三、流程 -### 1.登录流程 -(1)用户输入用户名和密码; - -(2)系统验证身份并显示角色; - -(3)用户选择生成题目数量或切换难度; - -(4)系统生成题目并保存到用户目录。 - -### 2.题目生成流程 -(1)根据难度选择对应的生成器; - -(2)生成操作数和运算符; - -(3)添加括号和特殊运算符(初中/高中); - -(4)查重和括号合法性检查; - -(5)保存到文件,格式为 年-月-日-时-分-秒.txt。 - -### 3.文件存储结构 - src - ├── questions/ - | └── 用户名/ - | ├── 2025-09-20-10-30-45.txt - | └── 2025-09-20-10-35-22.txt - └── users.txt - -### 4.难度特征 -|难度| 运算符类型| 特殊要求| -|:---:|:---|:---| -|小学| +, -, ×, ÷| 可含括号| -|初中| +, -, ×, ÷, ², √| 至少一个平方或开方| -|高中| +, -, ×, ÷, sin, cos, tan| 至少一个三角函数,可嵌套| -## 四、运行 -### 1. Linux bash -```bash -~/src$ javac *.java -~/src$ java Start -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -或先生成jar: -```bash -~/src$ javac *.java -~/src$ jar -cfve main.jar Start *.class -已添加清单 -正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2649)(压缩了 44%) -正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) -正在添加: Login.class(输入 = 5877) (输出 = 3401)(压缩了 42%) -正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) -正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) -正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) -正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) -正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) -正在添加: User.class(输入 = 1121) (输出 = 540)(压缩了 51%) -~/src$ java -jar main -Error: Unable to access jarfile main -~/src$ java -jar main.jar -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -### 2.Windows cmd - -```cmd -D:\src>chcp 65001 -Active code page: 65001 - -D:\src>java Start.java -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -或 -```cmd -D:\src>chcp 65001 -Active code page: 65001 - -D:\src>javac -encoding UTF-8 *.java - -D:\src>java Start -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -或先生成jar: -```cmd -D:\src>chcp 65001 -Active code page: 65001 - -D:\src>javac -encoding UTF-8 *.java - -D:\src>jar cfve main.jar Start *.class -已添加清单 -正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2647)(压缩了 44%) -正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) -正在添加: Login.class(输入 = 5877) (输出 = 3402)(压缩了 42%) -正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) -正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) -正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) -正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) -正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) -正在添加: User.class(输入 = 1121) (输出 = 539)(压缩了 51%) - -D:\src>java -jar main.jar -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -### 3.Windows PowerShell -与cmd类似,只需将 -```cmd -D:\src>chcp 65001 -``` -换成 -```powershell -PS D:\src> [Console]::InputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 -``` - -- 2.34.1 From 1a223cadafb2f44e86426b6941be2783fca7d178 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Mon, 29 Sep 2025 17:47:50 +0800 Subject: [PATCH 26/30] ADD file via upload --- doc | 265 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 doc diff --git a/doc b/doc new file mode 100644 index 0000000..f842c6a --- /dev/null +++ b/doc @@ -0,0 +1,265 @@ +# **中小学数学卷子自动生成程序说明** +## 一、概述 +该项目是一个基于 Java 的中小学数学卷子自动生成系统,支持小学、初中和高中三个难度级别,具备用户登录、题目生成、查重、文件存储等功能。 +## 二、类 +### 1.Start - 程序入口类 +#### **功能:** +程序的启动入口,调用 Login 类启动登录流程。 + +#### **方法:** + +main(String[] args): 启动程序,创建 Login 实例并调用其 Main() 方法。 +### 2. Login - 用户登录类 +#### **功能:** + +处理用户登录、验证、权限管理和难度切换。 + +#### **方法:** + +Main(): 主登录循环,接收用户输入并验证。 + +initializeUserFile(): 初始化用户文件 users.txt,如果不存在则创建。 + +load(): 从 users.txt 加载用户信息到内存。 + +Prove(String username, String password): 验证用户名和密码。 + +Success(User user, Scanner scanner): 登录成功后进入题目生成流程。 + +Switch(QuestionManager questionManager, String input): 切换题目生成难度。 + +getRole(String role):将英文角色转换为中文显示。 +### 3. User - 用户信息类 +#### **功能:** + +封装用户的基本信息。 + +#### **属性:** + +username: 用户名 + +password: 密码 + +role: 角色(primary/junior/senior) + +#### **方法:** + +构造方法和 getter 方法 +### 4. QuestionManager - 题目管理器 +#### **功能:** + +管理题目生成、文件存储和用户目录。 + +#### **方法:** + +setRole(String role): 设置当前题目生成器(小学/初中/高中)。 + +createQuestionsDirectory(): 创建用户题目存储目录。 + +generateQuestions(int count): 生成指定数量的题目并保存到文件。 + +getCurrentRoleChinese(): 返回当前难度的中文名称。 + +getUserQuestionFiles(String username): 获取用户所有题目文件(用于查重)。 +### 5. QuestionGenerator - 题目生成器接口 +#### **功能:** + +定义题目生成器的基本行为。 + +#### **方法:** + +generateQuestion(): 生成一道题目。 + +normalizeQuestion(String question): 标准化题目格式用于比较。 + +generateOperator(String[] operators): 随机生成运算符。 + +isValidParentheses(String expression): 验证括号是否合法。 +### 6. AbstractQuestionGenerator - 抽象题目生成器 +#### **功能:** + +提供题目生成的通用方法和查重机制。 + +#### **方法:** + +setUsername(String username): 设置用户名并加载历史题目。 + +loadExistingQuestions(): 加载用户已生成的题目用于查重。 + +normalizeQuestion(String question): 去除空格标准化题目。 + +generateNumber(): 生成 1~100 的随机数。 + +isQuestionUnique(String question): 判断题目是否重复。 + +isValidParentheses(String expression): 验证括号是否合法且不冗余。 + +ensureBalancedParentheses(String expression): 确保括号成对出现。 +### 7. PrimaryQuestionGenerator - 小学题目生成器 +#### **功能:** + +生成小学难度题目,仅包含加减乘除和括号。 + +#### **方法:** + +generateQuestion(): 生成小学题目,支持括号和多个操作数。 + +addReasonableParentheses(String expression, int operandCount): 随机添加合理括号。 +### 8. JuniorQuestionGenerator - 初中题目生成器 +#### **功能:** + +生成初中难度题目,至少包含一个平方或开方运算。 + +#### **方法:** + +generateQuestion(): 生成初中题目,确保包含平方或开方。 + +AddSpecialOperator(...): 添加平方或开方运算符。 + +hasProperOperatorSpacing(String expression): 检查运算符间距是否合理。 +### 9. SeniorQuestionGenerator - 高中题目生成器 +#### **功能:** + +生成高中难度题目,至少包含一个三角函数(sin/cos/tan),支持嵌套。 + +#### **方法:** + +generateQuestion(): 生成高中题目,确保包含三角函数。 + +AddTrigOperator(...): 添加三角函数运算符。 + +ForceAddTrigOperator(...): 若未包含三角函数,则强制添加。 + +Revise(String expression): 调整括号位置,避免语法错误。 +## 三、流程 +### 1.登录流程 +(1)用户输入用户名和密码; + +(2)系统验证身份并显示角色; + +(3)用户选择生成题目数量或切换难度; + +(4)系统生成题目并保存到用户目录。 + +### 2.题目生成流程 +(1)根据难度选择对应的生成器; + +(2)生成操作数和运算符; + +(3)添加括号和特殊运算符(初中/高中); + +(4)查重和括号合法性检查; + +(5)保存到文件,格式为 年-月-日-时-分-秒.txt。 + +### 3.文件存储结构 + src + ├── questions/ + | └── 用户名/ + | ├── 2025-09-20-10-30-45.txt + | └── 2025-09-20-10-35-22.txt + └── users.txt + +### 4.难度特征 +|难度| 运算符类型| 特殊要求| +|:---:|:---|:---| +|小学| +, -, ×, ÷| 可含括号| +|初中| +, -, ×, ÷, ², √| 至少一个平方或开方| +|高中| +, -, ×, ÷, sin, cos, tan| 至少一个三角函数,可嵌套| +## 四、运行 +### 1. Linux bash +```bash +~/src$ javac *.java +~/src$ java Start +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或先生成jar: +```bash +~/src$ javac *.java +~/src$ jar -cfve main.jar Start *.class +已添加清单 +正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2649)(压缩了 44%) +正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) +正在添加: Login.class(输入 = 5877) (输出 = 3401)(压缩了 42%) +正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) +正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) +正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) +正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) +正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) +正在添加: User.class(输入 = 1121) (输出 = 540)(压缩了 51%) +~/src$ java -jar main +Error: Unable to access jarfile main +~/src$ java -jar main.jar +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +### 2.Windows cmd + +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>java Start.java +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或 +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>javac -encoding UTF-8 *.java + +D:\src>java Start +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或先生成jar: +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>javac -encoding UTF-8 *.java + +D:\src>jar cfve main.jar Start *.class +已添加清单 +正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2647)(压缩了 44%) +正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) +正在添加: Login.class(输入 = 5877) (输出 = 3402)(压缩了 42%) +正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) +正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) +正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) +正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) +正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) +正在添加: User.class(输入 = 1121) (输出 = 539)(压缩了 51%) + +D:\src>java -jar main.jar +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +### 3.Windows PowerShell +与cmd类似,只需将 +```cmd +D:\src>chcp 65001 +``` +换成 +```powershell +PS D:\src> [Console]::InputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 +``` + -- 2.34.1 From 6a95886c5fa830c0a4e7274c78b4a916d27da55b Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Mon, 29 Sep 2025 17:48:22 +0800 Subject: [PATCH 27/30] Delete 'doc' --- doc | 265 ------------------------------------------------------------ 1 file changed, 265 deletions(-) delete mode 100644 doc diff --git a/doc b/doc deleted file mode 100644 index f842c6a..0000000 --- a/doc +++ /dev/null @@ -1,265 +0,0 @@ -# **中小学数学卷子自动生成程序说明** -## 一、概述 -该项目是一个基于 Java 的中小学数学卷子自动生成系统,支持小学、初中和高中三个难度级别,具备用户登录、题目生成、查重、文件存储等功能。 -## 二、类 -### 1.Start - 程序入口类 -#### **功能:** -程序的启动入口,调用 Login 类启动登录流程。 - -#### **方法:** - -main(String[] args): 启动程序,创建 Login 实例并调用其 Main() 方法。 -### 2. Login - 用户登录类 -#### **功能:** - -处理用户登录、验证、权限管理和难度切换。 - -#### **方法:** - -Main(): 主登录循环,接收用户输入并验证。 - -initializeUserFile(): 初始化用户文件 users.txt,如果不存在则创建。 - -load(): 从 users.txt 加载用户信息到内存。 - -Prove(String username, String password): 验证用户名和密码。 - -Success(User user, Scanner scanner): 登录成功后进入题目生成流程。 - -Switch(QuestionManager questionManager, String input): 切换题目生成难度。 - -getRole(String role):将英文角色转换为中文显示。 -### 3. User - 用户信息类 -#### **功能:** - -封装用户的基本信息。 - -#### **属性:** - -username: 用户名 - -password: 密码 - -role: 角色(primary/junior/senior) - -#### **方法:** - -构造方法和 getter 方法 -### 4. QuestionManager - 题目管理器 -#### **功能:** - -管理题目生成、文件存储和用户目录。 - -#### **方法:** - -setRole(String role): 设置当前题目生成器(小学/初中/高中)。 - -createQuestionsDirectory(): 创建用户题目存储目录。 - -generateQuestions(int count): 生成指定数量的题目并保存到文件。 - -getCurrentRoleChinese(): 返回当前难度的中文名称。 - -getUserQuestionFiles(String username): 获取用户所有题目文件(用于查重)。 -### 5. QuestionGenerator - 题目生成器接口 -#### **功能:** - -定义题目生成器的基本行为。 - -#### **方法:** - -generateQuestion(): 生成一道题目。 - -normalizeQuestion(String question): 标准化题目格式用于比较。 - -generateOperator(String[] operators): 随机生成运算符。 - -isValidParentheses(String expression): 验证括号是否合法。 -### 6. AbstractQuestionGenerator - 抽象题目生成器 -#### **功能:** - -提供题目生成的通用方法和查重机制。 - -#### **方法:** - -setUsername(String username): 设置用户名并加载历史题目。 - -loadExistingQuestions(): 加载用户已生成的题目用于查重。 - -normalizeQuestion(String question): 去除空格标准化题目。 - -generateNumber(): 生成 1~100 的随机数。 - -isQuestionUnique(String question): 判断题目是否重复。 - -isValidParentheses(String expression): 验证括号是否合法且不冗余。 - -ensureBalancedParentheses(String expression): 确保括号成对出现。 -### 7. PrimaryQuestionGenerator - 小学题目生成器 -#### **功能:** - -生成小学难度题目,仅包含加减乘除和括号。 - -#### **方法:** - -generateQuestion(): 生成小学题目,支持括号和多个操作数。 - -addReasonableParentheses(String expression, int operandCount): 随机添加合理括号。 -### 8. JuniorQuestionGenerator - 初中题目生成器 -#### **功能:** - -生成初中难度题目,至少包含一个平方或开方运算。 - -#### **方法:** - -generateQuestion(): 生成初中题目,确保包含平方或开方。 - -AddSpecialOperator(...): 添加平方或开方运算符。 - -hasProperOperatorSpacing(String expression): 检查运算符间距是否合理。 -### 9. SeniorQuestionGenerator - 高中题目生成器 -#### **功能:** - -生成高中难度题目,至少包含一个三角函数(sin/cos/tan),支持嵌套。 - -#### **方法:** - -generateQuestion(): 生成高中题目,确保包含三角函数。 - -AddTrigOperator(...): 添加三角函数运算符。 - -ForceAddTrigOperator(...): 若未包含三角函数,则强制添加。 - -Revise(String expression): 调整括号位置,避免语法错误。 -## 三、流程 -### 1.登录流程 -(1)用户输入用户名和密码; - -(2)系统验证身份并显示角色; - -(3)用户选择生成题目数量或切换难度; - -(4)系统生成题目并保存到用户目录。 - -### 2.题目生成流程 -(1)根据难度选择对应的生成器; - -(2)生成操作数和运算符; - -(3)添加括号和特殊运算符(初中/高中); - -(4)查重和括号合法性检查; - -(5)保存到文件,格式为 年-月-日-时-分-秒.txt。 - -### 3.文件存储结构 - src - ├── questions/ - | └── 用户名/ - | ├── 2025-09-20-10-30-45.txt - | └── 2025-09-20-10-35-22.txt - └── users.txt - -### 4.难度特征 -|难度| 运算符类型| 特殊要求| -|:---:|:---|:---| -|小学| +, -, ×, ÷| 可含括号| -|初中| +, -, ×, ÷, ², √| 至少一个平方或开方| -|高中| +, -, ×, ÷, sin, cos, tan| 至少一个三角函数,可嵌套| -## 四、运行 -### 1. Linux bash -```bash -~/src$ javac *.java -~/src$ java Start -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -或先生成jar: -```bash -~/src$ javac *.java -~/src$ jar -cfve main.jar Start *.class -已添加清单 -正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2649)(压缩了 44%) -正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) -正在添加: Login.class(输入 = 5877) (输出 = 3401)(压缩了 42%) -正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) -正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) -正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) -正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) -正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) -正在添加: User.class(输入 = 1121) (输出 = 540)(压缩了 51%) -~/src$ java -jar main -Error: Unable to access jarfile main -~/src$ java -jar main.jar -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -### 2.Windows cmd - -```cmd -D:\src>chcp 65001 -Active code page: 65001 - -D:\src>java Start.java -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -或 -```cmd -D:\src>chcp 65001 -Active code page: 65001 - -D:\src>javac -encoding UTF-8 *.java - -D:\src>java Start -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -或先生成jar: -```cmd -D:\src>chcp 65001 -Active code page: 65001 - -D:\src>javac -encoding UTF-8 *.java - -D:\src>jar cfve main.jar Start *.class -已添加清单 -正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2647)(压缩了 44%) -正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) -正在添加: Login.class(输入 = 5877) (输出 = 3402)(压缩了 42%) -正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) -正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) -正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) -正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) -正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) -正在添加: User.class(输入 = 1121) (输出 = 539)(压缩了 51%) - -D:\src>java -jar main.jar -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -### 3.Windows PowerShell -与cmd类似,只需将 -```cmd -D:\src>chcp 65001 -``` -换成 -```powershell -PS D:\src> [Console]::InputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 -``` - -- 2.34.1 From c555691bac717d0664db839f088a6df8fc545cfa Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Mon, 29 Sep 2025 17:49:02 +0800 Subject: [PATCH 28/30] ADD file via upload --- doc | 265 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 doc diff --git a/doc b/doc new file mode 100644 index 0000000..f842c6a --- /dev/null +++ b/doc @@ -0,0 +1,265 @@ +# **中小学数学卷子自动生成程序说明** +## 一、概述 +该项目是一个基于 Java 的中小学数学卷子自动生成系统,支持小学、初中和高中三个难度级别,具备用户登录、题目生成、查重、文件存储等功能。 +## 二、类 +### 1.Start - 程序入口类 +#### **功能:** +程序的启动入口,调用 Login 类启动登录流程。 + +#### **方法:** + +main(String[] args): 启动程序,创建 Login 实例并调用其 Main() 方法。 +### 2. Login - 用户登录类 +#### **功能:** + +处理用户登录、验证、权限管理和难度切换。 + +#### **方法:** + +Main(): 主登录循环,接收用户输入并验证。 + +initializeUserFile(): 初始化用户文件 users.txt,如果不存在则创建。 + +load(): 从 users.txt 加载用户信息到内存。 + +Prove(String username, String password): 验证用户名和密码。 + +Success(User user, Scanner scanner): 登录成功后进入题目生成流程。 + +Switch(QuestionManager questionManager, String input): 切换题目生成难度。 + +getRole(String role):将英文角色转换为中文显示。 +### 3. User - 用户信息类 +#### **功能:** + +封装用户的基本信息。 + +#### **属性:** + +username: 用户名 + +password: 密码 + +role: 角色(primary/junior/senior) + +#### **方法:** + +构造方法和 getter 方法 +### 4. QuestionManager - 题目管理器 +#### **功能:** + +管理题目生成、文件存储和用户目录。 + +#### **方法:** + +setRole(String role): 设置当前题目生成器(小学/初中/高中)。 + +createQuestionsDirectory(): 创建用户题目存储目录。 + +generateQuestions(int count): 生成指定数量的题目并保存到文件。 + +getCurrentRoleChinese(): 返回当前难度的中文名称。 + +getUserQuestionFiles(String username): 获取用户所有题目文件(用于查重)。 +### 5. QuestionGenerator - 题目生成器接口 +#### **功能:** + +定义题目生成器的基本行为。 + +#### **方法:** + +generateQuestion(): 生成一道题目。 + +normalizeQuestion(String question): 标准化题目格式用于比较。 + +generateOperator(String[] operators): 随机生成运算符。 + +isValidParentheses(String expression): 验证括号是否合法。 +### 6. AbstractQuestionGenerator - 抽象题目生成器 +#### **功能:** + +提供题目生成的通用方法和查重机制。 + +#### **方法:** + +setUsername(String username): 设置用户名并加载历史题目。 + +loadExistingQuestions(): 加载用户已生成的题目用于查重。 + +normalizeQuestion(String question): 去除空格标准化题目。 + +generateNumber(): 生成 1~100 的随机数。 + +isQuestionUnique(String question): 判断题目是否重复。 + +isValidParentheses(String expression): 验证括号是否合法且不冗余。 + +ensureBalancedParentheses(String expression): 确保括号成对出现。 +### 7. PrimaryQuestionGenerator - 小学题目生成器 +#### **功能:** + +生成小学难度题目,仅包含加减乘除和括号。 + +#### **方法:** + +generateQuestion(): 生成小学题目,支持括号和多个操作数。 + +addReasonableParentheses(String expression, int operandCount): 随机添加合理括号。 +### 8. JuniorQuestionGenerator - 初中题目生成器 +#### **功能:** + +生成初中难度题目,至少包含一个平方或开方运算。 + +#### **方法:** + +generateQuestion(): 生成初中题目,确保包含平方或开方。 + +AddSpecialOperator(...): 添加平方或开方运算符。 + +hasProperOperatorSpacing(String expression): 检查运算符间距是否合理。 +### 9. SeniorQuestionGenerator - 高中题目生成器 +#### **功能:** + +生成高中难度题目,至少包含一个三角函数(sin/cos/tan),支持嵌套。 + +#### **方法:** + +generateQuestion(): 生成高中题目,确保包含三角函数。 + +AddTrigOperator(...): 添加三角函数运算符。 + +ForceAddTrigOperator(...): 若未包含三角函数,则强制添加。 + +Revise(String expression): 调整括号位置,避免语法错误。 +## 三、流程 +### 1.登录流程 +(1)用户输入用户名和密码; + +(2)系统验证身份并显示角色; + +(3)用户选择生成题目数量或切换难度; + +(4)系统生成题目并保存到用户目录。 + +### 2.题目生成流程 +(1)根据难度选择对应的生成器; + +(2)生成操作数和运算符; + +(3)添加括号和特殊运算符(初中/高中); + +(4)查重和括号合法性检查; + +(5)保存到文件,格式为 年-月-日-时-分-秒.txt。 + +### 3.文件存储结构 + src + ├── questions/ + | └── 用户名/ + | ├── 2025-09-20-10-30-45.txt + | └── 2025-09-20-10-35-22.txt + └── users.txt + +### 4.难度特征 +|难度| 运算符类型| 特殊要求| +|:---:|:---|:---| +|小学| +, -, ×, ÷| 可含括号| +|初中| +, -, ×, ÷, ², √| 至少一个平方或开方| +|高中| +, -, ×, ÷, sin, cos, tan| 至少一个三角函数,可嵌套| +## 四、运行 +### 1. Linux bash +```bash +~/src$ javac *.java +~/src$ java Start +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或先生成jar: +```bash +~/src$ javac *.java +~/src$ jar -cfve main.jar Start *.class +已添加清单 +正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2649)(压缩了 44%) +正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) +正在添加: Login.class(输入 = 5877) (输出 = 3401)(压缩了 42%) +正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) +正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) +正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) +正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) +正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) +正在添加: User.class(输入 = 1121) (输出 = 540)(压缩了 51%) +~/src$ java -jar main +Error: Unable to access jarfile main +~/src$ java -jar main.jar +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +### 2.Windows cmd + +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>java Start.java +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或 +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>javac -encoding UTF-8 *.java + +D:\src>java Start +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或先生成jar: +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>javac -encoding UTF-8 *.java + +D:\src>jar cfve main.jar Start *.class +已添加清单 +正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2647)(压缩了 44%) +正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) +正在添加: Login.class(输入 = 5877) (输出 = 3402)(压缩了 42%) +正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) +正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) +正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) +正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) +正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) +正在添加: User.class(输入 = 1121) (输出 = 539)(压缩了 51%) + +D:\src>java -jar main.jar +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +### 3.Windows PowerShell +与cmd类似,只需将 +```cmd +D:\src>chcp 65001 +``` +换成 +```powershell +PS D:\src> [Console]::InputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 +``` + -- 2.34.1 From 1c24e737ba587296e556838705c85e9e73fe3b77 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Mon, 29 Sep 2025 17:56:12 +0800 Subject: [PATCH 29/30] Delete 'doc' --- doc | 265 ------------------------------------------------------------ 1 file changed, 265 deletions(-) delete mode 100644 doc diff --git a/doc b/doc deleted file mode 100644 index f842c6a..0000000 --- a/doc +++ /dev/null @@ -1,265 +0,0 @@ -# **中小学数学卷子自动生成程序说明** -## 一、概述 -该项目是一个基于 Java 的中小学数学卷子自动生成系统,支持小学、初中和高中三个难度级别,具备用户登录、题目生成、查重、文件存储等功能。 -## 二、类 -### 1.Start - 程序入口类 -#### **功能:** -程序的启动入口,调用 Login 类启动登录流程。 - -#### **方法:** - -main(String[] args): 启动程序,创建 Login 实例并调用其 Main() 方法。 -### 2. Login - 用户登录类 -#### **功能:** - -处理用户登录、验证、权限管理和难度切换。 - -#### **方法:** - -Main(): 主登录循环,接收用户输入并验证。 - -initializeUserFile(): 初始化用户文件 users.txt,如果不存在则创建。 - -load(): 从 users.txt 加载用户信息到内存。 - -Prove(String username, String password): 验证用户名和密码。 - -Success(User user, Scanner scanner): 登录成功后进入题目生成流程。 - -Switch(QuestionManager questionManager, String input): 切换题目生成难度。 - -getRole(String role):将英文角色转换为中文显示。 -### 3. User - 用户信息类 -#### **功能:** - -封装用户的基本信息。 - -#### **属性:** - -username: 用户名 - -password: 密码 - -role: 角色(primary/junior/senior) - -#### **方法:** - -构造方法和 getter 方法 -### 4. QuestionManager - 题目管理器 -#### **功能:** - -管理题目生成、文件存储和用户目录。 - -#### **方法:** - -setRole(String role): 设置当前题目生成器(小学/初中/高中)。 - -createQuestionsDirectory(): 创建用户题目存储目录。 - -generateQuestions(int count): 生成指定数量的题目并保存到文件。 - -getCurrentRoleChinese(): 返回当前难度的中文名称。 - -getUserQuestionFiles(String username): 获取用户所有题目文件(用于查重)。 -### 5. QuestionGenerator - 题目生成器接口 -#### **功能:** - -定义题目生成器的基本行为。 - -#### **方法:** - -generateQuestion(): 生成一道题目。 - -normalizeQuestion(String question): 标准化题目格式用于比较。 - -generateOperator(String[] operators): 随机生成运算符。 - -isValidParentheses(String expression): 验证括号是否合法。 -### 6. AbstractQuestionGenerator - 抽象题目生成器 -#### **功能:** - -提供题目生成的通用方法和查重机制。 - -#### **方法:** - -setUsername(String username): 设置用户名并加载历史题目。 - -loadExistingQuestions(): 加载用户已生成的题目用于查重。 - -normalizeQuestion(String question): 去除空格标准化题目。 - -generateNumber(): 生成 1~100 的随机数。 - -isQuestionUnique(String question): 判断题目是否重复。 - -isValidParentheses(String expression): 验证括号是否合法且不冗余。 - -ensureBalancedParentheses(String expression): 确保括号成对出现。 -### 7. PrimaryQuestionGenerator - 小学题目生成器 -#### **功能:** - -生成小学难度题目,仅包含加减乘除和括号。 - -#### **方法:** - -generateQuestion(): 生成小学题目,支持括号和多个操作数。 - -addReasonableParentheses(String expression, int operandCount): 随机添加合理括号。 -### 8. JuniorQuestionGenerator - 初中题目生成器 -#### **功能:** - -生成初中难度题目,至少包含一个平方或开方运算。 - -#### **方法:** - -generateQuestion(): 生成初中题目,确保包含平方或开方。 - -AddSpecialOperator(...): 添加平方或开方运算符。 - -hasProperOperatorSpacing(String expression): 检查运算符间距是否合理。 -### 9. SeniorQuestionGenerator - 高中题目生成器 -#### **功能:** - -生成高中难度题目,至少包含一个三角函数(sin/cos/tan),支持嵌套。 - -#### **方法:** - -generateQuestion(): 生成高中题目,确保包含三角函数。 - -AddTrigOperator(...): 添加三角函数运算符。 - -ForceAddTrigOperator(...): 若未包含三角函数,则强制添加。 - -Revise(String expression): 调整括号位置,避免语法错误。 -## 三、流程 -### 1.登录流程 -(1)用户输入用户名和密码; - -(2)系统验证身份并显示角色; - -(3)用户选择生成题目数量或切换难度; - -(4)系统生成题目并保存到用户目录。 - -### 2.题目生成流程 -(1)根据难度选择对应的生成器; - -(2)生成操作数和运算符; - -(3)添加括号和特殊运算符(初中/高中); - -(4)查重和括号合法性检查; - -(5)保存到文件,格式为 年-月-日-时-分-秒.txt。 - -### 3.文件存储结构 - src - ├── questions/ - | └── 用户名/ - | ├── 2025-09-20-10-30-45.txt - | └── 2025-09-20-10-35-22.txt - └── users.txt - -### 4.难度特征 -|难度| 运算符类型| 特殊要求| -|:---:|:---|:---| -|小学| +, -, ×, ÷| 可含括号| -|初中| +, -, ×, ÷, ², √| 至少一个平方或开方| -|高中| +, -, ×, ÷, sin, cos, tan| 至少一个三角函数,可嵌套| -## 四、运行 -### 1. Linux bash -```bash -~/src$ javac *.java -~/src$ java Start -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -或先生成jar: -```bash -~/src$ javac *.java -~/src$ jar -cfve main.jar Start *.class -已添加清单 -正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2649)(压缩了 44%) -正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) -正在添加: Login.class(输入 = 5877) (输出 = 3401)(压缩了 42%) -正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) -正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) -正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) -正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) -正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) -正在添加: User.class(输入 = 1121) (输出 = 540)(压缩了 51%) -~/src$ java -jar main -Error: Unable to access jarfile main -~/src$ java -jar main.jar -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -### 2.Windows cmd - -```cmd -D:\src>chcp 65001 -Active code page: 65001 - -D:\src>java Start.java -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -或 -```cmd -D:\src>chcp 65001 -Active code page: 65001 - -D:\src>javac -encoding UTF-8 *.java - -D:\src>java Start -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -或先生成jar: -```cmd -D:\src>chcp 65001 -Active code page: 65001 - -D:\src>javac -encoding UTF-8 *.java - -D:\src>jar cfve main.jar Start *.class -已添加清单 -正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2647)(压缩了 44%) -正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) -正在添加: Login.class(输入 = 5877) (输出 = 3402)(压缩了 42%) -正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) -正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) -正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) -正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) -正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) -正在添加: User.class(输入 = 1121) (输出 = 539)(压缩了 51%) - -D:\src>java -jar main.jar -已创建users.txt -Loading... - ----------登录系统--------- -请输入用户名和密码(用空格隔开): -``` -### 3.Windows PowerShell -与cmd类似,只需将 -```cmd -D:\src>chcp 65001 -``` -换成 -```powershell -PS D:\src> [Console]::InputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 -``` - -- 2.34.1 From 5bd142aaec8a4656fa3a4bab0a92e587bb6b4fa8 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Mon, 29 Sep 2025 17:56:25 +0800 Subject: [PATCH 30/30] ADD file via upload --- doc/Documentation.md | 265 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 265 insertions(+) create mode 100644 doc/Documentation.md diff --git a/doc/Documentation.md b/doc/Documentation.md new file mode 100644 index 0000000..f842c6a --- /dev/null +++ b/doc/Documentation.md @@ -0,0 +1,265 @@ +# **中小学数学卷子自动生成程序说明** +## 一、概述 +该项目是一个基于 Java 的中小学数学卷子自动生成系统,支持小学、初中和高中三个难度级别,具备用户登录、题目生成、查重、文件存储等功能。 +## 二、类 +### 1.Start - 程序入口类 +#### **功能:** +程序的启动入口,调用 Login 类启动登录流程。 + +#### **方法:** + +main(String[] args): 启动程序,创建 Login 实例并调用其 Main() 方法。 +### 2. Login - 用户登录类 +#### **功能:** + +处理用户登录、验证、权限管理和难度切换。 + +#### **方法:** + +Main(): 主登录循环,接收用户输入并验证。 + +initializeUserFile(): 初始化用户文件 users.txt,如果不存在则创建。 + +load(): 从 users.txt 加载用户信息到内存。 + +Prove(String username, String password): 验证用户名和密码。 + +Success(User user, Scanner scanner): 登录成功后进入题目生成流程。 + +Switch(QuestionManager questionManager, String input): 切换题目生成难度。 + +getRole(String role):将英文角色转换为中文显示。 +### 3. User - 用户信息类 +#### **功能:** + +封装用户的基本信息。 + +#### **属性:** + +username: 用户名 + +password: 密码 + +role: 角色(primary/junior/senior) + +#### **方法:** + +构造方法和 getter 方法 +### 4. QuestionManager - 题目管理器 +#### **功能:** + +管理题目生成、文件存储和用户目录。 + +#### **方法:** + +setRole(String role): 设置当前题目生成器(小学/初中/高中)。 + +createQuestionsDirectory(): 创建用户题目存储目录。 + +generateQuestions(int count): 生成指定数量的题目并保存到文件。 + +getCurrentRoleChinese(): 返回当前难度的中文名称。 + +getUserQuestionFiles(String username): 获取用户所有题目文件(用于查重)。 +### 5. QuestionGenerator - 题目生成器接口 +#### **功能:** + +定义题目生成器的基本行为。 + +#### **方法:** + +generateQuestion(): 生成一道题目。 + +normalizeQuestion(String question): 标准化题目格式用于比较。 + +generateOperator(String[] operators): 随机生成运算符。 + +isValidParentheses(String expression): 验证括号是否合法。 +### 6. AbstractQuestionGenerator - 抽象题目生成器 +#### **功能:** + +提供题目生成的通用方法和查重机制。 + +#### **方法:** + +setUsername(String username): 设置用户名并加载历史题目。 + +loadExistingQuestions(): 加载用户已生成的题目用于查重。 + +normalizeQuestion(String question): 去除空格标准化题目。 + +generateNumber(): 生成 1~100 的随机数。 + +isQuestionUnique(String question): 判断题目是否重复。 + +isValidParentheses(String expression): 验证括号是否合法且不冗余。 + +ensureBalancedParentheses(String expression): 确保括号成对出现。 +### 7. PrimaryQuestionGenerator - 小学题目生成器 +#### **功能:** + +生成小学难度题目,仅包含加减乘除和括号。 + +#### **方法:** + +generateQuestion(): 生成小学题目,支持括号和多个操作数。 + +addReasonableParentheses(String expression, int operandCount): 随机添加合理括号。 +### 8. JuniorQuestionGenerator - 初中题目生成器 +#### **功能:** + +生成初中难度题目,至少包含一个平方或开方运算。 + +#### **方法:** + +generateQuestion(): 生成初中题目,确保包含平方或开方。 + +AddSpecialOperator(...): 添加平方或开方运算符。 + +hasProperOperatorSpacing(String expression): 检查运算符间距是否合理。 +### 9. SeniorQuestionGenerator - 高中题目生成器 +#### **功能:** + +生成高中难度题目,至少包含一个三角函数(sin/cos/tan),支持嵌套。 + +#### **方法:** + +generateQuestion(): 生成高中题目,确保包含三角函数。 + +AddTrigOperator(...): 添加三角函数运算符。 + +ForceAddTrigOperator(...): 若未包含三角函数,则强制添加。 + +Revise(String expression): 调整括号位置,避免语法错误。 +## 三、流程 +### 1.登录流程 +(1)用户输入用户名和密码; + +(2)系统验证身份并显示角色; + +(3)用户选择生成题目数量或切换难度; + +(4)系统生成题目并保存到用户目录。 + +### 2.题目生成流程 +(1)根据难度选择对应的生成器; + +(2)生成操作数和运算符; + +(3)添加括号和特殊运算符(初中/高中); + +(4)查重和括号合法性检查; + +(5)保存到文件,格式为 年-月-日-时-分-秒.txt。 + +### 3.文件存储结构 + src + ├── questions/ + | └── 用户名/ + | ├── 2025-09-20-10-30-45.txt + | └── 2025-09-20-10-35-22.txt + └── users.txt + +### 4.难度特征 +|难度| 运算符类型| 特殊要求| +|:---:|:---|:---| +|小学| +, -, ×, ÷| 可含括号| +|初中| +, -, ×, ÷, ², √| 至少一个平方或开方| +|高中| +, -, ×, ÷, sin, cos, tan| 至少一个三角函数,可嵌套| +## 四、运行 +### 1. Linux bash +```bash +~/src$ javac *.java +~/src$ java Start +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或先生成jar: +```bash +~/src$ javac *.java +~/src$ jar -cfve main.jar Start *.class +已添加清单 +正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2649)(压缩了 44%) +正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) +正在添加: Login.class(输入 = 5877) (输出 = 3401)(压缩了 42%) +正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) +正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) +正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) +正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) +正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) +正在添加: User.class(输入 = 1121) (输出 = 540)(压缩了 51%) +~/src$ java -jar main +Error: Unable to access jarfile main +~/src$ java -jar main.jar +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +### 2.Windows cmd + +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>java Start.java +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或 +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>javac -encoding UTF-8 *.java + +D:\src>java Start +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +或先生成jar: +```cmd +D:\src>chcp 65001 +Active code page: 65001 + +D:\src>javac -encoding UTF-8 *.java + +D:\src>jar cfve main.jar Start *.class +已添加清单 +正在添加: AbstractQuestionGenerator.class(输入 = 4777) (输出 = 2647)(压缩了 44%) +正在添加: JuniorQuestionGenerator.class(输入 = 3654) (输出 = 2095)(压缩了 42%) +正在添加: Login.class(输入 = 5877) (输出 = 3402)(压缩了 42%) +正在添加: PrimaryQuestionGenerator.class(输入 = 2048) (输出 = 1203)(压缩了 41%) +正在添加: QuestionGenerator.class(输入 = 356) (输出 = 199)(压缩了 44%) +正在添加: QuestionManager.class(输入 = 4097) (输出 = 2204)(压缩了 46%) +正在添加: SeniorQuestionGenerator.class(输入 = 4577) (输出 = 2454)(压缩了 46%) +正在添加: Start.class(输入 = 308) (输出 = 238)(压缩了 22%) +正在添加: User.class(输入 = 1121) (输出 = 539)(压缩了 51%) + +D:\src>java -jar main.jar +已创建users.txt +Loading... + +---------登录系统--------- +请输入用户名和密码(用空格隔开): +``` +### 3.Windows PowerShell +与cmd类似,只需将 +```cmd +D:\src>chcp 65001 +``` +换成 +```powershell +PS D:\src> [Console]::InputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 +``` + -- 2.34.1