# MyMathQuiz_New ## 软4_李瑜清_个人项目 ## 1. 项目简介 本项目是一个基于 Java 实现的中小学数学卷子自动生成程序。程序通过命令行与用户交互,可以根据不同用户类型(小学、初中、高中)的教师账号,生成符合特定难度要求的数学题目,并将生成的卷子保存为 `.txt` 文件。 本项目严格按照《软件工程导论-个人项目需求-2025》文档的要求进行开发。 ## 2. 已实现功能 - [x] **用户登录**:支持小学、初中、高中各3个预设账号登录,并进行身份验证。 - [x] **题目生成**: - **小学难度**:生成包含 `+`, `-`, `*`, `/` 和 `()` 的四则运算题目。 - **初中难度**:生成的题目中**至少包含一个**平方或开根号运算。 - **高中难度**:生成的题目中**至少包含一个** `sin`, `cos` 或 `tan` 三角函数运算。 - [x] **题目格式**:所有生成的题目末尾都以 `=` 结尾,方便作答。 - [x] **数量控制**:支持用户输入10-30之间的整数,用于指定生成题目的数量。 - [x] **题目查重**:确保为同一位老师生成的卷子中,不会出现与历史卷子(该老师文件夹下已存在的文件)重复的题目。 - [x] **类型切换**:登录后,用户可以通过 `切换为XX` 命令动态改变当前要生成的题目类型。 - [x] **文件保存**:生成的卷子会自动保存在以用户名命名的文件夹下,文件名格式为 `年-月-日-时-分-秒.txt`。 - [x] **用户退出**:支持输入 `-1` 退出当前登录,返回登录界面。 ## 3. 如何运行 本项目最终交付的可执行文件位于 `src` 目录下。请按照以下步骤运行程序: 1. **检查Java环境** 确保您的计算机已安装 Java 8 (JDK 1.8) 或更高版本的 JRE。您可以在命令行工具中执行 `java -version` 来进行验证。 2. **启动程序** 打开您的命令行工具(如 Windows 的 CMD 或 PowerShell,macOS/Linux 的 Terminal),然后执行以下两个步骤: **第一步:进入 `.jar` 文件所在的 `src` 目录。** 您需要使用 `cd` 命令切换到 `src` 文件夹。例如,如果您的整个项目文件夹在桌面上,命令可能如下: ```bash # 这是一个示例路径,请根据您的实际情况修改 cd C:\Users\YourName\Desktop\MyMathQuiz_New\src ``` **第二步:执行 .jar 文件。** 在 `src` 目录下,运行以下命令来启动数学卷子生成程序: ```bash java -jar MyMathQuiz_New.jar ``` *(注意: `MyMathQuiz_New.jar` 是我们项目默认的打包文件名,如果您的文件名不同,请相应修改)* 成功执行后,您将在命令行看到程序的欢迎界面和登录提示。 ## 4. 代码结构 ```java . ├── doc/ # 存放说明文档 │ └── README.md └── src/ # 存放所有 Java 源代码 └── com/ └── student/ └── mathquiz/ ├── Main.java # 程序主入口和用户交互逻辑 ├── UserType.java # 用户类型枚举 (小学, 初中, 高中) ├── UserDatabase.java # 模拟数据库,负责用户账户管理与验证 ├── QuestionGenerator.java # 核心题目生成器,负责各难度题目创建 └── QuizManager.java # 文件管理器,负责卷子保存与历史题目 ``` ## 5. 开发环境 - **操作系统**: Windows - **IDE**: IntelliJ IDEA - **JDK**: Java 1.8 (Amazon Corretto 8) - **代码规范**: Google Java Style Guide - **版本控制**: Git ## 6. 项目目标与设计思路 本项目的核心目标是创建一个稳定、可靠且易于扩展的命令行数学题目生成工具。在设计上,主要遵循了以下原则: - **单一职责原则 (SRP)**:将不同的功能严格划分到不同的类中。例如,`QuestionGenerator` 只负责生成题目,`QuizManager` 只负责文件I/O,`UserDatabase` 只负责用户数据管理。这种分离使得代码更易于理解、测试和维护。 - **面向对象设计**:通过 `UserType` 枚举来管理用户类型,避免了使用“魔法字符串”(如直接用 "小学" 字符串),增强了代码的健壮性。 - **可扩展性**:项目的结构设计考虑了未来的功能扩展。例如,若要支持新的学科(如物理),只需在 `UserType` 中添加新的枚举值,并在 `QuestionGenerator` 中实现新的题目生成逻辑,而无需大规模改动现有代码。