1 #1

Closed
prg8fieq6 wants to merge 0 commits from develop into main

29
.gitignore vendored

@ -1,29 +0,0 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
bin/
!**/src/main/**/bin/
!**/src/test/**/bin/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

8
.idea/.gitignore vendored

@ -1,8 +0,0 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="PersonalWork" />
</profile>
</annotationProcessing>
</component>
</project>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/MathExamSystem.iml" filepath="$PROJECT_DIR$/MathExamSystem.iml" />
</modules>
</component>
</project>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../../" vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="1ebbe8b0-4301-470b-9af4-8de1b3d23994" name="更改" comment="">
<change afterPath="$PROJECT_DIR$/../../../Springboot/demo/demo2/src/main/java/org/example/demo2/controller/helloController.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../../Springboot/student-management/src/main/java/org/example/studentmanagement/controller/StudentController.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../../Springboot/student-management/src/main/java/org/example/studentmanagement/model/Student.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../../Springboot/student-management/src/main/java/org/example/studentmanagement/repository/StudentRepository.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../../Springboot/student-management/src/main/java/org/example/studentmanagement/service/StudentService.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../../Springboot/student-management/src/main/java/org/example/studentmanagement/service/StudentServiceImpl.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../../Springboot/student-management/src/main/resources/templates/index.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../../Springboot/student-management/src/main/resources/templates/new_student.html" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../../../Springboot/student-management/src/main/resources/templates/update_student.html" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Class" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/../../../" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 4
}</component>
<component name="ProjectId" id="336Cg17KtdfLegxR1WQHH1ExVPj" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;Maven.PersonalWork [clean].executor&quot;: &quot;Run&quot;,
&quot;Maven.PersonalWork [install].executor&quot;: &quot;Run&quot;,
&quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;master&quot;,
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;onboarding.tips.debug.path&quot;: &quot;D:/软件工程导论/个人项目/PersonalWork/src/main/java/org/example/Main.java&quot;,
&quot;project.structure.last.edited&quot;: &quot;工件&quot;,
&quot;project.structure.proportion&quot;: &quot;0.15&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;preferences.pluginManager&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;,
&quot;应用程序.MathExamGenerator.executor&quot;: &quot;Run&quot;,
&quot;应用程序.MathExamSystem.executor&quot;: &quot;Run&quot;,
&quot;应用程序.MathProblemGenerator.executor&quot;: &quot;Run&quot;
}
}</component>
<component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS">
<recent name="D:\软件工程导论\个人项目\PersonalWork" />
</key>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-jdk-9823dce3aa75-bf35d07a577b-intellij.indexing.shared.core-IU-252.23892.409" />
<option value="bundled-js-predefined-d6986cc7102b-e03c56caf84a-JavaScript-IU-252.23892.409" />
</set>
</attachedChunks>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="默认任务">
<changelist id="1ebbe8b0-4301-470b-9af4-8de1b3d23994" name="更改" comment="" />
<created>1758628242071</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1758628242071</updated>
<workItem from="1758628243299" duration="1053000" />
<workItem from="1758692064314" duration="576000" />
<workItem from="1758692647287" duration="7534000" />
<workItem from="1758726075139" duration="733000" />
<workItem from="1758791814933" duration="5246000" />
<workItem from="1758800961889" duration="3872000" />
<workItem from="1758883045022" duration="452000" />
<workItem from="1758900261725" duration="17751000" />
<workItem from="1759027335359" duration="7267000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
</project>

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -0,0 +1,2 @@
# personal-project

@ -1,130 +0,0 @@
MathExamSystem 数学考试系统
#项目简介
MathExamSystem 是一个基于Java开发的数学考试题目自动生成系统。该系统根据不同教育阶段小学、初中、高中的学生需求生成相应难度的数学题目并将试卷保存为文本文件。
#功能特性
##1. 多层次题目生成
小学题目: 基础四则运算和带括号表达式,避免负数结果
初中题目: 包含平方和开方运算的复合表达式
高中题目: 包含三角函数的复杂数学表达式
##2. 用户管理系统
预设三类用户账户小学、初中、高中各3个测试账户
用户认证和权限管理
支持账户类型切换功能
##3. 题目去重机制
自动检测并避免生成重复题目
基于历史记录的题目唯一性保证
##4. 文件管理
自动生成带时间戳的试卷文件
按用户和账户类型分类存储
结构化的文件目录组织
#系统架构
##核心组件
###QuestionGenerator 抽象类
作为所有题目生成器的基类,提供通用的随机数生成和运算符生成功能。
具体题目生成器
###PrimaryQuestionGenerator: 小学题目生成器
支持2-5个操作数的四则运算
50%概率生成带括号表达式
确保运算过程中不出现负数
###JuniorQuestionGenerator: 初中题目生成器
包含平方(²)和开方(√)运算
随机插入特殊运算符
支持复杂表达式组合
###SeniorQuestionGenerator: 高中题目生成器
集成三角函数(sin, cos, tan)
角度制计算支持
高级数学表达式构建
###User 类
用户身份验证和管理
账户类型控制
预设测试用户数据
###FileUtils 工具类
历史题目加载和管理
试卷文件生成和保存
用户目录结构维护
###ExamGenerator 考试生成器
协调各组件完成试卷生成流程
题目数量验证和控制
调用文件保存功能
#使用指南
##登录系统
运行程序后,首先需要登录:
请输入用户名和密码(用空格隔开):
预设账户信息:
小学账户: 张三1/123, 张三2/123, 张三3/123
初中账户: 李四1/123, 李四2/123, 李四3/123
高中账户: 王五1/123, 王五2/123, 王五3/123
##生成试卷
登录成功后按提示输入题目数量10-30题
准备生成[账户类型]数学题目,请输入生成题目数量(输入-1将退出当前用户重新登录
##特殊命令
输入 -1: 退出当前用户,返回登录界面
输入 切换为[小学|初中|高中]: 切换账户类型(无需重新登录)
##文件输出
生成的试卷将保存在以下路径结构中:
users/
├── 小学/
│ ├── 张三1/
│ ├── 张三2/
│ └── 张三3/
├── 初中/
│ ├── 李四1/
│ ├── 李四2/
│ └── 李四3/
└── 高中/
├── 王五1/
├── 王五2/
└── 王五3/
每个试卷文件以时间戳命名例如2023-12-01-14-30-25.txt
##编译和运行
程序可在IDEA里直接编译运行
若使用cmd和powershell运行先在命令行输入
chcp 65001
[Console]::InputEncoding =
[Console]::OutputEncoding =
[System.Text.Encoding]::UTF8
并执行java -jar MathExamSystem.jar
#代码特点
##设计模式应用
抽象工厂模式: 通过 QuestionGenerator 抽象类和具体实现类体现
单例模式: User 类中的预设账户映射采用静态初始化
工具类模式: FileUtils 提供静态方法集合
##安全特性
输入验证和边界检查
异常处理机制
用户认证保护
##扩展性设计
模块化结构便于新增题目类型
清晰的接口定义支持功能扩展
配置化的用户管理
##注意事项
程序需要在具有文件读写权限的环境中运行
题目数量限制在10-30题之间
生成的试卷文件为纯文本格式
程序默认会在当前目录创建 users 文件夹用于存储试卷

@ -1,544 +0,0 @@
//TIP 要<b>运行</b>代码,请按 <shortcut actionId="Run"/> 或
// 点击装订区域中的 <icon src="AllIcons.Actions.Execute"/> 图标。
import java.io.*;
import java.nio.file.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Scanner;
public class MathExamSystem {
// 抽象题目生成器类
static abstract class QuestionGenerator {
protected Random random;
public QuestionGenerator() {
this.random = new Random();
}
// 抽象方法,由子类实现具体的题目生成逻辑
public abstract String generateQuestion();
// 提供通用的运算符生成方法
protected String getRandomPrimaryOperator() {
int op = random.nextInt(4);
switch (op) {
case 0: return "+";
case 1: return "-";
case 2: return "*";
case 3: return "/";
default: return "+";
}
}
}
// 小学题目生成器
static class PrimaryQuestionGenerator extends QuestionGenerator {
@Override
public String generateQuestion() {
// 随机操作数数量 (2-5)
int operandCount = random.nextInt(4) + 2;
// 50%概率使用括号表达式
if (random.nextBoolean()) {
return generateParenthesisExpression(operandCount);
} else {
// 生成普通四则运算(确保不出现负数)
List<Integer> operands = new ArrayList<>();
operands.add(random.nextInt(100) + 1); // 第一个操作数
// 生成后续操作数,确保减法不会产生负数
for (int i = 1; i < operandCount; i++) {
String operator = getRandomPrimaryOperator();
int lastOperand = operands.get(operands.size() - 1);
// 如果上一个操作符是减法,确保当前操作数不大于上一个操作数
if (operator.equals("-")) {
operands.add(random.nextInt(lastOperand) + 1); // 1到lastOperand之间的数
} else {
operands.add(random.nextInt(100) + 1); // 1-100
}
}
List<String> operators = new ArrayList<>();
for (int i = 0; i < operandCount - 1; i++) {
operators.add(getRandomPrimaryOperator());
}
// 构建题目
StringBuilder question = new StringBuilder();
for (int i = 0; i < operandCount; i++) {
question.append(operands.get(i));
if (i < operators.size()) {
question.append(" ").append(operators.get(i)).append(" ");
}
}
question.append(" = ");
return question.toString();
}
}
private String generateParenthesisExpression(int operandCount) {
// 生成带括号的表达式,确保不出现负数
StringBuilder question = new StringBuilder();
// 简化实现:生成形如 (a op b) op (c op d) 的表达式
if (operandCount >= 4) {
int a = random.nextInt(100) + 1;
int b = random.nextInt(100) + 1;
int c = random.nextInt(100) + 1;
int d = random.nextInt(100) + 1;
String op1 = getRandomPrimaryOperator();
String op2 = getRandomPrimaryOperator();
String op3 = getRandomPrimaryOperator();
// 确保括号内的减法不产生负数
if (op1.equals("-")) {
b = random.nextInt(a) + 1; // b不大于a
}
if (op3.equals("-")) {
d = random.nextInt(c) + 1; // d不大于c
}
// 确保括号间运算不产生负数
if (op2.equals("-")) {
// 计算(a op1 b)的值范围
int firstResult;
switch (op1) {
case "+": firstResult = a + b; break;
case "-": firstResult = a - b; break;
case "*": firstResult = a * b; break;
case "/": firstResult = (b != 0) ? a / b : a; break;
default: firstResult = a + b; break;
}
// 计算(c op3 d)的值范围
int secondResult;
switch (op3) {
case "+": secondResult = c + d; break;
case "-": secondResult = c - d; break;
case "*": secondResult = c * d; break;
case "/": secondResult = (d != 0) ? c / d : c; break;
default: secondResult = c + d; break;
}
// 如果(firstResult - secondResult)会是负数,则交换操作数
if (firstResult < secondResult) {
// 交换两组操作数
int tempA = a, tempB = b;
a = c; b = d;
c = tempA; d = tempB;
String tempOp = op1;
op1 = op3;
op3 = tempOp;
}
}
question.append("(").append(a).append(" ").append(op1).append(" ").append(b).append(")")
.append(" ").append(op2).append(" ")
.append("(").append(c).append(" ").append(op3).append(" ").append(d).append(")");
question.append(" = ");
} else {
// 如果操作数不足,退化为普通表达式
return generateQuestion();
}
return question.toString();
}
}
// 初中题目生成器
static class JuniorQuestionGenerator extends QuestionGenerator {
// 重构后的方法约35行
@Override
public String generateQuestion() {
int operandCount = random.nextInt(4) + 2;
List<String> operands = generateOperands(operandCount);
List<String> operators = generateOperators(operandCount - 1);
return buildExpression(operands, operators);
}
private List<String> generateOperands(int count) {
List<String> operands = new ArrayList<>();
boolean hasSpecialOp = false;
for (int i = 0; i < count; i++) {
int operand = random.nextInt(100) + 1;
if (!hasSpecialOp && (i == count - 1 || random.nextInt(10) < 3)) {
operands.add(generateSpecialOperand(operand));
hasSpecialOp = true;
} else {
operands.add(String.valueOf(operand));
}
}
if (!hasSpecialOp) {
addRandomSpecialOperand(operands);
}
return operands;
}
private String generateSpecialOperand(int operand) {
return random.nextBoolean() ? "√" + operand : operand + "²";
}
private void addRandomSpecialOperand(List<String> operands) {
int index = random.nextInt(operands.size());
int value = Integer.parseInt(operands.get(index).replaceAll("[√²]", ""));
operands.set(index, generateSpecialOperand(value));
}
private List<String> generateOperators(int count) {
List<String> operators = new ArrayList<>();
for (int i = 0; i < count; i++) {
operators.add(getRandomPrimaryOperator());
}
return operators;
}
private String buildExpression(List<String> operands, List<String> operators) {
StringBuilder question = new StringBuilder();
for (int i = 0; i < operands.size(); i++) {
question.append(operands.get(i));
if (i < operators.size()) {
question.append(" ").append(operators.get(i)).append(" ");
}
}
question.append(" = ");
return question.toString();
}
}
// 高中题目生成器
static class SeniorQuestionGenerator extends QuestionGenerator {
// 重构后的方法约30行
@Override
public String generateQuestion() {
int operandCount = random.nextInt(4) + 2;
List<String> parts = generateExpressionParts(operandCount);
List<String> operators = generateOperators(operandCount - 1);
return buildExpression(parts, operators);
}
private List<String> generateExpressionParts(int count) {
List<String> parts = new ArrayList<>();
int trigIndex = random.nextInt(count);
boolean hasTrigonometric = false;
for (int i = 0; i < count; i++) {
if (i == trigIndex) {
parts.add(generateTrigonometricPart());
hasTrigonometric = true;
} else if (!hasTrigonometric && random.nextInt(10) < 3) {
parts.add(generateTrigonometricPart());
hasTrigonometric = true;
} else {
parts.add(String.valueOf(random.nextInt(100) + 1));
}
}
return parts;
}
private String generateTrigonometricPart() {
int operand = random.nextInt(100) + 1;
String trigFunc = getRandomTrigonometricFunction();
return trigFunc + "(" + operand + "°)";
}
private List<String> generateOperators(int count) {
List<String> operators = new ArrayList<>();
for (int i = 0; i < count; i++) {
operators.add(getRandomPrimaryOperator());
}
return operators;
}
private String buildExpression(List<String> parts, List<String> operators) {
StringBuilder question = new StringBuilder();
for (int i = 0; i < parts.size(); i++) {
question.append(parts.get(i));
if (i < operators.size()) {
question.append(" ").append(operators.get(i)).append(" ");
}
}
question.append(" = ");
return question.toString();
}
private String getRandomTrigonometricFunction() {
int func = random.nextInt(3);
switch (func) {
case 0: return "sin";
case 1: return "cos";
case 2: return "tan";
default: return "sin";
}
}
}
// 用户类
static class User {
private String username;
private String accountType;
// 预设账号信息
private static final Map<String, String> PRIMARY_USERS = new HashMap<>();
private static final Map<String, String> JUNIOR_USERS = new HashMap<>();
private static final Map<String, String> SENIOR_USERS = new HashMap<>();
static {
// 小学账号
PRIMARY_USERS.put("张三1", "123");
PRIMARY_USERS.put("张三2", "123");
PRIMARY_USERS.put("张三3", "123");
// 初中账号
JUNIOR_USERS.put("李四1", "123");
JUNIOR_USERS.put("李四2", "123");
JUNIOR_USERS.put("李四3", "123");
// 高中账号
SENIOR_USERS.put("王五1", "123");
SENIOR_USERS.put("王五2", "123");
SENIOR_USERS.put("王五3", "123");
}
public User(String username, String accountType) {
this.username = username;
this.accountType = accountType;
}
public static User login(String username, String password) {
if (PRIMARY_USERS.containsKey(username) && PRIMARY_USERS.get(username).equals(password)) {
return new User(username, "小学");
} else if (JUNIOR_USERS.containsKey(username) && JUNIOR_USERS.get(username).equals(password)) {
return new User(username, "初中");
} else if (SENIOR_USERS.containsKey(username) && SENIOR_USERS.get(username).equals(password)) {
return new User(username, "高中");
}
return null;
}
public static boolean isValidAccountType(String type) {
return "小学".equals(type) || "初中".equals(type) || "高中".equals(type);
}
public String getUsername() {
return username;
}
public String getAccountType() {
return accountType;
}
public void setAccountType(String accountType) {
this.accountType = accountType;
}
}
// 文件工具类
static class FileUtils {
public static List<String> loadExistingQuestions(String username, String accountType) {
List<String> questions = new ArrayList<>();
Path userDir = Paths.get("users", accountType, username);
if (!Files.exists(userDir)) {
return questions;
}
try {
Files.walk(userDir)
.filter(Files::isRegularFile)
.filter(path -> path.toString().endsWith(".txt"))
.forEach(path -> {
try {
List<String> lines = Files.readAllLines(path);
for (String line : lines) {
if (line.matches("\\d+\\..*=")) { // 匹配题目格式
questions.add(line.substring(line.indexOf(".") + 2));
}
}
} catch (IOException e) {
// 忽略读取错误
}
});
} catch (IOException e) {
// 忽略遍历错误
}
return questions;
}
public static String saveExam(String username, String accountType, List<String> questions) {
// 创建用户目录
Path userDir = Paths.get("users", accountType, username);
try {
Files.createDirectories(userDir);
} catch (IOException e) {
// 目录创建失败处理
}
// 生成文件名
String timestamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
String filename = timestamp + ".txt";
Path examFile = userDir.resolve(filename);
// 写入题目
try (BufferedWriter writer = Files.newBufferedWriter(examFile)) {
for (int i = 0; i < questions.size(); i++) {
writer.write((i + 1) + ". " + questions.get(i));
writer.newLine();
writer.newLine(); // 每题之间空一行
}
} catch (IOException e) {
// 写入失败处理
}
return examFile.toString();
}
public static void updateQuestionHistory(String username, String accountType, List<String> newQuestions) {
// 这里可以实现历史题目记录更新逻辑
// 当前实现中loadExistingQuestions已经可以读取所有历史题目
}
}
// 考试生成器类
static class ExamGenerator {
public static void generateExam(User user, int questionCount) {
List<String> existingQuestions = FileUtils.loadExistingQuestions(user.getUsername(), user.getAccountType());
Set<String> usedQuestions = new HashSet<>(existingQuestions);
List<String> newQuestions = new ArrayList<>();
// 根据用户类型创建相应的题目生成器
QuestionGenerator questionGenerator = createQuestionGenerator(user.getAccountType());
for (int i = 1; i <= questionCount; i++) {
String question = generateUniqueQuestion(questionGenerator, usedQuestions);
newQuestions.add(question);
usedQuestions.add(question);
}
String filename = FileUtils.saveExam(user.getUsername(), user.getAccountType(), newQuestions);
System.out.println("试卷已生成,保存至: " + filename);
// 更新历史题目记录
FileUtils.updateQuestionHistory(user.getUsername(), user.getAccountType(), newQuestions);
}
private static QuestionGenerator createQuestionGenerator(String accountType) {
switch (accountType) {
case "小学":
return new PrimaryQuestionGenerator();
case "初中":
return new JuniorQuestionGenerator();
case "高中":
return new SeniorQuestionGenerator();
default:
throw new IllegalArgumentException("不支持的账户类型: " + accountType);
}
}
private static String generateUniqueQuestion(QuestionGenerator generator, Set<String> usedQuestions) {
String question;
do {
question = generator.generateQuestion();
} while (usedQuestions.contains(question));
return question;
}
}
// 主方法
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
User[] currentUser = new User[1];
while (true) {
if (currentUser[0] == null) {
currentUser[0] = handleLogin(scanner);
} else {
handleExamGeneration(scanner, currentUser);
}
}
}
private static User handleLogin(Scanner scanner) {
System.out.println("请输入用户名和密码(用空格隔开):");
String input = scanner.nextLine().trim();
if (input.isEmpty()) {
return null;
}
String[] credentials = input.split(" ");
if (credentials.length != 2) {
System.out.println("请输入正确的用户名、密码");
return null;
}
String username = credentials[0];
String password = credentials[1];
User user = User.login(username, password);
if (user != null) {
System.out.println("当前选择为" + user.getAccountType() + "出题");
} else {
System.out.println("请输入正确的用户名、密码");
}
return user;
}
private static void handleExamGeneration(Scanner scanner, User[] currentUser) {
System.out.println("准备生成" + currentUser[0].getAccountType() + "数学题目,请输入生成题目数量(输入-1将退出当前用户重新登录");
String input = scanner.nextLine().trim();
if (input.equals("-1")) {
// 重置用户状态,将在下次循环中重新登录
currentUser[0] = null;
return;
}
if (handleCommandInput(input, currentUser[0])) {
return;
}
try {
int questionCount = Integer.parseInt(input);
if (questionCount < 10 || questionCount > 30) {
System.out.println("题目数量必须在10-30之间");
return;
}
ExamGenerator.generateExam(currentUser[0], questionCount);
} catch (NumberFormatException e) {
System.out.println("请输入有效的数字");
}
}
private static boolean handleCommandInput(String input, User currentUser) {
if (input.startsWith("切换为")) {
String targetType = input.substring(3);
if (User.isValidAccountType(targetType)) {
currentUser.setAccountType(targetType);
return true;
} else {
System.out.println("请输入小学、初中和高中三个选项中的一个");
}
}
return false;
}
}

@ -1,20 +0,0 @@
1. 50 + 94 * 75 =
2. 85 * 88 - 5 + 9 * 6 =
3. 40 / 69 =
4. 36 + 81 =
5. (88 / 75) + (80 + 19) =
6. 55 * 53 * 80 =
7. 27 * 32 + 4 =
8. 55 / 18 =
9. 90 / 68 + 22 - 64 =
10. 59 - 80 * 87 - 80 =
Loading…
Cancel
Save