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
+
+
+
+
+
+
+ (bundled)
+ (bundled)
+
+
+
+
\ 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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:.*Style
+
+ http://schemas.android.com/apk/res/android
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:layout_width
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_height
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_weight
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_margin
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginTop
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginBottom
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginStart
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginEnd
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginLeft
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_marginRight
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_.*
+
+ http://schemas.android.com/apk/res/android
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:padding
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingTop
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingBottom
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingStart
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingEnd
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingLeft
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:paddingRight
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*
+ http://schemas.android.com/apk/res/android
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+ http://schemas.android.com/apk/res-auto
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+ http://schemas.android.com/tools
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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));