|
|
|
|
@ -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
|
|
|
|
|
```
|
|
|
|
|
|