From f90286430ed4fbc917e5e0546303633ba11ffea2 Mon Sep 17 00:00:00 2001 From: hnu202326010331 <3403517738@qq.com> Date: Sun, 28 Sep 2025 23:25:24 +0800 Subject: [PATCH 1/3] ADD file via upload --- src | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src diff --git a/src b/src new file mode 100644 index 0000000..e69de29 -- 2.34.1 From 7dc53d7ed98b20c19d93bc6d17fa117a4dadd24d Mon Sep 17 00:00:00 2001 From: hnu202326010331 <3403517738@qq.com> Date: Sun, 28 Sep 2025 23:25:46 +0800 Subject: [PATCH 2/3] 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 f107e7bd4eae0be0d9ddec4ec1fb87684f5abd86 Mon Sep 17 00:00:00 2001 From: liq <3403517738@qq.com> Date: Sun, 28 Sep 2025 23:28:18 +0800 Subject: [PATCH 3/3] 9.28 --- doc => doc/read.md | 0 src | 0 src/DifficultyLevel.java | 24 +++++ src/FileManager.java | 23 +++++ src/Main.java | 149 +++++++++++++++++++++++++++ src/QuestionGenerator.java | 201 +++++++++++++++++++++++++++++++++++++ src/QuestionPaper.java | 22 ++++ src/User.java | 20 ++++ src/untitled1.iml | 11 ++ src/untitled1.jar | Bin 0 -> 11680 bytes 10 files changed, 450 insertions(+) rename doc => doc/read.md (100%) delete mode 100644 src create mode 100644 src/DifficultyLevel.java create mode 100644 src/FileManager.java create mode 100644 src/Main.java create mode 100644 src/QuestionGenerator.java create mode 100644 src/QuestionPaper.java create mode 100644 src/User.java create mode 100644 src/untitled1.iml create mode 100644 src/untitled1.jar diff --git a/doc b/doc/read.md similarity index 100% rename from doc rename to doc/read.md diff --git a/src b/src deleted file mode 100644 index e69de29..0000000 diff --git a/src/DifficultyLevel.java b/src/DifficultyLevel.java new file mode 100644 index 0000000..42b9913 --- /dev/null +++ b/src/DifficultyLevel.java @@ -0,0 +1,24 @@ +public enum DifficultyLevel { + PRIMARY("小学"), + JUNIOR("初中"), + SENIOR("高中"); + + private String chineseName; + + DifficultyLevel(String chineseName) { + this.chineseName = chineseName; + } + + public String getChineseName() { + return chineseName; + } + + public static DifficultyLevel fromChineseName(String name) { + for (DifficultyLevel level : values()) { + if (level.chineseName.equals(name)) { + return level; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/FileManager.java b/src/FileManager.java new file mode 100644 index 0000000..76d8486 --- /dev/null +++ b/src/FileManager.java @@ -0,0 +1,23 @@ +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class FileManager { + public void savePaper(String username, DifficultyLevel level, QuestionPaper paper) { + String folderPath = "papers/" + username + "/"; + File folder = new File(folderPath); + if (!folder.exists()) { + folder.mkdirs(); + } + + String timestamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()); + String filePath = folderPath + timestamp + ".txt"; + + try (PrintWriter writer = new PrintWriter(new FileWriter(filePath))) { + writer.write(paper.getFormattedPaper()); + System.out.println("试卷已保存至: " + filePath); + } catch (IOException e) { + System.out.println("保存文件时出错: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..979c552 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,149 @@ +import java.util.*; + +public class Main { + private static Map users = new HashMap<>(); + private static Scanner scanner = new Scanner(System.in); + private static User currentUser = null; + private static QuestionGenerator generator = new QuestionGenerator(); + private static FileManager fileManager = new FileManager(); + + public static void main(String[] args) { + initializeUsers(); + showLoginPrompt(); + } + + private static void initializeUsers() { + // 小学用户 + users.put("张三1", new User("张三1", "123", DifficultyLevel.PRIMARY)); + users.put("张三2", new User("张三2", "123", DifficultyLevel.PRIMARY)); + users.put("张三3", new User("张三3", "123", DifficultyLevel.PRIMARY)); + + // 初中用户 + users.put("李四1", new User("李四1", "123", DifficultyLevel.JUNIOR)); + users.put("李四2", new User("李四2", "123", DifficultyLevel.JUNIOR)); + users.put("李四3", new User("李四3", "123", DifficultyLevel.JUNIOR)); + + // 高中用户 + users.put("王五1", new User("王五1", "123", DifficultyLevel.SENIOR)); + users.put("王五2", new User("王五2", "123", DifficultyLevel.SENIOR)); + users.put("王五3", new User("王五3", "123", DifficultyLevel.SENIOR)); + } + + /*private static void showLoginPrompt() { + System.out.println("请输入用户名和密码(用空格隔开):"); + + while (true) { + String input = scanner.nextLine().trim(); + String[] credentials = input.split(" "); + + if (credentials.length != 2) { + System.out.println("请输入正确的用户名、密码"); + continue; + } + + String username = credentials[0]; + String password = credentials[1]; + + if (authenticateUser(username, password)) { + System.out.println("当前选择为" + currentUser.getLevel().getChineseName() + "出题"); + showMainMenu(); + break; + } else { + System.out.println("请输入正确的用户名、密码"); + } + } + }*/ + + private static void showLoginPrompt() { + System.out.println("请输入用户名和密码(用空格隔开):"); + + while (true) { + String input = scanner.nextLine().trim(); + String[] credentials = input.split(" "); + + if (credentials.length != 2) { + System.out.println("请输入正确的用户名、密码"); + continue; + } + + String username = credentials[0]; + String password = credentials[1]; + + if (authenticateUser(username, password)) { + // 新增:加载该用户的历史题目 + generator.loadUserHistory(username); + System.out.println("当前选择为" + currentUser.getLevel().getChineseName() + "出题"); + showMainMenu(); + break; + } else { + System.out.println("请输入正确的用户名、密码"); + } + } + } + + private static boolean authenticateUser(String username, String password) { + User user = users.get(username); + if (user != null && user.authenticate(username, password)) { + currentUser = new User(username, password, user.getLevel()); + return true; + } + return false; + } + + private static void showMainMenu() { + while (true) { + System.out.println("准备生成" + currentUser.getLevel().getChineseName() + + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):"); + + String input = scanner.nextLine().trim(); + + if (input.equals("-1")) { + currentUser = null; + generator.clearHistory(); + showLoginPrompt(); + break; + } + + if (input.startsWith("切换为")) { + handleLevelSwitch(input); + continue; + } + + try { + int count = Integer.parseInt(input); + if (count >= 10 && count <= 30) { + generatePaper(count); + } else { + System.out.println("题目数量应在10-30之间"); + } + } catch (NumberFormatException e) { + System.out.println("请输入有效的数字或'切换为XX'命令"); + } + } + } + + private static void handleLevelSwitch(String input) { + String levelName = input.substring(3).trim(); + DifficultyLevel newLevel = DifficultyLevel.fromChineseName(levelName); + + if (newLevel != null) { + currentUser.setLevel(newLevel); + System.out.println("准备生成" + newLevel.getChineseName() + "数学题目,请输入生成题目数量"); + } else { + System.out.println("请输入小学、初中和高中三个选项中的一个"); + } + } + + private static void generatePaper(int questionCount) { + QuestionPaper paper = new QuestionPaper(); + + for (int i = 0; i < questionCount; i++) { + String question = generator.generateQuestion(currentUser.getLevel()); + paper.addQuestion(question); + } + + fileManager.savePaper(currentUser.getUsername(), currentUser.getLevel(), paper); + System.out.println("已生成" + questionCount + "道" + + currentUser.getLevel().getChineseName() + "数学题目"); + } +} diff --git a/src/QuestionGenerator.java b/src/QuestionGenerator.java new file mode 100644 index 0000000..5490d46 --- /dev/null +++ b/src/QuestionGenerator.java @@ -0,0 +1,201 @@ +import java.util.HashSet; +import java.util.Random; +import java.util.Set; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class QuestionGenerator {private Random random = new Random(); + private Set generatedQuestions = new HashSet<>(); + private Set userHistoryQuestions = new HashSet<>(); // 新增:用户历史题目 + + // 新增方法:加载用户历史题目 + public void loadUserHistory(String username) { + userHistoryQuestions.clear(); + String folderPath = "papers/" + username + "/"; + File folder = new File(folderPath); + if (!folder.exists()) return; + + File[] files = folder.listFiles((dir, name) -> name.endsWith(".txt")); + if (files == null) return; + + for (File file : files) { + try { + String content = new String(Files.readAllBytes(Paths.get(file.getPath()))); + // 提取题目(每行一个题目,格式如:1. 题目内容) + String[] lines = content.split("\n"); + for (String line : lines) { + if (line.matches("^\\d+\\.\\s+.+")) { + String question = line.substring(line.indexOf(".") + 1).trim(); + userHistoryQuestions.add(question); + } + } + } catch (IOException e) { + System.out.println("读取历史文件失败: " + file.getName()); + } + } + } + + public String generateQuestion(DifficultyLevel level) { + String question; + int attempt = 0; + do { + question = generateSingleQuestion(level); + attempt++; + if (attempt > 100) { + throw new RuntimeException("无法生成不重复的题目,请清除历史记录"); + } + } while (generatedQuestions.contains(question) || userHistoryQuestions.contains(question)); // 修改:同时检查历史题目 + + generatedQuestions.add(question); + return question; + } + + private String generateSingleQuestion(DifficultyLevel level) { + int operandCount = random.nextInt(3) + 2; // 2-4个操作数 + StringBuilder question = new StringBuilder(); + + switch (level) { + case PRIMARY: + question.append(generatePrimaryQuestion(operandCount)); + break; + case JUNIOR: + question.append(generateJuniorQuestion(operandCount)); + break; + case SENIOR: + question.append(generateSeniorQuestion(operandCount)); + break; + } + + return question.toString(); + } + + private String generatePrimaryQuestion(int operandCount) { + String[] operators = {"+", "-", "*", "/"}; + return generateBasicQuestion(operandCount, operators, false); + } + + private String generateJuniorQuestion(int operandCount) { + String question; + int attempt = 0; + do { + String[] operators = {"+", "-", "*", "/"}; + question = generateBasicQuestion(operandCount, operators, true); + + // 强制添加平方或开根号(修改点1) + question = addPowerOrRoot(question); + attempt++; + } while ((!question.contains("²") && !question.contains("√")) && attempt < 10); + + return question; + } + + private String generateSeniorQuestion(int operandCount) { + String question; + int attempt = 0; + do { + String[] operators = {"+", "-", "*", "/"}; + question = generateBasicQuestion(operandCount, operators, true); + + // 强制添加三角函数(修改点2) + question = addTrigonometricFunction(question); + attempt++; + } while ((!question.contains("sin") && !question.contains("cos") && !question.contains("tan")) && attempt < 10); + + return question; + } + + private String generateBasicQuestion(int operandCount, String[] operators, boolean useParentheses) { + if (operandCount < 2) { + // 单操作数时直接返回数字(修改点3) + return String.valueOf(getRandomNumber()); + } + + StringBuilder question = new StringBuilder(); + int num = getRandomNumber(); + question.append(num); + + for (int i = 1; i < operandCount; i++) { + String operator = operators[random.nextInt(operators.length)]; + num = getRandomNumber(); + + if (operator.equals("/")) { + num = Math.max(1, num); + } + + boolean needParentheses = useParentheses && + (operator.equals("*") || operator.equals("/")) && + i < operandCount - 1; + + if (needParentheses) { + question.insert(0, "("); + question.append(") ").append(operator).append(" ").append(num); + } else { + question.append(" ").append(operator).append(" ").append(num); + } + } + + return question.toString(); + } + + private String addPowerOrRoot(String originalQuestion) { + // 修改点4:移除长度限制,支持单操作数 + String[] parts = originalQuestion.split(" "); + + // 如果是单操作数表达式 + if (parts.length == 1) { + if (random.nextBoolean()) { + return parts[0] + "²"; + } else { + return "√(" + parts[0] + ")"; + } + } + + // 多操作数表达式 + int position = random.nextInt(parts.length); + while (position % 2 != 0) { + position = random.nextInt(parts.length); + } + + if (random.nextBoolean()) { + parts[position] = parts[position] + "²"; + } else { + parts[position] = "√(" + parts[position] + ")"; + } + + return String.join(" ", parts); + } + + private String addTrigonometricFunction(String originalQuestion) { + // 修改点5:移除长度限制,支持单操作数 + String[] parts = originalQuestion.split(" "); + + // 如果是单操作数表达式 + if (parts.length == 1) { + String[] trigFunctions = {"sin", "cos", "tan"}; + String trigFunction = trigFunctions[random.nextInt(trigFunctions.length)]; + return trigFunction + "(" + parts[0] + ")"; + } + + // 多操作数表达式 + int position = random.nextInt(parts.length); + while (position % 2 != 0) { + position = random.nextInt(parts.length); + } + + String[] trigFunctions = {"sin", "cos", "tan"}; + String trigFunction = trigFunctions[random.nextInt(trigFunctions.length)]; + parts[position] = trigFunction + "(" + parts[position] + ")"; + + return String.join(" ", parts); + } + + private int getRandomNumber() { + return random.nextInt(100) + 1; + } + + public void clearHistory() { + generatedQuestions.clear(); + } +} \ No newline at end of file diff --git a/src/QuestionPaper.java b/src/QuestionPaper.java new file mode 100644 index 0000000..f9475ab --- /dev/null +++ b/src/QuestionPaper.java @@ -0,0 +1,22 @@ +import java.util.ArrayList; +import java.util.List; + +public class QuestionPaper { + private List questions = new ArrayList<>(); + + public void addQuestion(String question) { + questions.add(question); + } + + public List getQuestions() { + return questions; + } + + public String getFormattedPaper() { + StringBuilder paper = new StringBuilder(); + for (int i = 0; i < questions.size(); i++) { + paper.append(i + 1).append(". ").append(questions.get(i)).append("\n\n"); + } + return paper.toString(); + } +} \ No newline at end of file diff --git a/src/User.java b/src/User.java new file mode 100644 index 0000000..e735188 --- /dev/null +++ b/src/User.java @@ -0,0 +1,20 @@ +public class User { + private String username; + private String password; + private DifficultyLevel level; + + public User(String username, String password, DifficultyLevel level) { + this.username = username; + this.password = password; + this.level = level; + } + + public String getUsername() { return username; } + public String getPassword() { return password; } + public DifficultyLevel getLevel() { return level; } + public void setLevel(DifficultyLevel level) { this.level = level; } + + public boolean authenticate(String inputUsername, String inputPassword) { + return this.username.equals(inputUsername) && this.password.equals(inputPassword); + } +} \ No newline at end of file diff --git a/src/untitled1.iml b/src/untitled1.iml new file mode 100644 index 0000000..b107a2d --- /dev/null +++ b/src/untitled1.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/untitled1.jar b/src/untitled1.jar new file mode 100644 index 0000000000000000000000000000000000000000..544ef0541cc71f29eef3070631d8de54d8899827 GIT binary patch literal 11680 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 YmV^AQ!2|(;{eAKOjwi)Ga%qtN1FXbCRsaA1 literal 0 HcmV?d00001 -- 2.34.1