From 3db49a45fb9ed75d78783e514d950604c90c1c3b Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 25 Sep 2025 19:35:23 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/README.md | 50 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/doc/README.md b/doc/README.md index da4ee2d..ffbbd28 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,18 +1,44 @@ # 中小学数学卷子自动生成程序 -## 功能概览 -- 账户登录:支持小学、初中、高中各三位教师账号,登录成功提示当前难度。 -- 出题控制:支持输入 10-30 道题的数量限制,-1 退出当前登录。 -- 题目生成:根据难度生成符合运算规则的题目,并保证不与历史题库重复。 -- 难度切换:输入 `切换为小学|初中|高中` 可即时切换出题类型。 -- 结果保存:按 `YYYY-MM-DD-HH-mm-ss.txt` 格式保存在 `generated_questions/<用户名>/` 目录下,题号与空行符合要求。 +## 项目简介 +本项目提供一个命令行工具,为小学、初中和高中三个难度层级的教师批量生成数学试题。程序支持账号登录、难度切换、去重出题与试卷归档,便于教师快速准备不同难度的练习卷。 -## 使用方式 -1. 在项目根目录执行 `javac $(find src -name '*.java') -d out` 完成编译。 -2. 执行 `java -cp out com.personalproject.MathExamApplication` 启动程序。 -3. 根据提示输入用户名、密码(以空格分隔)。 -4. 输入题目数量或切换命令生成试题,生成完成后可继续出题或输入 `-1` 退出当前账号。 -5. 登录新账号或结束程序(直接回车结束输入即可退出)。 +## 核心特性 +- 登录鉴权:内置九个教师账号,登录后自动匹配题目难度。 +- 统一接口:`QuestionGenerator` 接口抽象题目生成行为,三种学段实现类分别负责小学、初中、高中题目生成,便于扩展新的学段。 +- 去重出题:`QuestionGenerationService` 在题目生成前加载账号历史题库,并在生成过程中对照 `Set` 做查重,确保同一账号生成的题目不重复。 +- 多轮出题:同一账号可在一次登录会话中多次生成试题,历史集合会随着新题目更新,避免再生成到旧题。 +- 结果持久化:`QuestionStorageService` 以 `generated_questions/<用户名>/` 为根目录,按时间戳创建 `YYYY-MM-DD-HH-mm-ss.txt` 文件保存题目,格式包含题号与空行。 +- 难度切换:输入 `切换为小学|初中|高中` 即可在登录状态下转换出题难度。 + +## 运行指南 +1. 在项目根目录编译源码: + ```bash + javac $(find src -name '*.java') -d out + ``` +2. 启动命令行程序: + ```bash + java -cp out com.personalproject.MathExamApplication + ``` +3. 按提示输入“用户名 密码”(空格分隔)。示例:`张三1 123`。 +4. 登录后根据提示输入题目数量(10-30 之间)生成试卷,或输入 `切换为小学|初中|高中` 调整难度,输入 `-1` 退出当前账号。 +5. 程序在 `generated_questions/<用户名>/` 目录下生成文本文件,可重复登录查看或继续生成。 + +## 模块结构概览 +- `com.personalproject.MathExamApplication`:程序入口,负责登录流程、命令解析与服务编排。 +- `com.personalproject.auth`:账户仓库与账号模型,封装登录验证逻辑。 +- `com.personalproject.generator`:题目生成接口与各学段实现。 +- `com.personalproject.service.QuestionGenerationService`:批量生成题目、查重与尝试次数控制。 +- `com.personalproject.storage.QuestionStorageService`:题目读取、去重资源加载与结果落盘。 +- `com.personalproject.model.DifficultyLevel`:难度枚举,提供展示名称与解析能力。 + +## 查重原理 +1. 登录成功后,应用调用 `QuestionStorageService.loadExistingQuestions(username)`,读取该账号历史文件,去除题号后存入集合。 +2. 生成新题目时,`QuestionGenerationService.generateUniqueQuestions` 会在每次生成后检查: + - 是否出现在历史集合; + - 是否在当前批次已出现。 + 不满足条件的题目将被丢弃并重新生成,最多尝试 10,000 次。 +3. 成功生成题目后,应用写入文件并将新题加入历史集合,确保后续批次继续去重。 ## 目录结构 ``` -- 2.34.1 From 88ae2ed5bbaf62945156221ace52bcb200185003 Mon Sep 17 00:00:00 2001 From: John Doe Date: Thu, 25 Sep 2025 19:39:18 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B0=8F=E5=AD=A6?= =?UTF-8?q?=E9=A2=98=E7=9B=AE=E5=87=BA=E9=A2=98=E9=80=BB=E8=BE=91,?= =?UTF-8?q?=E4=BF=9D=E8=AF=81=E8=87=B3=E5=B0=91=E4=B8=A4=E4=B8=AA=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../personalproject/generator/PrimaryQuestionGenerator.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/personalproject/generator/PrimaryQuestionGenerator.java b/src/com/personalproject/generator/PrimaryQuestionGenerator.java index bfa5da6..ec209e2 100644 --- a/src/com/personalproject/generator/PrimaryQuestionGenerator.java +++ b/src/com/personalproject/generator/PrimaryQuestionGenerator.java @@ -10,7 +10,8 @@ public final class PrimaryQuestionGenerator implements QuestionGenerator { @Override public String generateQuestion(Random random) { - int operandCount = random.nextInt(5) + 1; + // 至少生成两个操作数,避免题目退化成单个数字 + int operandCount = random.nextInt(4) + 2; StringBuilder builder = new StringBuilder(); for (int index = 0; index < operandCount; index++) { if (index > 0) { -- 2.34.1