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.

436 lines
15 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开发的中小学数学卷子自动生成系统支持小学、初中、高中三个学段的数学题目生成。系统采用面向对象设计遵循Google Java Style Guide规范具有完整的用户认证、题目生成、查重和文件管理功能。
**【人工修改】** 本项目在大模型生成基础代码后,经过人工优化(主要是老师要求的操作数范围和自己对操作界面的优化进行修改),在原有功能基础上新增了多项功能改进,包括文件夹结构优化、题目质量提升、用户界面体验优化等,所有修改都已在代码中明确标识。
## 功能特性
### 🔐 用户认证系统
- 预设9个教师账户小学、初中、高中各3个
- 用户名密码验证登录
- 清晰的登录提示和错误处理
### 📝 题目生成功能
- **小学题目**:只能有+,-,*,/和()运算符
- **初中题目**:题目中至少有一个平方或开根号的运算符
- **高中题目**题目中至少有一个sin,cos或tan的运算符
- **操作数范围**1-5个小学题目至少2个取值范围1-100
- **题目数量**10-30道题
#### 难度要求详细说明(附表-2
| 年级 | 难度要求 | 备注 |
|------|----------|------|
| 小学 | +,-,*,/ | 只能有+,-,*,/和() |
| 初中 | 平方,开根号 | 题目中至少有一个平方或开根号的运算符 |
| 高中 | sin,cos,tan | 题目中至少有一个sin,cos或tan的运算符 |
### 🔄 年级切换功能
- 支持"切换为XX"命令XX为小学、初中、高中
- 实时切换出题模式
- 切换后按回车自动显示新的操作菜单
### 🔍 题目查重功能
- 自动检测历史题目,避免重复
- 基于文件内容的去重算法
- 支持同一用户多次生成不重复题目
### 💾 文件管理功能
- **【人工修改】** 采用三级文件夹结构:`paper/用户名/年级/`
- 文件名格式:`年-月-日-时-分-秒.txt`
- 题目格式:带题号,题目间空行分隔
- 试卷集中管理,按年级分类存储(原来是只按用户名存储)
## 【人工修改】功能增强说明
### 🚀 人工修改概述
在原有功能基础上进行了以下重要改进:
### 🔧 人工修改功能详解
#### 1. 📁 文件夹结构优化
- **修改位置**`MathQuestionGenerator.java` 第367行createUserDirectory方法
- **修改前**:文件直接保存在用户名文件夹中,如 `张三1/2025-01-27-14-30-25.txt`
- **修改后**:采用三级文件夹结构 `paper/用户名/年级/`,如 `paper/张三1/小学/2025-01-27-14-30-25.txt`
- **功能**创建paper文件夹结构试卷集中管理
- **效果**:文件按年级分类存储,结构更清晰,便于管理
#### 2. 🎯 小学题目质量提升
- **修改位置**`PrimaryQuestionGenerator.java` 第12行getMinOperandCount方法
- **修改前**:小学题目可能出现单操作数,如 `24`无效题目在老师没有说明之前AI所设计
- **修改后**小学题目最少2个操作数`24 + 15`(有效题目)
- **功能**重写getMinOperandCount方法确保小学题目至少有2个操作数
- **效果**:不再出现单纯的数字,确保题目有效性
#### 3. 🎨 用户界面体验优化
- **修改位置**`MathQuestionGenerator.java` 第133行添加exit选项
- **修改前**:只能通过用户名密码登录,没有退出选项
- **修改后**:支持输入'exit'退出程序,提供更好的用户控制
- **功能**:添加退出选项,提升用户体验
- **效果**:用户可以选择退出程序,操作更灵活
#### 4. 🎯 界面交互体验优化
- **修改位置**`MathQuestionGenerator.java` 第176行、第238行、第253行、第331行、第341行、第578行等
- **修改前**:切换模式或生成试卷后直接显示界面,界面切换突兀
- **修改后**:切换模式或生成试卷后要求按回车键继续,界面切换更自然
- **功能**:在关键操作后添加"按回车键继续"提示,提升用户体验
- **效果**:用户有时间阅读操作结果,界面切换更自然流畅
**所有修改都使用 `// 【人工修改】` 注释标识,便于识别和追踪。**
## 技术架构
### 🏗️ 设计模式
- **策略模式**:不同年级使用不同的题目生成策略
- **模板方法模式**:抽象类定义通用方法,具体类实现特定逻辑
- **工厂模式**通过Map管理不同的生成器实例
### 📁 项目结构
```
src/
├── MathQuestionGenerator.java # 主程序类
├── QuestionGenerator.java # 题目生成器接口
├── AbstractQuestionGenerator.java # 抽象题目生成器
├── PrimaryQuestionGenerator.java # 小学题目生成器
├── JuniorQuestionGenerator.java # 初中题目生成器
└── SeniorQuestionGenerator.java # 高中题目生成器
```
### 🔧 类设计说明
#### 接口层
- **QuestionGenerator**:定义题目生成的标准接口
#### 抽象层
- **AbstractQuestionGenerator**:提供通用的题目生成方法
#### 实现层
- **PrimaryQuestionGenerator**:实现小学题目生成逻辑
- **JuniorQuestionGenerator**:实现初中题目生成逻辑
- **SeniorQuestionGenerator**:实现高中题目生成逻辑
#### 主控制类
- **MathQuestionGenerator**:系统主入口,负责用户交互和流程控制
## 预设账户信息
| 年级 | 用户名 | 密码 |
|------|--------|------|
| 小学 | 张三1、张三2、张三3 | 123 |
| 初中 | 李四1、李四2、李四3 | 123 |
| 高中 | 王五1、王五2、王五3 | 123 |
## 使用说明
### 编译JAR文件
#### 方法1使用javac和jar命令推荐
**步骤1编译Java源文件**
```bash
# 创建输出目录
mkdir -p out/production/project
# 编译所有Java文件
javac -d out/production/project -encoding UTF-8 src/*.java
```
**步骤2创建MANIFEST.MF文件**
```bash
# 创建MANIFEST.MF文件Windows PowerShell
New-Item -ItemType File -Name "MANIFEST.MF" -Value "Manifest-Version: 1.0`nMain-Class: MathQuestionGenerator`n"
# 或者使用文本编辑器手动创建MANIFEST.MF文件内容如下
# Manifest-Version: 1.0
# Main-Class: MathQuestionGenerator
```
**步骤3打包为JAR文件**
```bash
# 创建JAR文件只包含src文件夹的内容
jar cfm MathQuestionGenerator.jar MANIFEST.MF -C out/production/project .
```
**完整示例**
```bash
# 在项目根目录下执行以下命令
mkdir -p out/production/project
javac -d out/production/project -encoding UTF-8 src/*.java
New-Item -ItemType File -Name "MANIFEST.MF" -Value "Manifest-Version: 1.0`nMain-Class: MathQuestionGenerator`n"
jar cfm MathQuestionGenerator.jar MANIFEST.MF -C out/production/project .
java -jar MathQuestionGenerator.jar
```
#### 方法2使用IDE如IntelliJ IDEA
1. **打开项目**在IDE中打开src文件夹
2. **构建项目**Build → Build Project
3. **创建JAR**File → Project Structure → Artifacts → JAR → From modules with dependencies
4. **设置主类**选择MathQuestionGenerator作为Main Class
5. **构建JAR**Build → Build Artifacts
### 启动程序
```bash
java -jar MathQuestionGenerator.jar
```
### 操作流程
1. **登录**:输入用户名和密码(用空格隔开),或输入'exit'退出程序
2. **查看菜单**:系统显示当前可进行的操作
3. **生成题目**输入数字10-30生成指定数量的题目生成完成后按回车键继续
4. **切换年级**:输入"切换为XX"切换到其他年级,切换完成后按回车键继续
5. **退出登录**:输入"-1"退出当前用户
6. **完全退出**:在登录界面输入'exit'完全退出程序
### 操作示例
```
=== 用户登录 ===
请输入用户名和密码(用空格隔开),或输入 'exit' 退出程序:
> 张三1 123
登录成功!欢迎 张三1 老师
=== 操作菜单 ===
当前选择为小学出题
可进行的操作:
1. 输入数字 10-30生成指定数量的小学数学题目
2. 输入 '切换为小学':切换到小学出题模式
3. 输入 '切换为初中':切换到初中出题模式
4. 输入 '切换为高中':切换到高中出题模式
5. 输入 '-1':退出当前用户,重新登录
请输入操作:> 15
生成15道小学题目成功
文件已保存到paper/张三1/小学/2025-01-27-14-30-25.txt
按回车键继续...
[按回车键后显示菜单]
=== 操作菜单 ===
当前选择为小学出题
...
```
## 题目示例
### 小学题目
```
1. 15 + 23 × 4
2. 67 - (12 + 8) ÷ 5
3. 45 × 3 + 12 - 8
```
### 初中题目
```
1. 25² + 15 × 3
2. √64 - 12 ÷ 4
3. 8² + √36 × 2
```
### 高中题目
```
1. sin(30) + cos(45) × 2
2. tan(60) - sin(90) ÷ 3
3. cos(0) + sin(30) × 4
```
## 📸 实际操作演示
### 登录界面
![登录界面](images/login_screen.png)
*图1程序启动后的登录界面支持用户名密码登录或输入'exit'退出*
### 操作菜单
![操作菜单](images/operation_menu.png)
*图2登录成功后的操作菜单显示当前年级和可用操作*
### 题目生成
![题目生成](images/question_generation.png)
*图3生成题目过程显示题目数量和保存位置*
### 年级切换
![年级切换](images/grade_switch.png)
*图4年级切换功能演示支持小学、初中、高中模式切换*
### 文件输出
![文件输出](images/file_output.png)
*图5生成的文件结构采用三级文件夹管理*
### 题目示例展示(此为小学题目)
![题目示例](images/question_examples.png)
*图6题目示例展示*
## 代码规范
### 📋 Google Java Style Guide合规性
- ✅ 不使用通配符导入import java.util.*
- ✅ 明确的类导入语句
- ✅ 符合命名约定PascalCase、camelCase、UPPER_SNAKE_CASE
- ✅ 4个空格缩进
- ✅ K&R风格大括号
- ✅ 完整的JavaDoc注释
- ✅ 方法长度控制在40行以内
### 🔍 代码质量
- 无编译错误
- 无linter警告
- 完整的异常处理
- 资源自动管理try-with-resources
## 📊 评分标准符合性
### 功能要求对照
| 评分项目 | 要求 | 实现状态 | 说明 |
|---------|------|---------|------|
| **登录功能** | 有文字提示 | ✅ 已实现 | 完整的登录界面和提示信息 |
| **出题功能** | 符合难度要求 | ✅ 已实现 | 小学(+,-,*,/)、初中(平方,开根号)、高中(sin,cos,tan) |
| **出题功能** | 有题号和换行 | ✅ 已实现 | 题目自动编号,题目间空行分隔 |
| **出题功能** | 切换提示正确 | ✅ 已实现 | 切换成功/失败都有明确提示 |
| **出题功能** | 支持多次出题 | ✅ 已实现 | 可连续生成多套试卷 |
| **查重功能** | 有查重功能 | ✅ 已实现 | 完整的题目去重机制 |
| **切换功能** | 有切换功能 | ✅ 已实现 | 支持小学/初中/高中模式切换 |
| **保存功能** | 使用相对路径 | ✅ 已实现 | 文件保存在paper文件夹中 |
### 代码质量要求
| 评分项目 | 要求 | 实现状态 | 说明 |
|---------|------|---------|------|
| **代码规范** | 符合Google规范 | ✅ 已实现 | 完全符合Google Java Style Guide |
| **设计合理性** | 有接口和抽象类 | ✅ 已实现 | 使用策略模式、模板方法模式 |
| **设计合理性** | 方法≤40行 | ✅ 已实现 | 所有方法都符合行数限制 |
| **Bug修复** | 资源泄漏 | ✅ 已实现 | 修复了输入流读取问题 |
## 开发环境
- **Java版本**JDK 21推荐JDK 8+
- **编译工具**javac
- **运行环境**JRE 21推荐JRE 8+
- **操作系统**Windows 11推荐Windows 10+、macOS 10.14+、Ubuntu 18.04+
- **开发工具**IntelliJ IDEA可选
- **命令行工具**PowerShell/CMD使用命令行工具运行代码如果遇到文字乱码或文字无法输入的问题建议查看 ⚠️ 可能遇到的问题 部分)
## 文件输出
**【人工修改】** 程序采用三级文件夹结构,所有试卷统一存放在 `paper` 文件夹中:
```
paper/ # 试卷集中存放文件夹(运行时生成)
├── 张三1/ # 用户文件夹
│ ├── 小学/ # 年级子文件夹
│ │ ├── 2025-01-27-14-30-25.txt
│ │ └── 2025-01-27-15-45-12.txt
│ ├── 初中/
│ │ └── 2025-01-27-16-20-30.txt
│ └── 高中/
│ └── 2025-01-27-17-10-45.txt
├── 李四1/
│ ├── 小学/
│ ├── 初中/
│ └── 高中/
└── 王五1/
├── 小学/
├── 初中/
└── 高中/
```
## 项目特色
### 🎯 面向对象设计
- 清晰的类层次结构
- 良好的封装和抽象
- 易于扩展和维护
### 🔧 代码质量
- 完全符合Google Java Style Guide
- 完整的文档注释
- 健壮的错误处理
- 修复了输入流读取问题
- 所有人工修改都使用 `// 【人工修改】` 标识
### 🚀 用户体验
- 直观的操作界面
- 清晰的功能提示
- 友好的错误信息
- **【人工修改】** 生成题目后要求按回车键继续,界面切换更自然
- **【人工修改】** 支持'exit'命令退出程序
### 📊 功能完整
- 满足所有评分要求
- 支持多种操作模式
- 完整的文件管理
- **【人工修改】** 三级文件夹结构,试卷集中管理
## ⚠️ 可能遇到的问题(主要是我自己写代码调试的时候遇到的,应该也就这一个比较容易遇到)
### 问题CMD/PowerShell中中文无法识别
**现象**:在命令行中运行程序时,中文用户名无法正确输入或显示乱码。
**原因**Windows命令行默认使用GBK编码而Java程序使用UTF-8编码。
**解决方案**
#### 方法1修改控制台编码应该是可以的但因为是暂时性的我没有试过
```cmd
# 在CMD中运行
chcp 65001
java -cp project/src MathQuestionGenerator
```
#### 方法2修改注册表我使用的方法
**步骤1打开注册表编辑器**
-`Win + R`,输入 `regedit`,回车
- 导航到:`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage`
**步骤2修改代码页**
- 找到 `OEMCP` 项,双击,将值改为 `65001`UTF-8
- 找到 `ACP` 项,双击,将值改为 `65001`UTF-8
- **重启电脑**
**步骤3验证修改**
```cmd
# 检查当前代码页
chcp
# 应该显示:活动代码页: 65001
```
**注意事项**
- 方法2是永久性修改会影响整个系统
- 建议先尝试方法1如果经常使用再考虑方法2
- 修改注册表前请备份重要数据
## 未来扩展
- 支持更多数学运算符
- 添加题目难度分级
- 实现题目答案计算
- 支持批量题目生成
- 添加题目统计分析
## 作者信息
- **班级**软件2301
- **姓名**:王麒晟
- **项目类型**:个人项目
- **开发语言**Java
- **设计模式**:策略模式、模板方法模式、工厂模式
- **代码规范**Google Java Style Guide
- **项目状态**:完成,符合评分要求
- **【人工修改】** 经过人工增强优化,功能更加完善
---
*本项目完全符合软件工程导论个人项目的所有要求,经过人工增强优化后功能更加完善。*