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.
Rumia 4795e20204
wqs
5 months ago
..
README.md wqs 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

操作流程

  1. 登录:输入用户名和密码(用空格隔开),或输入'exit'退出程序
  2. 查看菜单:系统显示当前可进行的操作
  3. 生成题目输入数字10-30生成指定数量的题目
  4. 切换年级:输入"切换为XX"切换到其他年级
  5. 退出登录:输入"-1"退出当前用户
  6. 完全退出:在登录界面输入'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 项,双击,将值改为 65001UTF-8
  • 找到 ACP 项,双击,将值改为 65001UTF-8
  • 重启电脑

步骤3验证修改

# 检查当前代码页
chcp
# 应该显示:活动代码页: 65001

注意事项

  • 方法2是永久性修改会影响整个系统
  • 建议先尝试方法1如果经常使用再考虑方法2
  • 修改注册表前请备份重要数据

未来扩展

  • 支持更多数学运算符
  • 添加题目难度分级
  • 实现题目答案计算
  • 支持批量题目生成
  • 添加题目统计分析

作者信息

  • 项目类型:个人项目
  • 开发语言Java
  • 设计模式:策略模式、模板方法模式、工厂模式
  • 代码规范Google Java Style Guide
  • 项目状态:完成,符合评分要求
  • 【人工修改】 经过人工增强优化,功能更加完善

【人工修改】代码标识说明

本项目中的所有人工修改都使用 // 【人工修改】 注释进行标识,包括:

  1. 文件夹结构优化MathQuestionGenerator.java 第272-298行
  2. 小学题目质量提升:多个文件中的常量定义和方法实现
  3. 初中题目格式修复JuniorQuestionGenerator.java 第16-34行
  4. 用户界面体验优化MathQuestionGenerator.java 第196-213行
  5. 去重功能增强MathQuestionGenerator.java 第363-392行
  6. Bug1修复Scanner资源泄漏MathQuestionGenerator.java 第43-52行
  7. 抽象类方法优化AbstractQuestionGenerator.java 第29-41行
  8. 小学生成器重写PrimaryQuestionGenerator.java 第8-12行

所有修改都已在代码中明确标识,便于识别和追踪。


本项目完全符合软件工程导论个人项目的所有要求,经过人工增强优化后功能更加完善。