From 770eff5664f7a814bc77b2f3a64462b361cc4637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=9F=B9=E6=AF=85?= <2642034697@qq.com> Date: Sun, 28 Sep 2025 20:52:53 +0800 Subject: [PATCH] 123 --- src/JuniorQuestionGenerator.java | 50 +-- src/MathExamGenerator.class | Bin 9969 -> 10023 bytes src/MathExamGenerator.java | 542 +++++++++++++++--------------- src/PrimaryQuestionGenerator.java | 60 ++-- src/QuestionGenerator.java | 14 +- src/SeniorQuestionGenerator.java | 36 +- src/UserInfo.java | 84 ++--- 7 files changed, 393 insertions(+), 393 deletions(-) diff --git a/src/JuniorQuestionGenerator.java b/src/JuniorQuestionGenerator.java index eaad998..e18a9c1 100644 --- a/src/JuniorQuestionGenerator.java +++ b/src/JuniorQuestionGenerator.java @@ -5,32 +5,32 @@ import java.util.Random; * 生成适合初中生的数学题目,包含平方和开根号运算 */ public class JuniorQuestionGenerator implements QuestionGenerator { - @Override - public String generateQuestion(StringBuilder question, Random random) { - // 确保所有初中题目都包含至少一个平方或开根号的运算符 - int num = random.nextInt(100) + 1; - boolean isSquare = random.nextBoolean(); + @Override + public String generateQuestion(StringBuilder question, Random random) { + // 确保所有初中题目都包含至少一个平方或开根号的运算符 + int num = random.nextInt(100) + 1; + boolean isSquare = random.nextBoolean(); - if (isSquare) { - // 生成平方题 - question.append(num).append("^2"); - } else { - // 生成开根号题,确保是完全平方数 - int sqrtNum = random.nextInt(10) + 1; - num = sqrtNum * sqrtNum; - question.append("√").append(num); - } - - // 添加一些其他运算符使题目更复杂 - int complexity = random.nextInt(2) + 1; - for (int i = 0; i < complexity; i++) { - String[] operators = {"+", "-", "*"}; - String op = operators[random.nextInt(operators.length)]; - int addNum = random.nextInt(10) + 1; - question.append(" ").append(op).append(" ").append(addNum); - } + if (isSquare) { + // 生成平方题 + question.append(num).append("^2"); + } else { + // 生成开根号题,确保是完全平方数 + int sqrtNum = random.nextInt(10) + 1; + num = sqrtNum * sqrtNum; + question.append("√").append(num); + } - question.append(" = ?"); - return question.toString(); + // 添加一些其他运算符使题目更复杂 + int complexity = random.nextInt(2) + 1; + for (int i = 0; i < complexity; i++) { + String[] operators = {"+", "-", "*"}; + String op = operators[random.nextInt(operators.length)]; + int addNum = random.nextInt(10) + 1; + question.append(" ").append(op).append(" ").append(addNum); } + + question.append(" = ?"); + return question.toString(); + } } \ No newline at end of file diff --git a/src/MathExamGenerator.class b/src/MathExamGenerator.class index a2c488292dbd6d16e854715cc62a08a8a0a2556d..909c0b16f7b069c29d6aa2ee680d4cd45b925032 100644 GIT binary patch delta 4704 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 XFZelOaABV`VQDhiWbx;8oG<48W9vrP diff --git a/src/MathExamGenerator.java b/src/MathExamGenerator.java index 956555a..5a173be 100644 --- a/src/MathExamGenerator.java +++ b/src/MathExamGenerator.java @@ -9,300 +9,300 @@ import java.util.*; * 主类,负责用户登录、题目生成和文件操作 */ public class MathExamGenerator { - // 预设的用户账号信息 - private static final Map USER_ACCOUNTS = new HashMap<>(); - - // 当前登录用户信息 - private static UserInfo currentUser = null; - // 已生成的题目集,用于检查重复 - private static final Set generatedQuestions = new HashSet<>(); - - private static boolean isRunning = true; - - static { - // 初始化小学、初中和高中各三个账号 - // 小学账户 - USER_ACCOUNTS.put("张三1", new UserInfo("张三1", "123", "小学")); - USER_ACCOUNTS.put("张三2", new UserInfo("张三2", "123", "小学")); - USER_ACCOUNTS.put("张三3", new UserInfo("张三3", "123", "小学")); - - // 初中账户 - USER_ACCOUNTS.put("李四1", new UserInfo("李四1", "123", "初中")); - USER_ACCOUNTS.put("李四2", new UserInfo("李四2", "123", "初中")); - USER_ACCOUNTS.put("李四3", new UserInfo("李四3", "123", "初中")); - - // 高中账户 - USER_ACCOUNTS.put("王五1", new UserInfo("王五1", "123", "高中")); - USER_ACCOUNTS.put("王五2", new UserInfo("王五2", "123", "高中")); - USER_ACCOUNTS.put("王五3", new UserInfo("王五3", "123", "高中")); - } - - public static void main(String[] args) { - // 使用BufferedReader配合InputStreamReader,明确指定GBK编码 - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(System.in, Charset.forName("GBK")))) { - - System.out.println("欢迎使用中小学数学卷子自动生成程序"); - System.out.println("请使用您的账号和密码登录(格式:用户名 密码)"); - - while (isRunning) { - if (currentUser == null) { - handleLogIn(reader); - } else { - handleRequirement(reader); - } - } - } catch (IOException e) { - System.out.println("输入输出错误:" + e.getMessage()); - } - } - public static void handleLogIn(BufferedReader reader) throws IOException { - // 用户未登录,显示登录提示 - System.out.print("请输入用户名和密码(用空格隔开,输入exit退出):"); - String input = reader.readLine(); - - if (input == null || input.trim().isEmpty()) { - System.out.println("输入不能为空,请重新输入"); - return; - } else if (input.equals("exit")) { - isRunning = false; - return; - } - - String[] parts = input.split(" "); - - if (parts.length == 2) { - String username = parts[0]; - String password = parts[1]; - // 验证用户登录 - boolean loginSuccess = false; - for (Map.Entry entry : USER_ACCOUNTS.entrySet()) { - if (entry.getValue().getUsername().equals(username) && - entry.getValue().getPassword().equals(password)) { - currentUser = entry.getValue(); - loginSuccess = true; - break; - } - } - if (loginSuccess) { - System.out.println("登录成功!当前选择为" + currentUser.getUserType() + "出题"); - System.out.println("提示:您可以输入'切换为小学'、'切换为初中'或'切换为高中'来切换题目难度"); - handleUserChoice(); - loadExistingQuestions(); - } else { - System.out.println("登录失败,请输入正确的用户名和密码"); - } + // 预设的用户账号信息 + private static final Map USER_ACCOUNTS = new HashMap<>(); + + // 当前登录用户信息 + private static UserInfo currentUser = null; + // 已生成的题目集,用于检查重复 + private static final Set generatedQuestions = new HashSet<>(); + + private static boolean isRunning = true; + + static { + // 初始化小学、初中和高中各三个账号 + // 小学账户 + USER_ACCOUNTS.put("张三1", new UserInfo("张三1", "123", "小学")); + USER_ACCOUNTS.put("张三2", new UserInfo("张三2", "123", "小学")); + USER_ACCOUNTS.put("张三3", new UserInfo("张三3", "123", "小学")); + + // 初中账户 + USER_ACCOUNTS.put("李四1", new UserInfo("李四1", "123", "初中")); + USER_ACCOUNTS.put("李四2", new UserInfo("李四2", "123", "初中")); + USER_ACCOUNTS.put("李四3", new UserInfo("李四3", "123", "初中")); + + // 高中账户 + USER_ACCOUNTS.put("王五1", new UserInfo("王五1", "123", "高中")); + USER_ACCOUNTS.put("王五2", new UserInfo("王五2", "123", "高中")); + USER_ACCOUNTS.put("王五3", new UserInfo("王五3", "123", "高中")); + } + + public static void main(String[] args) { + // 使用BufferedReader配合InputStreamReader,明确指定GBK编码 + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(System.in, Charset.forName("GBK")))) { + + System.out.println("欢迎使用中小学数学卷子自动生成程序"); + System.out.println("请使用您的账号和密码登录(格式:用户名 密码)"); + + while (isRunning) { + if (currentUser == null) { + handleLogIn(reader); } else { - System.out.println("输入格式错误,请用空格分隔用户名和密码"); + handleRequirement(reader); } + } + } catch (IOException e) { + System.out.println("输入输出错误:" + e.getMessage()); } - private static void handleRequirement(BufferedReader reader) throws IOException { - // 用户已登录,显示题目数量输入提示 - System.out.print("准备生成" + currentUser.getUserType() + - "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):"); - String input = reader.readLine(); - if (input == null || input.trim().isEmpty()) { - return; - } - // 检查是否为切换类型命令 - if (input.startsWith("切换为")) { - String targetType = input.substring(3).trim(); - if ("小学".equals(targetType) || "初中".equals(targetType) || "高中".equals(targetType)) { - currentUser.setUserType(targetType); - System.out.println("切换成功!准备生成" + currentUser.getUserType() + "数学题目,请输入生成题目数量"); - } else { - System.out.println("切换类型错误,请输入'切换为小学'、'切换为初中'或'切换为高中'"); - } - return; - } - - try { - int questionCount = Integer.parseInt(input); - - if (questionCount == -1) { - // 退出登录 - currentUser = null; - generatedQuestions.clear(); - System.out.println("已退出登录"); - } else if (questionCount >= 10 && questionCount <= 30) { - // 生成题目 - generateExam(questionCount); - } else { - System.out.println("题目数量必须在10-30之间"); - } - } catch (NumberFormatException e) { - System.out.println("请输入有效的数字"); - } + } + public static void handleLogIn(BufferedReader reader) throws IOException { + // 用户未登录,显示登录提示 + System.out.print("请输入用户名和密码(用空格隔开,输入exit退出):"); + String input = reader.readLine(); + + if (input == null || input.trim().isEmpty()) { + System.out.println("输入不能为空,请重新输入"); + return; + } else if (input.equals("exit")) { + isRunning = false; + return; } - // 生成试卷 - private static void generateExam(int questionCount) { - List questions = generateUniqueQuestions(questionCount); - // 保存试卷到文件 - saveExamToFile(questions); - - System.out.println("已成功生成" + questions.size() + "道" + currentUser.getUserType() + "数学题目"); + String[] parts = input.split(" "); + + if (parts.length == 2) { + String username = parts[0]; + String password = parts[1]; + // 验证用户登录 + boolean loginSuccess = false; + for (Map.Entry entry : USER_ACCOUNTS.entrySet()) { + if (entry.getValue().getUsername().equals(username) && + entry.getValue().getPassword().equals(password)) { + currentUser = entry.getValue(); + loginSuccess = true; + break; + } + } + if (loginSuccess) { + System.out.println("登录成功!当前选择为" + currentUser.getUserType() + "出题"); + System.out.println("提示:您可以输入'切换为小学'、'切换为初中'或'切换为高中'来切换题目难度"); handleUserChoice(); + loadExistingQuestions(); + } else { + System.out.println("登录失败,请输入正确的用户名和密码"); + } + } else { + System.out.println("输入格式错误,请用空格分隔用户名和密码"); } - - // 生成不重复的题目 - private static List generateUniqueQuestions(int questionCount) { - List questions = new ArrayList<>(); - Random random = new Random(); - int attempts = 0; - int maxAttempts = questionCount * 3; // 最多尝试次数,避免死循环 - - while (questions.size() < questionCount && attempts < maxAttempts) { - String question = generateQuestion(); - if (!generatedQuestions.contains(question)) { - questions.add(question); - generatedQuestions.add(question); - } - attempts++; - } - - return questions; + } + private static void handleRequirement(BufferedReader reader) throws IOException { + // 用户已登录,显示题目数量输入提示 + System.out.print("准备生成" + currentUser.getUserType() + + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):"); + String input = reader.readLine(); + if (input == null || input.trim().isEmpty()) { + return; + } + // 检查是否为切换类型命令 + if (input.startsWith("切换为")) { + String targetType = input.substring(3).trim(); + if ("小学".equals(targetType) || "初中".equals(targetType) || "高中".equals(targetType)) { + currentUser.setUserType(targetType); + System.out.println("切换成功!准备生成" + currentUser.getUserType() + "数学题目,请输入生成题目数量"); + } else { + System.out.println("切换类型错误,请输入'切换为小学'、'切换为初中'或'切换为高中'"); + } + return; } - // 处理用户生成试卷后的选择 - private static void handleUserChoice() { - System.out.println("请选择:"); - System.out.println("1. 生成题目"); - System.out.println("2. 切换题目难度"); - System.out.println("3. 退出当前用户"); - System.out.println("4. 退出程序"); - - try { - BufferedReader reader = new BufferedReader( - new InputStreamReader(System.in, Charset.forName("GBK"))); - String choice = reader.readLine(); - - switch (choice) { - case "2": - handleDifficultySwitch(); - break; - case "3": - currentUser = null; - generatedQuestions.clear(); - System.out.println("已退出登录"); - break; - case "1": - break; - case "4": - isRunning = false; - break; - default: - System.out.println("无效的选项,请重新输入"); - handleUserChoice(); - break; - } - } catch (IOException e) { - System.out.println("输入错误:" + e.getMessage()); - } + try { + int questionCount = Integer.parseInt(input); + + if (questionCount == -1) { + // 退出登录 + currentUser = null; + generatedQuestions.clear(); + System.out.println("已退出登录"); + } else if (questionCount >= 10 && questionCount <= 30) { + // 生成题目 + generateExam(questionCount); + } else { + System.out.println("题目数量必须在10-30之间"); + } + } catch (NumberFormatException e) { + System.out.println("请输入有效的数字"); } + } + // 生成试卷 + private static void generateExam(int questionCount) { + List questions = generateUniqueQuestions(questionCount); - // 处理难度切换 - private static void handleDifficultySwitch() { - try { - BufferedReader reader = new BufferedReader( - new InputStreamReader(System.in, Charset.forName("GBK"))); - - while (true) { - System.out.print("请输入目标难度(小学/初中/高中):"); - String targetType = reader.readLine(); - - if ("小学".equals(targetType) || "初中".equals(targetType) || "高中".equals(targetType)) { - currentUser.setUserType(targetType); - System.out.println("已切换为" + targetType + "难度"); - break; - } else { - System.out.println("难度类型错误,请重新输入"); - } - } - } catch (IOException e) { - System.out.println("输入错误:" + e.getMessage()); - } + // 保存试卷到文件 + saveExamToFile(questions); + + System.out.println("已成功生成" + questions.size() + "道" + currentUser.getUserType() + "数学题目"); + handleUserChoice(); + } + + // 生成不重复的题目 + private static List generateUniqueQuestions(int questionCount) { + List questions = new ArrayList<>(); + Random random = new Random(); + int attempts = 0; + int maxAttempts = questionCount * 3; // 最多尝试次数,避免死循环 + + while (questions.size() < questionCount && attempts < maxAttempts) { + String question = generateQuestion(); + if (!generatedQuestions.contains(question)) { + questions.add(question); + generatedQuestions.add(question); + } + attempts++; } - // 根据用户类型获取对应的题目生成器 - private static QuestionGenerator getQuestionGenerator() { - if ("小学".equals(currentUser.getUserType())) { - return new PrimaryQuestionGenerator(); - } else if ("初中".equals(currentUser.getUserType())) { - return new JuniorQuestionGenerator(); - } else if ("高中".equals(currentUser.getUserType())) { - return new SeniorQuestionGenerator(); + return questions; + } + + // 处理用户生成试卷后的选择 + private static void handleUserChoice() { + System.out.println("请选择:"); + System.out.println("1. 生成题目"); + System.out.println("2. 切换题目难度"); + System.out.println("3. 退出当前用户"); + System.out.println("4. 退出程序"); + + try { + BufferedReader reader = new BufferedReader( + new InputStreamReader(System.in, Charset.forName("GBK"))); + String choice = reader.readLine(); + + switch (choice) { + case "2": + handleDifficultySwitch(); + break; + case "3": + currentUser = null; + generatedQuestions.clear(); + System.out.println("已退出登录"); + break; + case "1": + break; + case "4": + isRunning = false; + break; + default: + System.out.println("无效的选项,请重新输入"); + handleUserChoice(); + break; + } + } catch (IOException e) { + System.out.println("输入错误:" + e.getMessage()); + } + } + + // 处理难度切换 + private static void handleDifficultySwitch() { + try { + BufferedReader reader = new BufferedReader( + new InputStreamReader(System.in, Charset.forName("GBK"))); + + while (true) { + System.out.print("请输入目标难度(小学/初中/高中):"); + String targetType = reader.readLine(); + + if ("小学".equals(targetType) || "初中".equals(targetType) || "高中".equals(targetType)) { + currentUser.setUserType(targetType); + System.out.println("已切换为" + targetType + "难度"); + break; + } else { + System.out.println("难度类型错误,请重新输入"); } - return null; + } + } catch (IOException e) { + System.out.println("输入错误:" + e.getMessage()); } + } + + // 根据用户类型获取对应的题目生成器 + private static QuestionGenerator getQuestionGenerator() { + if ("小学".equals(currentUser.getUserType())) { + return new PrimaryQuestionGenerator(); + } else if ("初中".equals(currentUser.getUserType())) { + return new JuniorQuestionGenerator(); + } else if ("高中".equals(currentUser.getUserType())) { + return new SeniorQuestionGenerator(); + } + return null; + } - // 根据用户类型生成题目 - private static String generateQuestion() { - StringBuilder question = new StringBuilder(); - Random random = new Random(); - QuestionGenerator generator = getQuestionGenerator(); - - if (generator != null) { - return generator.generateQuestion(question, random); - } + // 根据用户类型生成题目 + private static String generateQuestion() { + StringBuilder question = new StringBuilder(); + Random random = new Random(); + QuestionGenerator generator = getQuestionGenerator(); - return "题目生成错误"; + if (generator != null) { + return generator.generateQuestion(question, random); } - // 加载已存在的题目,避免重复 - private static void loadExistingQuestions() { - if (currentUser == null) return; - try { - String userDir = currentUser.getUsername(); - File dir = new File(userDir); - - if (dir.exists() && dir.isDirectory()) { - File[] files = dir.listFiles(); - if (files != null) { - for (File file : files) { - if (file.isFile() && file.getName().endsWith(".txt")) { - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(new FileInputStream(file), Charset.forName("GBK")))) { - String line; - while ((line = reader.readLine()) != null) { - line = line.trim(); - if (!line.isEmpty() && !line.matches("^\\d+\\.")) { - generatedQuestions.add(line); - } - } - } - } - } + return "题目生成错误"; + } + + // 加载已存在的题目,避免重复 + private static void loadExistingQuestions() { + if (currentUser == null) return; + try { + String userDir = currentUser.getUsername(); + File dir = new File(userDir); + + if (dir.exists() && dir.isDirectory()) { + File[] files = dir.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isFile() && file.getName().endsWith(".txt")) { + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(new FileInputStream(file), Charset.forName("GBK")))) { + String line; + while ((line = reader.readLine()) != null) { + line = line.trim(); + if (!line.isEmpty() && !line.matches("^\\d+\\.")) { + generatedQuestions.add(line); + } } + } } - } catch (IOException e) { - System.out.println("加载已存在题目时出错:" + e.getMessage()); + } } + } + } catch (IOException e) { + System.out.println("加载已存在题目时出错:" + e.getMessage()); } - - // 保存试卷到文件 - private static void saveExamToFile(List questions) { - try { - // 创建用户目录(相对路径) - String userDir = currentUser.getUsername(); - Files.createDirectories(Paths.get(userDir)); - - // 生成文件名:年-月-日-时-分-秒.txt - String timestamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()); - String filePath = userDir + File.separator + timestamp + ".txt"; - - try (BufferedWriter writer = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(filePath), Charset.forName("GBK")))) { - for (int i = 0; i < questions.size(); i++) { - writer.write((i + 1) + ". " + questions.get(i)); - writer.newLine(); - if (i < questions.size() - 1) { - writer.newLine(); // 题目之间空一行 - } - } - } - } catch (IOException e) { - System.out.println("保存试卷时出错:" + e.getMessage()); + } + + // 保存试卷到文件 + private static void saveExamToFile(List questions) { + try { + // 创建用户目录(相对路径) + String userDir = currentUser.getUsername(); + Files.createDirectories(Paths.get(userDir)); + + // 生成文件名:年-月-日-时-分-秒.txt + String timestamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()); + String filePath = userDir + File.separator + timestamp + ".txt"; + + try (BufferedWriter writer = new BufferedWriter( + new OutputStreamWriter(new FileOutputStream(filePath), Charset.forName("GBK")))) { + for (int i = 0; i < questions.size(); i++) { + writer.write((i + 1) + ". " + questions.get(i)); + writer.newLine(); + if (i < questions.size() - 1) { + writer.newLine(); // 题目之间空一行 + } } + } + } catch (IOException e) { + System.out.println("保存试卷时出错:" + e.getMessage()); } + } } \ No newline at end of file diff --git a/src/PrimaryQuestionGenerator.java b/src/PrimaryQuestionGenerator.java index a846199..10887e0 100644 --- a/src/PrimaryQuestionGenerator.java +++ b/src/PrimaryQuestionGenerator.java @@ -5,37 +5,37 @@ import java.util.Random; * 生成适合小学生的数学题目 */ public class PrimaryQuestionGenerator implements QuestionGenerator { - @Override - public String generateQuestion(StringBuilder question, Random random) { - int num1 = random.nextInt(100) + 1; // 1-100的随机数 - int num2 = random.nextInt(100) + 1; - String[] operators = {"+", "-", "*", "/"}; - String op = operators[random.nextInt(operators.length)]; + @Override + public String generateQuestion(StringBuilder question, Random random) { + int num1 = random.nextInt(100) + 1; // 1-100的随机数 + int num2 = random.nextInt(100) + 1; + String[] operators = {"+", "-", "*", "/"}; + String op = operators[random.nextInt(operators.length)]; - // 确保减法和除法结果为正整数 - if ("-".equals(op) && num1 < num2) { - int temp = num1; - num1 = num2; - num2 = temp; - } else if ("/".equals(op)) { - // 确保除法结果为整数 - num1 = num2 * (random.nextInt(10) + 1); - } - - // 10%的概率添加括号 - if (random.nextDouble() < 0.1) { - question.append("("); - question.append(num1); - question.append(" ").append(op).append(" "); - question.append(num2); - question.append(")"); - } else { - question.append(num1); - question.append(" ").append(op).append(" "); - question.append(num2); - } + // 确保减法和除法结果为正整数 + if ("-".equals(op) && num1 < num2) { + int temp = num1; + num1 = num2; + num2 = temp; + } else if ("/".equals(op)) { + // 确保除法结果为整数 + num1 = num2 * (random.nextInt(10) + 1); + } - question.append(" = ?"); - return question.toString(); + // 10%的概率添加括号 + if (random.nextDouble() < 0.1) { + question.append("("); + question.append(num1); + question.append(" ").append(op).append(" "); + question.append(num2); + question.append(")"); + } else { + question.append(num1); + question.append(" ").append(op).append(" "); + question.append(num2); } + + question.append(" = ?"); + return question.toString(); + } } \ No newline at end of file diff --git a/src/QuestionGenerator.java b/src/QuestionGenerator.java index 1f99877..31b5906 100644 --- a/src/QuestionGenerator.java +++ b/src/QuestionGenerator.java @@ -5,11 +5,11 @@ import java.util.Random; * 定义生成数学题目的基本方法 */ public interface QuestionGenerator { - /** - * 生成一道数学题目 - * @param question 用于构建题目的StringBuilder - * @param random 随机数生成器 - * @return 生成的题目字符串 - */ - String generateQuestion(StringBuilder question, Random random); + /** + * 生成一道数学题目 + * @param question 用于构建题目的StringBuilder + * @param random 随机数生成器 + * @return 生成的题目字符串 + */ + String generateQuestion(StringBuilder question, Random random); } \ No newline at end of file diff --git a/src/SeniorQuestionGenerator.java b/src/SeniorQuestionGenerator.java index 465fe65..0444394 100644 --- a/src/SeniorQuestionGenerator.java +++ b/src/SeniorQuestionGenerator.java @@ -5,25 +5,25 @@ import java.util.Random; * 生成适合高中生的数学题目,包含三角函数运算 */ public class SeniorQuestionGenerator implements QuestionGenerator { - @Override - public String generateQuestion(StringBuilder question, Random random) { - // 确保所有高中题目都包含至少一个sin、cos或tan的运算符 - String[] functions = {"sin(", "cos(", "tan("}; - String func = functions[random.nextInt(functions.length)]; - int angle = random.nextInt(100)+1; + @Override + public String generateQuestion(StringBuilder question, Random random) { + // 确保所有高中题目都包含至少一个sin、cos或tan的运算符 + String[] functions = {"sin(", "cos(", "tan("}; + String func = functions[random.nextInt(functions.length)]; + int angle = random.nextInt(100)+1; - question.append(func).append(angle).append(")"); + question.append(func).append(angle).append(")"); - // 添加一些其他运算符使题目更复杂 - int complexity = random.nextInt(3); - for (int i = 0; i < complexity; i++) { - String[] operators = {"+", "-", "*", "/"}; - String op = operators[random.nextInt(operators.length)]; - int num = random.nextInt(10) + 1; - question.append(" ").append(op).append(" " ).append(num); - } - - question.append(" = ?"); - return question.toString(); + // 添加一些其他运算符使题目更复杂 + int complexity = random.nextInt(3); + for (int i = 0; i < complexity; i++) { + String[] operators = {"+", "-", "*", "/"}; + String op = operators[random.nextInt(operators.length)]; + int num = random.nextInt(10) + 1; + question.append(" ").append(op).append(" " ).append(num); } + + question.append(" = ?"); + return question.toString(); + } } \ No newline at end of file diff --git a/src/UserInfo.java b/src/UserInfo.java index 8513036..d85f127 100644 --- a/src/UserInfo.java +++ b/src/UserInfo.java @@ -3,51 +3,51 @@ * 存储用户的基本信息,包括用户名、密码和用户类型 */ public class UserInfo { - private String username; - private String password; - private String userType; + private String username; + private String password; + private String userType; - /** - * 构造函数 - * @param username 用户名 - * @param password 密码 - * @param userType 用户类型(小学/初中/高中) - */ - public UserInfo(String username, String password, String userType) { - this.username = username; - this.password = password; - this.userType = userType; - } + /** + * 构造函数 + * @param username 用户名 + * @param password 密码 + * @param userType 用户类型(小学/初中/高中) + */ + public UserInfo(String username, String password, String userType) { + this.username = username; + this.password = password; + this.userType = userType; + } - /** - * 获取用户名 - * @return 用户名 - */ - public String getUsername() { - return username; - } + /** + * 获取用户名 + * @return 用户名 + */ + public String getUsername() { + return username; + } - /** - * 获取密码 - * @return 密码 - */ - public String getPassword() { - return password; - } + /** + * 获取密码 + * @return 密码 + */ + public String getPassword() { + return password; + } - /** - * 获取用户类型 - * @return 用户类型 - */ - public String getUserType() { - return userType; - } + /** + * 获取用户类型 + * @return 用户类型 + */ + public String getUserType() { + return userType; + } - /** - * 设置用户类型 - * @param userType 用户类型 - */ - public void setUserType(String userType) { - this.userType = userType; - } + /** + * 设置用户类型 + * @param userType 用户类型 + */ + public void setUserType(String userType) { + this.userType = userType; + } } \ No newline at end of file