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.

60 lines
3.6 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.

### **项目概述:中小学数学卷子自动生成程序**
这是一个面向中小学数学老师的命令行应用程序。其核心目标是根据教师的账户类型(小学、初中、高中),自动生成符合特定难度要求的数学练习题,并将其保存为文本文件,同时提供用户管理、难度切换和题目查重等辅助功能。
本项目的设计思路均由本人完成ai对于ui方面技术提供了意见支持。
#### **一、 大概功能 **
1. **用户认证系统 **
* 通过命令行输入用户名和密码进行登录。
* 系统预设了小学、初中、高中三类账户。
* 登录成功后,系统会根据账户类型自动设定默认的出题难度。
2. **分级题目生成**
* 用户可指定生成题目的数量10-30题
* 程序会根据当前选择的难度级别(小学、初中、高中)生成题目:
* **小学:** 包含 `+`, `-`, `*`, `/` 以及括号 `()` 的基本四则运算。
* **初中:** 在小学基础上,题目中至少包含一个**平方**或**开根号**运算。
* **高中:** 在初中基础上,题目中至少包含一个**三角函数**`sin`, `cos`, `tan`)。
3. **题目查重机制 **
* 为确保练习的新鲜度,系统会检查新生成的题目。
* 确保同一个老师账户下,新生成的卷子中的题目不与该老师历史上所有已生成文件中的题目重复。
4. **动态难度切换**
* 登录后,用户可以通过特定命令(如 `切换为 高中`)临时改变出题的难度级别,而无需重新登录。
5. **文件保存与管理**
* 生成的题目集将以 `年-月-日-时-分-秒.txt` 的格式命名,确保文件名唯一。
* 每个用户拥有一个独立的文件夹,用于存放其生成的所有题目文件,便于管理和查重。
#### **二、 Java 相关技术栈 **
1. **输入与输出 :**
* **`java.util.Scanner`:** 用于接收和解析来自命令行的用户输入(如用户名、密码、题目数量、切换指令等)。
* **`java.io``java.nio` API:** 用于文件操作。
* `File`: 创建用户目录、读写文件。
* `FileWriter` / `BufferedWriter`: 将生成的题目高效地写入 `.txt` 文件。
* `FileReader` / `BufferedReader`: 在执行查重功能时,读取历史题目文件。
2. **数据结构与集合 **
* **`java.util.Map` (如 `HashMap`):** 非常适合用于存储和快速查找预设的用户账户信息(用户名 -> 密码,用户名 -> 账户类型)。
* **`java.util.Set` (如 `HashSet`):** 查重功能的核心。在生成新题目之前,将该用户历史文件中的所有题目加载到一个 `Set` 中,可以利用其 `O(1)` 的平均时间复杂度快速判断新题目是否已存在。
* **`java.util.List` (如 `ArrayList`):** 用于临时存储一轮新生成的题目,便于后续处理和写入文件。
3. **数学与随机数 **
* **`java.util.Random`:** 用于生成随机数(作为题目中的操作数)和随机选择运算符,是题目多样性的关键。
* **`java.lang.Math`:** 提供 `Math.sqrt()` (开根号), `Math.pow()` (平方), 以及 `Math.sin()`, `Math.cos()`, `Math.tan()` 等三角函数运算。
4. **日期与时间 (Date & Time):**
* **`java.time.LocalDateTime`:** 获取当前的精确年、月、日、时、分、秒。
* **`java.time.format.DateTimeFormatter`:** 将 `LocalDateTime` 对象格式化为需求中指定的文件名字符串(`"yyyy-MM-dd-HH-mm-ss"`)。