diff --git a/src/Main.java b/src/Main.java index 3e59c38..326af45 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,5 +1,40 @@ + +import util.*; + +import java.util.*; + public class Main { + final private static Scanner scanner = new Scanner(System.in); + public static void main(String[] args) { - System.out.println("Hello world!"); + + menu Menu=new menu(); + while (true) { + // 登录 + System.out.println("1.登录"); + System.out.println("2.退出"); + System.out.println("3.修改密码"); + System.out.println("4.创建账户"); + + int num=scanner.nextInt(); + scanner.nextLine(); + if(num==1){ + Menu.Mymenu(); + } + else if (num==2){ + System.exit(0); + } + else if(num==3){ + ModifyPassword.modimenu(); + } + else if(num==4){ + CreateUser.createuser(); + } + else{ + System.out.println("输出错误,请重新输入"); + } + } } -} \ No newline at end of file + + +} diff --git a/src/auth/UserManager.java b/src/auth/UserManager.java index ea0ffd0..dbac070 100644 --- a/src/auth/UserManager.java +++ b/src/auth/UserManager.java @@ -1,23 +1,19 @@ package auth; - +import java.io.BufferedReader; +import java.io.FileReader; import java.util.*; - +import java.io.IOException; public class UserManager { private List users = new ArrayList<>(); - + public static int line_num= 0; public UserManager() { - // 小学 - users.add(new User("张三1", "123", "小学")); - users.add(new User("张三2", "123", "小学")); - users.add(new User("张三3", "123", "小学")); - // 初中 - users.add(new User("李四1", "123", "初中")); - users.add(new User("李四2", "123", "初中")); - users.add(new User("李四3", "123", "初中")); - // 高中 - users.add(new User("王五1", "123", "高中")); - users.add(new User("王五2", "123", "高中")); - users.add(new User("王五3", "123", "高中")); + // 要读取的文件路径 + String filePath = "user.txt"; + // 调用方法读取文件并获取三个数据列表 + DataLists dataLists = readDataFile(filePath); + for(int i=0;i list1; + List list2; + List list3; + + DataLists(List list1, List list2, List list3) { + this.list1 = list1; + this.list2 = list2; + this.list3 = list3; + } + } + public static DataLists readDataFile(String filePath) { + List list1 = new ArrayList<>();// 创建三个列表分别存储每行的三个数据 + List list2 = new ArrayList<>(); + List list3 = new ArrayList<>(); + try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {// 使用try-with-resources语句确保资源自动关闭 + String line; + int lineNumber = 1; + // 逐行读取 + while ((line = br.readLine()) != null) { + // 去除首尾空格 + line = line.trim(); + + // 跳过空行 + if (line.isEmpty()) { + continue; + } + // 分割行数据,这里假设使用空格分隔 + // 如果是其他分隔符(如逗号、制表符),请修改正则表达式 + String[] parts = line.split("\\s+"); // 按一个或多个空格分割 + // 检查是否有三个数据 + if (parts.length != 3) { + System.out.println("警告: 第" + lineNumber + "行数据格式不正确,需要3个数据,实际有" + parts.length + "个"); + lineNumber++; + continue; + } + // 将三个数据分别添加到对应的列表 + list1.add(parts[0]); + list2.add(parts[1]); + list3.add(parts[2]); + lineNumber++; + } + line_num=lineNumber-1; + return new DataLists(list1, list2, list3); + }catch (IOException e) { + System.out.println("读取文件时发生错误: " + e.getMessage()); + e.printStackTrace(); + return null; + } + } } diff --git a/src/generator/HighGenerator.java b/src/generator/HighGenerator.java new file mode 100644 index 0000000..a254d3a --- /dev/null +++ b/src/generator/HighGenerator.java @@ -0,0 +1,15 @@ +package generator; + +import util.ExpressionUtils; +import java.util.*; + +public class HighGenerator implements ProblemGenerator { + @Override + public List generateProblems(int count) { + List problems = new ArrayList<>(); + for (int i = 1; i <= count; i++) { + problems.add(ExpressionUtils.generateHighExpr()); + } + return problems; + } +} diff --git a/src/generator/MiddleGenerator.java b/src/generator/MiddleGenerator.java new file mode 100644 index 0000000..fb0761c --- /dev/null +++ b/src/generator/MiddleGenerator.java @@ -0,0 +1,15 @@ +package generator; + +import util.ExpressionUtils; +import java.util.*; + +public class MiddleGenerator implements ProblemGenerator { + @Override + public List generateProblems(int count) { + List problems = new ArrayList<>(); + for (int i = 1; i <= count; i++) { + problems.add(ExpressionUtils.generateMiddleExpr()); + } + return problems; + } +} diff --git a/src/generator/Praimary.java b/src/generator/Praimary.java deleted file mode 100644 index 03455ae..0000000 --- a/src/generator/Praimary.java +++ /dev/null @@ -1,4 +0,0 @@ -package generator; - -public class Praimary { -} diff --git a/src/generator/PrimaryGenerator.java b/src/generator/PrimaryGenerator.java new file mode 100644 index 0000000..0348ec3 --- /dev/null +++ b/src/generator/PrimaryGenerator.java @@ -0,0 +1,15 @@ +package generator; + +import util.ExpressionUtils; +import java.util.*; + +public class PrimaryGenerator implements ProblemGenerator { + @Override + public List generateProblems(int count) { + List problems = new ArrayList<>(count); + for (int i = 1; i <= count; i++) { + problems.add( ExpressionUtils.generatePrimaryExpr()); + } + return problems; + } +} diff --git a/src/generator/ProblemGenerator.java b/src/generator/ProblemGenerator.java new file mode 100644 index 0000000..ad65cb1 --- /dev/null +++ b/src/generator/ProblemGenerator.java @@ -0,0 +1,8 @@ +package generator; + +import java.util.List; + +public interface ProblemGenerator { + List generateProblems(int count); +} + diff --git a/src/util/ExpressionUtils.java b/src/util/ExpressionUtils.java new file mode 100644 index 0000000..9e1a0b9 --- /dev/null +++ b/src/util/ExpressionUtils.java @@ -0,0 +1,96 @@ +package util; + +import java.util.Random; + +public class ExpressionUtils { + private static Random rand = new Random(); + + // 随机操作符 + private static final String[] OPS_PRIMARY = {"+", "-", "*", "/"}; + private static final String[] OPS_MIDDLE = {"+", "-", "*", "/"}; + private static final String[] OPS_HIGH = {"+", "-", "*", "/"}; + + // 生成一个随机整数 (1–100) + public static String randomNumber() { + return String.valueOf(rand.nextInt(100) + 1); + } + + // 生成小学表达式 + public static String generatePrimaryExpr() { + int operands = rand.nextInt(4) + 2; // 2–5 个操作数 + StringBuilder expr = new StringBuilder(); + for (int i = 0; i 0) { + expr.append(" ").append(OPS_PRIMARY[rand.nextInt(OPS_PRIMARY.length)]).append(" "); + } + if (rand.nextBoolean() && operands > 1&& i!=operands-1) { + expr.append("(").append(randomNumber()).append(" ").append(OPS_PRIMARY[rand.nextInt(OPS_PRIMARY.length)]) + .append(" ").append(randomNumber()).append(")"); + i++; + } else { + expr.append(randomNumber()); + } + } + return expr.toString(); + } + + // 生成初中表达式(至少包含平方或开根号) + public static String generateMiddleExpr() { + int operands = rand.nextInt(5) + 1; + StringBuilder expr = new StringBuilder(); + boolean hasSquareOrSqrt = false; + + for (int i = 0; i 0) { + expr.append(" ").append(OPS_MIDDLE[rand.nextInt(OPS_MIDDLE.length)]).append(" "); + } + int num = rand.nextInt(100) + 1; + if (!hasSquareOrSqrt && rand.nextBoolean()) { + if (rand.nextBoolean()) { + expr.append("sqrt(").append(num).append(")"); + } else { + expr.append(num).append("^2"); + } + hasSquareOrSqrt = true; + + } else { + expr.append(num); + } + } + + // 如果没加上,强制在最后补一个平方 + if (!hasSquareOrSqrt) { + expr.append(" + ").append(rand.nextInt(50) + 1).append("^2"); + } + + return expr.toString(); + } + + // 生成高中表达式(至少包含 sin/cos/tan) + public static String generateHighExpr() { + int operands = rand.nextInt(5) + 1; + StringBuilder expr = new StringBuilder(); + boolean hasTrig = false; + + for (int i = 0; i 0) { + expr.append(" ").append(OPS_HIGH[rand.nextInt(OPS_HIGH.length)]).append(" "); + } + int num = rand.nextInt(100) + 1; + if (!hasTrig && rand.nextBoolean()) { + String[] funcs = {"sin", "cos", "tan"}; + expr.append(funcs[rand.nextInt(funcs.length)]).append("(").append(num).append(")"); + hasTrig = true; + } else { + expr.append(num); + } + } + + // 如果没加三角函数,强制补一个 + if (!hasTrig) { + expr.append(" + sin(").append(rand.nextInt(90) + 1).append(")"); + } + + return expr.toString(); + } +} diff --git a/src/util/FileUtils.java b/src/util/FileUtils.java new file mode 100644 index 0000000..f5f2e06 --- /dev/null +++ b/src/util/FileUtils.java @@ -0,0 +1,63 @@ +package util; + +import java.io.*; +import java.nio.file.*; +import java.text.SimpleDateFormat; +import java.util.*; + +public class FileUtils { + + // 获取用户文件夹路径 + public static String getUserFolder(String username) { + String folder = "exams/" + username; // 存放在项目目录下 exams/ + File dir = new File(folder); + if (!dir.exists()) { + dir.mkdirs(); + } + return folder; + } + + // 读取历史题目(用于查重) + public static Set loadHistory(String username) { + Set history = new HashSet<>(); + String folder = getUserFolder(username); + + File dir = new File(folder); + File[] files = dir.listFiles((d, name) -> name.endsWith(".txt")); + if (files != null) { + for (File file : files) { + try (BufferedReader br = new BufferedReader(new FileReader(file))) { + String line; + while ((line = br.readLine()) != null) { + if (!line.trim().isEmpty()) { + history.add(line.trim()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return history; + } + + // 保存新题目 + public static void saveProblems(String username, List problems) { + String folder = getUserFolder(username); + String timestamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()); + String filename = folder + "/" + timestamp + ".txt"; + + try (BufferedWriter bw = new BufferedWriter(new FileWriter(filename))) { + int index=1; + for (String problem : problems) { + bw.write(index+"."+problem); + bw.newLine(); + bw.newLine(); + index++; + } + System.out.println("卷子已保存到: " + filename); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/util/ModifyClass.java b/src/util/ModifyClass.java new file mode 100644 index 0000000..2204ca5 --- /dev/null +++ b/src/util/ModifyClass.java @@ -0,0 +1,54 @@ +package util; + +import java.io.*; +import java.util.ArrayList; +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 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; + String[] parts = line.trim().split("\\s+"); + if (parts.length > 0 && parts[0].equals(targetName)) { + targetLineNumber = lines.size(); + } + } + } catch (IOException e) { + System.err.println("读取文件错误: " + e.getMessage()); + return -1; + } + + if (targetLineNumber != -1) { + int index = targetLineNumber - 1; + String[] parts = lines.get(index).trim().split("\\s+"); + if (parts.length >= 3) { + 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()); + } catch (IOException e) { + System.err.println("写入文件错误: " + e.getMessage()); + return -1; + } + } else { + System.out.println("第 " + targetLineNumber + " 行元素不足3个"); + } + } + return targetLineNumber; + } + +} diff --git a/src/util/menu.java b/src/util/menu.java new file mode 100644 index 0000000..c15d096 --- /dev/null +++ b/src/util/menu.java @@ -0,0 +1,133 @@ +package util; +import auth.*; +import generator.*; + +import java.util.*; + +import static util.ModifyClass.modifyclass; + +public class menu { + static Scanner scanner = new Scanner(System.in); + User currentUser = null; + ProblemGenerator generator = null; + + public void Mymenu() { + while (currentUser==null) { + + System.out.println("请输入用户名和密码(用空格隔开):"); + String input = scanner.nextLine(); + String [] parts=input.split(" "); + if (parts.length != 2) { + System.out.println("格式错误,请重新输入。"); + continue; + } + String username = parts[0]; + String password = parts[1]; + UserManager userManager = new UserManager(); + currentUser = userManager.login(username, password); + if (currentUser == null) { + System.out.println("请输入正确的用户名、密码"); + } else { + System.out.println("当前选择为 " + currentUser.getType() + " 出题"); + int tmp = menu1(currentUser, generator); + if(tmp == 1) { + currentUser = null; + generator=null; + break; + } + } + } + } + + public static int menu1(User currentUser, ProblemGenerator generator) { + int count1 = 0; + while (true) { + System.out.println("1.生成试卷"); + System.out.println("2.修改难度"); + System.out.println("3.退出当前登录"); + + int choice = scanner.nextInt(); + scanner.nextLine(); + if (choice == 1) { + int temp= generateExam(currentUser); + if(temp== 1) { + count1=1; + break; + } + + } else if (choice == 2) { + currentUser = switchDifficulty(currentUser); + } else if (choice == 3) { + //count=1代表currentuser要退出 + count1 = 1; + break; // 退出 + } + else{ + System.out.println("输出错误,请重新输入"); + } + } + return count1; + } + + private static int generateExam(User currentUser) { + System.out.println("准备生成 " + currentUser.getType() + + " 数学题目,请输入生成题目数量(输入 -1 退出当前用户):"); + ProblemGenerator generator = getGenerator(currentUser.getType()); + int count = scanner.nextInt(); + scanner.nextLine(); + if (count == -1){ + System.out.println("退出成功"); + return 1; + } + if (count < 10 || count > 30) { + System.out.println("题目数量必须在 10 到 30 之间"); + return 2; + } + + Set history = FileUtils.loadHistory(currentUser.getUsername()); + List problems = new ArrayList<>(); + while (problems.size() < count) { + List batch = generator.generateProblems(1); + String problem = batch.get(0); + if (!history.contains(problem)) { + problems.add(problem); + history.add(problem); + } + } + for (int i = 0; i