diff --git a/.idea/artifacts/MathPuzzle_jar.xml b/.idea/artifacts/MathPuzzle_jar.xml new file mode 100644 index 0000000..dd95498 --- /dev/null +++ b/.idea/artifacts/MathPuzzle_jar.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/out/artifacts/MathPuzzle_jar + + + + + \ No newline at end of file diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml new file mode 100644 index 0000000..3a2b1e3 --- /dev/null +++ b/.idea/checkstyle-idea.xml @@ -0,0 +1,18 @@ + + + + 10.26.1 + JavaOnly + true + + + + \ No newline at end of file diff --git a/.idea/checkstyleidea-libs/readme.txt b/.idea/checkstyleidea-libs/readme.txt new file mode 100644 index 0000000..579f816 --- /dev/null +++ b/.idea/checkstyleidea-libs/readme.txt @@ -0,0 +1,6 @@ +This folder contains libraries copied from the "MathPuzzle" project. +It is managed by the CheckStyle-IDEA IDE plugin. +Do not modify this folder while the IDE is running. +When the IDE is stopped, you may delete this folder at any time. It will be recreated as needed. +In order to prevent the CheckStyle-IDEA IDE plugin from creating this folder, +uncheck the "Copy libraries from project directory" option in the CheckStyle-IDEA settings dialog. diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..11b084a --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,604 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..b9d18bf --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 4abb17d..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# AutoGeneratePuzzle - diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..d081805 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,153 @@ +# 数学题目生成系统项目说明文档 + +## 1. 项目概述 + +### 1.1 项目名称 +中小学数学卷子自动生成程序 (Math Puzzle System) + +### 1.2 项目简介 +数学题目生成系统是一个基于Java开发的教育类应用程序,专门用于生成不同教育级别的数学题目。系统支持小学、初中和高中三个级别的题目生成,并提供用户管理、题目去重、试卷保存等功能。 + +### 1.3 项目目标 +- 为不同教育级别的学生提供定制化的数学练习题目 +- 避免生成重复题目,提高学习效率 +- 提供用户管理功能,支持多用户使用 +- 生成的题目可保存为文件,便于打印和复习 + +## 2. 功能特性 + +### 2.1 用户管理 +- **用户注册/登录**:支持现有用户登录系统 +- **用户级别切换**:支持在小学、初中、高中三个级别间动态切换 +- **个性化存储**:为每个用户创建独立的目录存储历史题目 + +### 2.2 题目生成 +- **小学级别**:生成包含四则运算和括号的简单数学题目,且保证运算结果不会出现负数 +- **初中级别**:生成包含四则运算、平方、开根号的数学题目 +- **高中级别**:生成包含四则运算和三角函数(sin、cos、tan)的数学题目 + +### 2.3 题目去重 +- **历史题目检查**:自动检查用户历史题目,避免生成与前述txt文件中的重复题目 +- **会话内去重**:防止同一次生成过程中出现重复题目 + +### 2.4 文件管理 +- **自动目录创建**:为每个用户创建专属目录 +- **时间戳命名**:生成的试卷以时间戳命名,确保唯一性 +- **格式化输出**:题目按照标准格式:前有题号,题干之间添加一行间隔,便于阅读 + +## 3. 系统架构 + +### 3.1 核心模块 + +#### 3.1.1 控制器层 (Controller) +- `StartController`:系统主控制器,处理用户交互和系统流程控制 + +#### 3.1.2 服务层 (Service) +- `QuestionGenerator`:题目生成器接口 +- `PrimarySchoolGenerator`:小学题目生成器 +- `JuniorHighGenerator`:初中题目生成器 +- `SeniorHighGenerator`:高中题目生成器 +- `CaculatePrimary`:小学数学表达式计算器(保证结果不出现负数) +- `FileHandler`:文件处理器 +- `QuestionDeduplicator`:题目去重器 + +#### 3.1.3 实体层 (Entity) +- `User`:用户实体类,包含用户名、密码和级别信息 + +### 3.2 交互流程 +1. 用户启动程序 +2. 系统要求用户登录 +3. 用户选择题目数量和级别 +4. 系统生成相应级别的数学题目 +5. 题目去重检查 +6. 生成结果展示并保存到文件 + +## 4. 使用说明 + +### 4.1 启动程序 +```bash +java -jar .\mathpuzzle.jar +``` + +### 4.2 用户操作 +1. **登录**:输入用户名和密码进行登录 +2. **输入题目数量**:输入10-30之间的数字(输入-1退出当前用户) +3. **切换级别**:输入"切换为XX"指令切换到相应级别(如"切换为初中") +4. **查看结果**:系统生成题目并显示,同时保存到用户目录 + +### 4.3 文件结构 +``` +./ +├── [用户名]/ +│ ├── 2024-01-01-12-00-00.txt +│ ├── 2024-01-01-12-05-30.txt +│ └── ... +``` + +## 5. 技术特点 + +### 5.1 设计模式 +- **策略模式**:不同级别的题目生成器实现统一接口 +- **工厂模式**:根据用户级别动态创建相应的题目生成器 + +### 5.2 算法特色 +- **双栈算法**:用于计算小学级别的数学表达式 +- **随机生成算法**:确保题目多样性和随机性 +- **智能去重算法**:避免生成重复题目 + +### 5.3 代码规范 +- 遵循Google Java编码规范 +- 完整的Javadoc文档 +- 清晰的包结构和类设计 + +## 6. 系统要求 + +### 6.1 运行环境 +- Java 8或更高版本 +- 至少50MB可用磁盘空间(用于存储题目文件) + +### 6.2 权限要求 +- 需要文件读写权限(用于创建用户目录和保存题目文件) + +## 7. 扩展性说明 + +### 7.1 可扩展功能 +- 支持更多教育级别的题目生成 +- 添加更多数学运算符和函数 +- 实现题目难度分级 +- 增加图形界面支持 + +### 7.2 代码扩展 +- 通过实现`QuestionGenerator`接口添加新的题目生成器 +- 通过继承或修改现有生成器类调整题目生成规则 +- 扩展用户实体类添加更多用户属性 + +## 8. 项目维护 + +### 8.1 代码维护 +- 遵循单一职责原则,每个类只负责特定功能 +- 使用接口编程,便于功能扩展和替换 +- 完整的异常处理机制 + +### 8.2 版本管理 +- 建议使用Git进行版本控制 +- 遵循语义化版本控制规范 +- 定期备份重要数据文件 + +## 9. 注意事项 + +1. 题目数量限制在10-30道之间,确保生成效率 +2. 系统会自动过滤负数结果,确保题目合理性 +3. 生成的题目文件会自动保存,建议定期清理过期文件 +4. 初中和高中题目包含高级运算符,需要相应的数学知识 +5. 设置循环上限,在无法生成完全不重复的题目时自动退出并给出错误信息 + +## 10. 联系方式 + +如需技术支持或功能定制,请联系项目维护者。 + +--- + +**版本**:1.0 +**最后更新**:2025年 +**文档状态**:正式版 \ No newline at end of file diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF new file mode 100644 index 0000000..79eb620 --- /dev/null +++ b/src/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: mathpuzzle.Main + diff --git a/src/mathpuzzle/controller/StartController.java b/src/mathpuzzle/controller/StartController.java index e790c72..757f7d6 100644 --- a/src/mathpuzzle/controller/StartController.java +++ b/src/mathpuzzle/controller/StartController.java @@ -24,13 +24,19 @@ import mathpuzzle.system.LogSystem; */ public class StartController { - /** 日志系统,用于用户登录和管理。 */ + /** + * 日志系统,用于用户登录和管理。 + */ private LogSystem logSystem = new LogSystem(); - /** 去重器,用于避免生成重复的数学题目。 */ + /** + * 去重器,用于避免生成重复的数学题目。 + */ private QuestionDeduplicator deduplicator = new QuestionDeduplicator(); - /** 文件处理器,用于保存生成的题目试卷。 */ + /** + * 文件处理器,用于保存生成的题目试卷。 + */ private FileHandler fileHandler = new FileHandler(); /** @@ -78,7 +84,7 @@ public class StartController { *

当用户输入格式为"切换为XX"的指令时,该方法会解析并切换用户的学习级别。 * 支持的级别包括:小学、初中、高中。 * - * @param user 当前登录的用户对象 + * @param user 当前登录的用户对象 * @param input 用户输入的字符串 */ private void handleLevelSwitch(User user, String input) { @@ -121,7 +127,7 @@ public class StartController { *

该方法负责生成指定数量的不重复数学题目,使用去重器避免与历史题目重复, * 并将生成的题目保存到文件中。 * - * @param user 当前用户对象 + * @param user 当前用户对象 * @param count 需要生成的题目数量 * @throws IOException 当文件保存过程中发生错误时抛出 */ @@ -132,48 +138,36 @@ public class StartController { System.out.println("不支持的题目类型: " + user.getLevel()); return; } - // 加载该用户所有历史题目用于查重 deduplicator.loadExistingQuestions(user); - List finalQuestions = new ArrayList<>(); int generatedCount = 0; int maxAttempts = 1000; // 防止因题目空间耗尽而无限循环 int attempts = 0; - while (generatedCount < count && attempts < maxAttempts) { attempts++; - // 临时生成一个题目列表(这里可以优化为一次生成一个) List tempQuestions = generator.generateQuestions(1); if (tempQuestions.isEmpty()) { continue; } - String newQuestion = tempQuestions.get(0); - // 移除末尾的 " =" 以便查重更准确(可选,取决于你如何存储历史题) String questionForDedup = newQuestion.endsWith(" =") ? newQuestion.substring(0, newQuestion.length() - 2) : newQuestion; - if (!deduplicator.isDuplicate(questionForDedup)) { // 题目不重复,加入最终列表和查重集 finalQuestions.add(newQuestion); deduplicator.addQuestion(questionForDedup); // 加入本次会话的查重集,防止本次生成重复 generatedCount++; - //System.out.println("生成一道题目"); } // 如果重复,则丢弃,循环继续 } - if (generatedCount < count) { System.out.println( "警告:在尝试了 " + maxAttempts + " 次后,仅生成了 " + generatedCount + " 道不重复的题目。"); } - - // 显示并保存题目 for (int i = 0; i < finalQuestions.size(); i++) { System.out.println((i + 1) + ". " + finalQuestions.get(i)); } - fileHandler.savePaper(user, finalQuestions); System.out.println("试卷已成功保存!"); } diff --git a/src/mathpuzzle/service/SeniorHighGenerator.java b/src/mathpuzzle/service/SeniorHighGenerator.java index 79f7c22..eb6acbb 100644 --- a/src/mathpuzzle/service/SeniorHighGenerator.java +++ b/src/mathpuzzle/service/SeniorHighGenerator.java @@ -50,7 +50,6 @@ public class SeniorHighGenerator implements QuestionGenerator { int operandCount = random.nextInt(5) + 1; parts = generateBase(operandCount, parts); String advancedOp; - // hasAdvancedOp用以检测下面的循环是否加入了高级运算符,如果没有就启动保底 if (operandCount == 1) { advancedOp = TRIG_FUNCS[random.nextInt(TRIG_FUNCS.length)]; parts.set(0, advancedOp + parts.get(0));