You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

266 lines
8.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# **中小学数学卷子自动生成程序说明**
## 一、概述
该项目是一个基于 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
```