# 中小学数学卷子自动生成系统 ## 项目概述 本项目是一个基于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 - **项目状态**:完成,符合评分要求 - **【人工修改】** 经过人工增强优化,功能更加完善 --- *本项目完全符合软件工程导论个人项目的所有要求,经过人工增强优化后功能更加完善。*