Compare commits

...

4 Commits

@ -1,2 +1,235 @@
# yuxiuhui
# 数学题目生成系统介绍文档
## 一、系统概述
本系统是一个基于 Java 实现的数学题目生成系统,支持不同学段(小学、初中、高中)的用户登录后生成对应难度的数学题目,并提供用户管理、密码修改、难度切换等功能。系统会为每个用户保存历史题目,确保生成的题目不重复。
## **二、标准 Maven 目录结构**
math-problem-generator/ # 项目根目录
├── pom.xml # Maven核心配置文件依赖管理、构建插件等
├── src/
│ ├── main/
│ │ ├── java/ # 主程序Java源代码目录
│ │ │ └── com/
│ │ │ └── math/
│ │ │ ├── auth/ # 用户认证模块对应原auth包
│ │ │ │ ├── User.java
│ │ │ │ └── UserManager.java
│ │ │ ├── generator/ # 题目生成模块对应原generator包
│ │ │ │ ├── ProblemGenerator.java
│ │ │ │ ├── PrimaryGenerator.java
│ │ │ │ ├── MiddleGenerator.java
│ │ │ │ └── HighGenerator.java
│ │ │ ├── util/ # 工具类模块对应原util包
│ │ │ │ ├── FileUtils.java
│ │ │ │ ├── ModifyPassword.java
│ │ │ │ ├── CreateUser.java
│ │ │ │ ├── ModifyClass.java
│ │ │ │ └── Menu.java # 规范类名首字母大写
│ │ │ └── Main.java # 主程序入口(程序启动类)
│ │ └── resources/ # 资源文件目录(配置文件、静态资源等)
│ │ ├── config/ # 配置文件目录
│ │ │ └── system.properties # 系统配置(如题目保存路径、默认学段等)
│ │ └── templates/ # 模板文件目录(可选,如题目文档模板)
│ └── test/ # 测试代码目录
│ └── java/
│ └── com/
│ └── math/
│ ├── auth/ # 用户认证模块测试
│ │ └── UserManagerTest.java
│ ├── generator/ # 题目生成模块测试
│ │ ├── PrimaryGeneratorTest.java
│ │ └── HighGeneratorTest.java
│ └── util/ # 工具类测试
│ └── FileUtilsTest.java
├── target/ # Maven构建输出目录
## 三、核心功能
1. **用户管理**
* 用户登录验证
* 新用户创建
* 密码修改
* 学习阶段(难度)修改
2.**题目生成**
* 小学难度题目生成(包含加减乘除及括号运算)
* 初中难度题目生成(包含平方、开根号运算)
* 高中难度题目生成(包含三角函数运算)
* 题目查重(基于用户历史记录)
* 生成题目保存(按时间戳命名)
## 四、系统架构
### 主要包结构
* `auth`: 用户认证相关类
* `generator`: 题目生成相关接口及实现类
* `util`: 工具类(文件操作、表达式生成、菜单等)
### 核心类介绍
#### 1. 用户认证模块
* `User.java`
* 用户实体类,包含用户名、密码和学段属性
* 提供属性访问方法
* `UserManager.java`
* 用户管理核心类,负责从文件读取用户信息
* 实现用户登录验证功能
#### 2. 题目生成模块
* `ProblemGenerator.java`
* 题目生成接口,定义`generateProblems(int count)`方法
* 实现类
* `PrimaryGenerator.java`: 小学题目生成器
* `MiddleGenerator.java`: 初中题目生成器
* `HighGenerator.java`: 高中题目生成器
* `ExpressionUtils.java`
* 表达式生成工具类
* 提供不同学段的表达式生成方法
#### 3. 工具类模块
* `FileUtils.java`: 文件操作工具,负责用户文件夹创建、历史题目读取和新题目保存
* `ModifyPassword.java`: 密码修改工具类
* `CreateUser.java`: 新用户创建工具类
* `ModifyClass.java`: 用户学段修改工具类
* `menu.java`: 系统菜单交互类
#### 4. 主程序入口
* `Main.java`: 程序入口点,提供主菜单交互
## 五、使用流程
1. 系统启动后显示主菜单,可选择登录、退出、修改密码或创建账户
2. 登录成功后进入用户菜单,可选择:
* 生成试卷指定题目数量10-30 题)
* 修改难度(切换小学 / 初中 / 高中)
* 退出当前登录
1. 生成的题目会自动保存到`exams/用户名/`目录下,以时间戳命名的文件中
## 六、数据存储
* 用户信息存储在`user.txt`文件中,格式为:`用户名 密码 学段`
* 生成的题目按用户分别存储在`exams`目录下的对应用户子目录中
* 历史题目用于查重,确保不生成重复题目
## 七、题目特点
* **小学题目**2-5 个操作数,包含加减乘除及随机括号
* **初中题目**:包含平方 (^2) 和开根号 (sqrt ()) 运算
* **高中题目**:包含三角函数 (sin/cos/tan) 运算
## 八、注意事项
* 用户名和密码区分大小写
* 题目数量必须在 10-30 之间
* 新建用户时学段必须指定为 "小学"、"初中" 或 "高中"
* 所有数据以文本文件形式存储,便于查看和备份

@ -17,24 +17,22 @@ public class Main {
System.out.println("4.创建账户");
int num=scanner.nextInt();
scanner.nextLine();
scanner.nextLine();
if(num==1){
Menu.Mymenu();
Menu.MyMenu();
}
else if (num==2){
System.exit(0);
System.exit(0);
}
else if(num==3){
ModifyPassword.modimenu();
}
else if(num==4){
CreateUser.createuser();
CreateUser.createuser();
}
else{
System.out.println("输出错误,请重新输入");
}
}
}
}

@ -36,10 +36,10 @@ public class UserManager {
}
}
public static DataLists readDataFile(String filePath) {
List<String> list1 = new ArrayList<>();// 创建三个列表分别存储每行的三个数据
List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
List<String> list3 = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {// 使用try-with-resources语句确保资源自动关闭
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
int lineNumber = 1;
// 逐行读取
@ -53,8 +53,7 @@ public class UserManager {
}
// 分割行数据,这里假设使用空格分隔
// 如果是其他分隔符(如逗号、制表符),请修改正则表达式
String[] parts = line.split("\\s+"); // 按一个或多个空格分割
// 检查是否有三个数据
String[] parts = line.split("\\s+");
if (parts.length != 3) {
System.out.println("警告: 第" + lineNumber + "行数据格式不正确需要3个数据实际有" + parts.length + "个");
lineNumber++;

@ -17,7 +17,8 @@ public class ExpressionUtils {
// 生成小学表达式
public static String generatePrimaryExpr() {
int operands = rand.nextInt(4) + 2; // 25 个操作数
int operands = rand.nextInt(4) + 2;
// 25 个操作数
StringBuilder expr = new StringBuilder();
for (int i = 0; i <operands; i++) {
if (i > 0) {

@ -1,7 +1,6 @@
package util;
import java.io.*;
import java.nio.file.*;
import java.text.SimpleDateFormat;
import java.util.*;
@ -9,7 +8,8 @@ public class FileUtils {
// 获取用户文件夹路径
public static String getUserFolder(String username) {
String folder = "exams/" + username; // 存放在项目目录下 exams/
String folder = "exams/" + username;
// 存放在项目目录下 exams/
File dir = new File(folder);
if (!dir.exists()) {
dir.mkdirs();

@ -6,22 +6,16 @@ import java.util.List;
public class ModifyClass {
/**
*
* @param filePath
* @param targetName
* @param newThirdString
* @return -1
*/
public static int modifyclass(String filePath, String targetName, String newThirdString) {
List<String> lines = new ArrayList<>();
int targetLineNumber = -1;
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
if (line.trim().isEmpty()) continue;
if (line.trim().isEmpty()) {
continue;
}
String[] parts = line.trim().split("\\s+");
if (parts.length > 0 && parts[0].equals(targetName)) {
targetLineNumber = lines.size();
@ -31,7 +25,6 @@ public class ModifyClass {
System.err.println("读取文件错误: " + e.getMessage());
return -1;
}
if (targetLineNumber != -1) {
int index = targetLineNumber - 1;
String[] parts = lines.get(index).trim().split("\\s+");
@ -39,7 +32,9 @@ public class ModifyClass {
parts[2] = newThirdString;
lines.set(index, String.join(" ", parts));
try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
for (String l : lines) writer.write(l + System.lineSeparator());
for (String l : lines){
writer.write(l + System.lineSeparator());
}
} catch (IOException e) {
System.err.println("写入文件错误: " + e.getMessage());
return -1;
@ -50,5 +45,4 @@ public class ModifyClass {
}
return targetLineNumber;
}
}

@ -11,7 +11,7 @@ public class menu {
User currentUser = null;
ProblemGenerator generator = null;
public void Mymenu() {
public void MyMenu() {
while (currentUser==null) {
System.out.println("请输入用户名和密码(用空格隔开):");
@ -40,7 +40,7 @@ public class menu {
}
public static int menu1(User currentUser, ProblemGenerator generator) {
int count1 = 0;
int count1=0 ;
while (true) {
System.out.println("1.生成试卷");
System.out.println("2.修改难度");

Loading…
Cancel
Save