develop
jzb 2 weeks ago
commit 8e52c179c7

30
.gitignore vendored

@ -0,0 +1,30 @@
### IntelliJ IDEA ###
out/
!**/src/main/**/out/
!**/src/test/**/out/
.kotlin
### 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

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

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

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

@ -0,0 +1,19 @@
1. 34 / 30 =
2. ((44) - 97 - 68) * 15 =
3. 63 / 81 =
4. 96 =
5. ((36) - 18 + 35) =
6. 76 - 52 =
7. (34 * 99 / 50) - 77 =
8. (57) - 51 + 90 =
9. (((4) * 9) + 15) / 6 =
10. ((20 - 11) + 95 * 39) =

@ -0,0 +1,29 @@
1. 21 =
2. 61 / 51 =
3. ((98) / 56 - 89) + 50 =
4. (58) - 1 + 74 =
5. 62 =
6. 44 - 62 - 47 =
7. (63 / 26 + 92) =
8. 21 =
9. ((54) * 43 - 14) =
10. (44 / 75) / 9 / 71 / 43 =
11. 76 / 45 =
12. ((((61) + 17 - 94) - 19) / 33) =
13. 38 =
14. (94 / 22 / 27 + 70 - 40) =
15. 81 - 48 =

@ -0,0 +1,2 @@
# math_question

@ -0,0 +1,24 @@
public enum DifficultyLevel {
PRIMARY("小学"),
JUNIOR("初中"),
SENIOR("高中");
private final String displayName;
DifficultyLevel(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
public static DifficultyLevel fromString(String text) {
for (DifficultyLevel level : DifficultyLevel.values()) {
if (level.displayName.equals(text)) {
return level;
}
}
return null;
}
}

@ -0,0 +1,66 @@
import java.io.*;
import java.nio.file.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class FileManager {
private static final String BASE_DIR = "exams";
public boolean saveQuestions(User user, String[] questions) {
try {
// 创建用户目录
Path userDir = Paths.get(BASE_DIR, user.getUsername());
Files.createDirectories(userDir);
// 生成文件名
String timestamp = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
Path filePath = userDir.resolve(timestamp + ".txt");
// 写入文件
try (PrintWriter writer = new PrintWriter(Files.newBufferedWriter(filePath))) {
for (int i = 0; i < questions.length; i++) {
writer.println(questions[i]);
if (i < questions.length - 1) {
writer.println(); // 题目之间空一行
}
}
}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
public Set<String> loadExistingQuestions(String username) {
Set<String> questions = new HashSet<>();
Path userDir = Paths.get(BASE_DIR, username);
if (!Files.exists(userDir)) {
return questions;
}
try (DirectoryStream<Path> stream = Files.newDirectoryStream(userDir, "*.txt")) {
for (Path filePath : stream) {
try (BufferedReader reader = Files.newBufferedReader(filePath)) {
String line;
while ((line = reader.readLine()) != null) {
if (line.trim().isEmpty() || !line.contains(".")) {
continue;
}
// 提取题目内容(去掉题号)
String question = line.substring(line.indexOf(".") + 1).trim();
questions.add(question);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return questions;
}
}

@ -0,0 +1,62 @@
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class LoginSystem {
private Map<String, User> users;
public LoginSystem() {
initializeUsers();
}
private void initializeUsers() {
users = new HashMap<>();
// 小学账户
users.put("张三1", new User("张三1", "123", DifficultyLevel.PRIMARY));
users.put("张三2", new User("张三2", "123", DifficultyLevel.PRIMARY));
users.put("张三3", new User("张三3", "123", DifficultyLevel.PRIMARY));
// 初中账户
users.put("李四1", new User("李四1", "123", DifficultyLevel.JUNIOR));
users.put("李四2", new User("李四2", "123", DifficultyLevel.JUNIOR));
users.put("李四3", new User("李四3", "123", DifficultyLevel.JUNIOR));
// 高中账户
users.put("王五1", new User("王五1", "123", DifficultyLevel.SENIOR));
users.put("王五2", new User("王五2", "123", DifficultyLevel.SENIOR));
users.put("王五3", new User("王五3", "123", DifficultyLevel.SENIOR));
}
public User login(Scanner scanner) {
while (true) {
System.out.print("请输入用户名和密码(用空格隔开):");
String input = scanner.nextLine().trim();
String[] parts = input.split("\\s+");
if (parts.length != 2) {
System.out.println("请输入正确的用户名、密码");
continue;
}
String username = parts[0];
String password = parts[1];
User user = users.get(username);
if (user != null && user.getPassword().equals(password)) {
return user;
} else {
System.out.println("请输入正确的用户名、密码");
}
}
}
public DifficultyLevel switchLevel(String levelName) {
DifficultyLevel newLevel = DifficultyLevel.fromString(levelName);
if (newLevel == null) {
System.out.println("请输入小学、初中和高中三个选项中的一个");
return null;
}
return newLevel;
}
}

@ -0,0 +1,74 @@
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
LoginSystem loginSystem = new LoginSystem();
QuestionGenerator generator = new QuestionGenerator();
FileManager fileManager = new FileManager();
while (true) {
// 登录阶段
User currentUser = loginSystem.login(scanner);
if (currentUser == null) {
continue;
}
System.out.println("当前选择为" + currentUser.getLevel().getDisplayName() + "出题");
// 主循环
while (true) {
System.out.println("准备生成" + currentUser.getLevel().getDisplayName() +
"数学题目,请输入生成题目数量(输入-1将退出当前用户重新登录");
String input = scanner.nextLine().trim();
// 检查切换命令
if (input.startsWith("切换为")) {
String levelName = input.substring(3).trim();
DifficultyLevel newLevel = loginSystem.switchLevel(levelName);
if (newLevel != null) {
currentUser.setLevel(newLevel);
System.out.println("准备生成" + currentUser.getLevel().getDisplayName() +
"数学题目,请输入生成题目数量");
continue;
}
}
// 检查退出命令
if (input.equals("-1")) {
System.out.println("退出当前用户,重新登录...");
break;
}
// 生成题目
try {
int count = Integer.parseInt(input);
if (count < 10 || count > 30) {
System.out.println("题目数量应在10-30之间");
continue;
}
// 生成题目并检查重复
String[] questions = generator.generateQuestions(currentUser.getLevel(), count,
currentUser.getUsername());
if (questions == null) {
System.out.println("生成题目失败,可能存在重复题目");
continue;
}
// 保存文件
boolean success = fileManager.saveQuestions(currentUser, questions);
if (success) {
System.out.println("题目生成成功!");
} else {
System.out.println("文件保存失败");
}
} catch (NumberFormatException e) {
System.out.println("请输入有效的数字");
}
}
}
}
}

@ -0,0 +1,4 @@
public interface Question {
String generateQuestion();
boolean isValid();
}

@ -0,0 +1,96 @@
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class QuestionGenerator {
private Random random;
private FileManager fileManager;
public QuestionGenerator() {
random = new Random();
fileManager = new FileManager();
}
public String[] generateQuestions(DifficultyLevel level, int count, String username) {
Set<String> existingQuestions = fileManager.loadExistingQuestions(username);
Set<String> newQuestions = new HashSet<>();
String[] questions = new String[count];
for (int i = 0; i < count; i++) {
String question;
int attempts = 0;
do {
question = generateSingleQuestion(level, i + 1);
attempts++;
if (attempts > 100) {
return null; // 避免无限循环
}
} while (existingQuestions.contains(question) || newQuestions.contains(question));
newQuestions.add(question);
questions[i] = question;
}
return questions;
}
private String generateSingleQuestion(DifficultyLevel level, int questionNumber) {
int operandCount = random.nextInt(5) + 1; // 1-5个操作数
StringBuilder question = new StringBuilder(questionNumber + ". ");
switch (level) {
case PRIMARY:
question.append(generatePrimaryQuestion(operandCount));
break;
case JUNIOR:
question.append(generateJuniorQuestion(operandCount));
break;
case SENIOR:
question.append(generateSeniorQuestion(operandCount));
break;
}
question.append(" = ");
return question.toString();
}
private String generatePrimaryQuestion(int operandCount) {
String[] operators = {"+", "-", "*", "/"};
StringBuilder question = new StringBuilder();
for (int i = 0; i < operandCount; i++) {
if (i > 0) {
question.append(" ").append(operators[random.nextInt(operators.length)]).append(" ");
}
question.append(random.nextInt(100) + 1);
// 随机添加括号(小学难度)
if (operandCount > 2 && random.nextDouble() < 0.3) {
question.insert(0, "(").append(")");
}
}
return question.toString();
}
private String generateJuniorQuestion(int operandCount) {
String question = generatePrimaryQuestion(operandCount);
// 确保至少有一个平方或开根号
if (random.nextBoolean()) {
return "√" + (random.nextInt(100) + 1) + " + " + question;
} else {
return "(" + (random.nextInt(10) + 1) + ")² + " + question;
}
}
private String generateSeniorQuestion(int operandCount) {
String question = generatePrimaryQuestion(operandCount);
String[] trigFunctions = {"sin", "cos", "tan"};
// 确保至少有一个三角函数
return trigFunctions[random.nextInt(trigFunctions.length)] +
"(" + (random.nextInt(90) + 1) + "°) + " + question;
}
}

@ -0,0 +1,17 @@
public class User {
private String username;
private String password;
private DifficultyLevel level;
public User(String username, String password, DifficultyLevel level) {
this.username = username;
this.password = password;
this.level = level;
}
// Getter 和 Setter 方法
public String getUsername() { return username; }
public String getPassword() { return password; }
public DifficultyLevel getLevel() { return level; }
public void setLevel(DifficultyLevel level) { this.level = level; }
}

@ -0,0 +1,11 @@
<?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>
Loading…
Cancel
Save