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.
|
|
5 months ago | |
|---|---|---|
| .. | ||
| README.md | 5 months ago | |
README.md
中小学数学卷子自动生成系统
项目概述
本项目是一个基于Java开发的中小学数学卷子自动生成系统,支持小学、初中、高中三个学段的数学题目生成。系统采用面向对象设计,遵循Google Java Style Guide规范,具有完整的用户认证、题目生成、查重和文件管理功能。
【人工修改】 本项目在大模型生成基础代码后,经过人工增强优化,在原有功能基础上新增了多项功能改进,包括文件夹结构优化、题目质量提升、用户界面体验优化等,所有修改都已在代码中明确标识。
功能特性
🔐 用户认证系统
- 预设9个教师账户(小学、初中、高中各3个)
- 用户名密码验证登录
- 清晰的登录提示和错误处理
📝 题目生成功能
- 小学题目:只能有+,-,*,/和()运算符
- 初中题目:题目中至少有一个平方或开根号的运算符
- 高中题目:题目中至少有一个sin,cos或tan的运算符
- 操作数范围:1-5个,取值范围1-100
- 题目数量:10-30道题
难度要求详细说明(附表-2)
| 年级 | 难度要求 | 备注 |
|---|---|---|
| 小学 | +,-,*,/ | 只能有+,-,*,/和() |
| 初中 | 平方,开根号 | 题目中至少有一个平方或开根号的运算符 |
| 高中 | sin,cos,tan | 题目中至少有一个sin,cos或tan的运算符 |
🔄 年级切换功能
- 支持"切换为XX"命令(XX为小学、初中、高中)
- 实时切换出题模式
- 切换后自动显示新的操作菜单
🔍 题目查重功能
- 自动检测历史题目,避免重复
- 基于文件内容的去重算法
- 支持同一用户多次生成不重复题目
💾 文件管理功能
- 【人工修改】 采用三级文件夹结构:
paper/用户名/年级/ - 文件名格式:
年-月-日-时-分-秒.txt - 题目格式:带题号,题目间空行分隔
- 【人工修改】 试卷集中管理,按年级分类存储
【人工修改】功能增强说明
🚀 人工修改概述
本项目在大模型生成基础代码后,经过人工增强优化,在原有功能基础上进行了以下重要改进:
🐛 Bug修复
资源泄漏修复:
- 【人工修改】 修复了Scanner资源泄漏问题,确保程序退出时正确关闭资源
Bug修复内容:
- 【人工修改】 修复了Scanner资源泄漏问题,添加了shutdown hook确保资源正确关闭
🔧 人工修改功能详解
1. 📁 文件夹结构优化
- 修改位置:
MathQuestionGenerator.java第272-298行 - 修改前:文件直接保存在用户名文件夹中,如
张三1/2025-01-27-14-30-25.txt - 修改后:采用三级文件夹结构
paper/用户名/年级/,如paper/张三1/小学/2025-01-27-14-30-25.txt - 功能:创建paper文件夹结构,试卷集中管理
- 效果:文件按年级分类存储,结构更清晰,便于管理
- 代码标识:使用
// 【人工修改】注释标识
2. 🎯 小学题目质量提升
- 修改位置:多个文件中的常量定义和方法实现
- 修改前:小学题目可能出现单操作数,如
24(无效题目) - 修改后:小学题目最少2个操作数,如
24 + 15(有效题目) - 功能:小学题目最少2个操作数,防止出现无效题目
- 效果:不再出现单纯的数字,确保题目有效性
- 代码标识:使用
// 【人工修改】注释标识
3. 🔧 初中题目格式修复
- 修改位置:
JuniorQuestionGenerator.java第16-34行 - 修改前:初中题目可能不完整,如
24²或√36(缺少运算符) - 修改后:初中题目格式完整,如
24² + 15或√36 × 8 - 12(完整表达式) - 功能:修复平方和开方运算后缺少运算符的问题
- 效果:确保初中题目格式完整,符合数学表达式规范
- 代码标识:使用
// 【人工修改】注释标识
4. 🎨 用户界面体验优化
- 修改位置:
MathQuestionGenerator.java第196-213行 - 修改前:生成题目后或输入错误后,用户看不到操作菜单,需要重新输入
- 修改后:生成题目后和输入错误后自动重新显示操作菜单
- 功能:生成题目后和输入错误后重新显示操作菜单
- 效果:用户始终能看到可用的操作选项,界面体验更友好
- 代码标识:使用
// 【人工修改】注释标识
5. 🎯 界面交互体验优化
- 修改位置:
MathQuestionGenerator.java第245-278行、第485-501行、第199-236行 - 修改前:切换模式或生成试卷后直接显示界面,界面切换突兀
- 修改后:切换模式或生成试卷后要求按回车键继续,界面切换更自然
- 功能:在关键操作后添加"按回车键继续"提示,提升用户体验
- 效果:用户有时间阅读操作结果,界面切换更自然流畅
- 代码标识:使用
// 【人工修改】注释标识
6. 📊 去重功能增强
- 修改位置:
MathQuestionGenerator.java第363-392行 - 修改前:所有年级的历史题目混合在一起,去重可能跨年级干扰
- 修改后:按年级分别加载历史题目,去重功能更精确
- 功能:从对应的年级文件夹加载历史题目
- 效果:去重功能按年级分别进行,更加精确
- 代码标识:使用
// 【人工修改】注释标识
7. 🐛 Bug1修复:Scanner资源泄漏
- 修改位置:
MathQuestionGenerator.java第43-52行 - 修改前:Scanner资源没有正确关闭,可能导致资源泄漏
- 修改后:添加shutdown hook确保Scanner资源在程序退出时正确关闭
- 功能:修复资源泄漏问题,符合头歌质量分析要求
- 效果:确保程序退出时正确释放系统资源,避免内存泄漏
- 代码标识:使用
// 【人工修改】注释标识
技术架构
🏗️ 设计模式
- 策略模式:不同年级使用不同的题目生成策略
- 模板方法模式:抽象类定义通用方法,具体类实现特定逻辑
- 工厂模式:通过Map管理不同的生成器实例
📁 项目结构
project/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 |
使用说明
启动程序
java -cp project/src MathQuestionGenerator
操作流程
- 登录:输入用户名和密码(用空格隔开),或输入'exit'退出程序
- 查看菜单:系统显示当前可进行的操作
- 生成题目:输入数字10-30生成指定数量的题目
- 切换年级:输入"切换为XX"切换到其他年级
- 退出登录:输入"-1"退出当前用户
- 完全退出:在登录界面输入'exit'完全退出程序
操作示例
=== 用户登录 ===
请输入用户名和密码(用空格隔开),或输入 'exit' 退出程序:
> 张三1 123
登录成功!欢迎 张三1 老师
=== 操作菜单 ===
当前选择为小学出题
可进行的操作:
1. 输入数字 10-30:生成指定数量的小学数学题目
2. 输入 '切换为小学':切换到小学出题模式
3. 输入 '切换为初中':切换到初中出题模式
4. 输入 '切换为高中':切换到高中出题模式
5. 输入 '-1':退出当前用户,重新登录
请输入操作:
题目示例
小学题目
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
代码规范
📋 Google Java Style Guide合规性
- ✅ 不使用通配符导入(import java.util.*)
- ✅ 明确的类导入语句
- ✅ 符合命名约定(PascalCase、camelCase、UPPER_SNAKE_CASE)
- ✅ 4个空格缩进
- ✅ K&R风格大括号
- ✅ 完整的JavaDoc注释
- ✅ 方法长度控制在40行以内
🔍 代码质量
- 无编译错误
- 无linter警告
- 完整的异常处理
- 资源自动管理(try-with-resources)
评分标准符合性
根据项目评分标准,本系统完全符合要求:
| 评分类型 | 要求 | 实现状态 |
|---|---|---|
| 登录 | 文字提示、错误处理 | ✅ 完全符合 |
| 出题 | 年级要求、题号、换行、切换提示 | ✅ 完全符合 |
| 查重 | 去重功能、历史题目检测 | ✅ 完全符合 |
| 切换 | 年级切换、错误处理、异常处理 | ✅ 完全符合 |
| 保存 | 文件格式、路径管理 | ✅ 完全符合 |
| 代码规范 | Google Java Style Guide | ✅ 完全符合 |
| 设计合理 | 接口抽象类、类数量、方法长度 | ✅ 完全符合 |
开发环境
- Java版本:JDK 8+(我是JDK21)
- 编译工具:javac
- 运行环境:JRE 8+
- 操作系统:Windows/Linux/macOS(我是Windows)
编译和运行
编译所有文件
javac project/src/*.java
运行程序
java -cp project/src MathQuestionGenerator
文件输出
【人工修改】 程序采用三级文件夹结构,所有试卷统一存放在 paper 文件夹中:
project/
├── 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/
│ ├── 小学/
│ ├── 初中/
│ └── 高中/
└── src/ # 源代码文件
📊 评分要求对照
| 评分项目 | 要求 | 实现状态 | 说明 |
|---|---|---|---|
| 登录功能 | 有文字提示 | ✅ 已实现 | 完整的登录界面和提示信息 |
| 出题功能 | 符合难度要求 | ✅ 已实现 | 小学(+,-,*,/)、初中(平方,开根号)、高中(sin,cos,tan) |
| 出题功能 | 有题号和换行 | ✅ 已实现 | 题目自动编号,题目间空行分隔 |
| 出题功能 | 切换提示正确 | ✅ 已实现 | 切换成功/失败都有明确提示 |
| 出题功能 | 支持多次出题 | ✅ 已实现 | 可连续生成多套试卷 |
| 查重功能 | 有查重功能 | ✅ 已实现 | 完整的题目去重机制 |
| 切换功能 | 有切换功能 | ✅ 已实现 | 支持小学/初中/高中模式切换 |
| 保存功能 | 使用相对路径 | ✅ 已实现 | 文件保存在paper文件夹中 |
| 代码规范 | 符合Google规范 | ✅ 已实现 | 完全符合Google Java Style Guide |
| 设计合理性 | 有接口和抽象类 | ✅ 已实现 | 使用策略模式、模板方法模式 |
| 设计合理性 | 方法≤40行 | ✅ 已实现 | 所有方法都符合行数限制 |
| Bug修复 | 资源泄漏 | ✅ 已实现 | 修复了Scanner资源泄漏问题 |
项目特色
🎯 面向对象设计
- 清晰的类层次结构
- 良好的封装和抽象
- 易于扩展和维护
🔧 代码质量
- 完全符合Google Java Style Guide
- 完整的文档注释
- 健壮的错误处理
- 【人工修改】 修复了Scanner资源泄漏问题
- 【人工修改】 所有修改都使用
// 【人工修改】标识
🚀 用户体验
- 直观的操作界面
- 清晰的功能提示
- 友好的错误信息
- 【人工修改】 生成题目后自动显示操作菜单
- 【人工修改】 支持'exit'命令退出程序
📊 功能完整
- 满足所有评分要求
- 支持多种操作模式
- 完整的文件管理
- 【人工修改】 三级文件夹结构,试卷集中管理
- 【人工修改】 修复了资源泄漏问题,符合头歌质量分析要求
⚠️ 可能遇到的问题(主要是我自己写代码调试的时候遇到的,应该也就这一个比较容易遇到)
问题:CMD/PowerShell中中文无法识别
现象:在命令行中运行程序时,中文用户名无法正确输入或显示乱码。
原因:Windows命令行默认使用GBK编码,而Java程序使用UTF-8编码。
解决方案:
方法1:修改控制台编码(应该是可以的,但我没有成功)
# 在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:验证修改
# 检查当前代码页
chcp
# 应该显示:活动代码页: 65001
注意事项:
- 方法2是永久性修改,会影响整个系统
- 建议先尝试方法1,如果经常使用再考虑方法2
- 修改注册表前请备份重要数据
未来扩展
- 支持更多数学运算符
- 添加题目难度分级
- 实现题目答案计算
- 支持批量题目生成
- 添加题目统计分析
作者信息
- 项目类型:个人项目
- 开发语言:Java
- 设计模式:策略模式、模板方法模式、工厂模式
- 代码规范:Google Java Style Guide
- 项目状态:完成,符合评分要求
- 【人工修改】 经过人工增强优化,功能更加完善
【人工修改】代码标识说明
本项目中的所有人工修改都使用 // 【人工修改】 注释进行标识,包括:
- 文件夹结构优化:
MathQuestionGenerator.java第272-298行 - 小学题目质量提升:多个文件中的常量定义和方法实现
- 初中题目格式修复:
JuniorQuestionGenerator.java第16-34行 - 用户界面体验优化:
MathQuestionGenerator.java第196-213行 - 去重功能增强:
MathQuestionGenerator.java第363-392行 - Bug1修复:Scanner资源泄漏:
MathQuestionGenerator.java第43-52行 - 抽象类方法优化:
AbstractQuestionGenerator.java第29-41行 - 小学生成器重写:
PrimaryQuestionGenerator.java第8-12行
所有修改都已在代码中明确标识,便于识别和追踪。
本项目完全符合软件工程导论个人项目的所有要求,经过人工增强优化后功能更加完善。