From 132bdded9d825cb5bb7b2098c9c5b3baa8bc2abc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=BB=84=E5=9F=B9=E6=AF=85?= <2642034697@qq.com>
Date: Wed, 24 Sep 2025 12:36:02 +0800
Subject: [PATCH] first commit
---
.idea/.gitignore | 8 +
.idea/misc.xml | 6 +
.idea/modules.xml | 8 +
math_exam_generator2.iml | 11 +
src/Info.class | Bin 0 -> 89 bytes
src/Info.java | 2 +
src/JuniorQuestionGenerator.class | Bin 0 -> 966 bytes
src/JuniorQuestionGenerator.java | 36 ++++
src/MathExamGenerator.class | Bin 0 -> 9910 bytes
src/MathExamGenerator.java | 306 ++++++++++++++++++++++++++++
src/PrimaryQuestionGenerator.class | Bin 0 -> 1138 bytes
src/PrimaryQuestionGenerator.java | 41 ++++
src/QuestionGenerator.class | Bin 0 -> 208 bytes
src/QuestionGenerator.java | 15 ++
src/SeniorQuestionGenerator.class | Bin 0 -> 1000 bytes
src/SeniorQuestionGenerator.java | 29 +++
src/UserInfo.class | Bin 0 -> 681 bytes
src/UserInfo.java | 53 +++++
src/张三2/2025-09-24-12-24-30.txt | 39 ++++
19 files changed, 554 insertions(+)
create mode 100644 .idea/.gitignore
create mode 100644 .idea/misc.xml
create mode 100644 .idea/modules.xml
create mode 100644 math_exam_generator2.iml
create mode 100644 src/Info.class
create mode 100644 src/Info.java
create mode 100644 src/JuniorQuestionGenerator.class
create mode 100644 src/JuniorQuestionGenerator.java
create mode 100644 src/MathExamGenerator.class
create mode 100644 src/MathExamGenerator.java
create mode 100644 src/PrimaryQuestionGenerator.class
create mode 100644 src/PrimaryQuestionGenerator.java
create mode 100644 src/QuestionGenerator.class
create mode 100644 src/QuestionGenerator.java
create mode 100644 src/SeniorQuestionGenerator.class
create mode 100644 src/SeniorQuestionGenerator.java
create mode 100644 src/UserInfo.class
create mode 100644 src/UserInfo.java
create mode 100644 src/张三2/2025-09-24-12-24-30.txt
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..e9710cf
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..9ea5392
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/math_exam_generator2.iml b/math_exam_generator2.iml
new file mode 100644
index 0000000..c90834f
--- /dev/null
+++ b/math_exam_generator2.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Info.class b/src/Info.class
new file mode 100644
index 0000000000000000000000000000000000000000..6c580e7203074e56fea6993ec26ca83da74d2021
GIT binary patch
literal 89
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
dBLmzDZ~PPrjG)h0 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()) {
+ 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("登录失败,请输入正确的用户名和密码");
+ }
+ } else {
+ System.out.println("输入格式错误,请用空格分隔用户名和密码");
+ }
+ }
+ 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("请输入有效的数字");
+ }
+ }
+ // 生成试卷
+ private static void generateExam(int questionCount) {
+ List questions = generateUniqueQuestions(questionCount);
+
+ // 保存试卷到文件
+ 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++;
+ }
+
+ 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:
+ // 继续生成题目,不需要额外操作
+ 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("难度类型错误,请重新输入");
+ }
+ }
+ } 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);
+ }
+
+ 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());
+ }
+ }
+
+ // 保存试卷到文件
+ 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.class b/src/PrimaryQuestionGenerator.class
new file mode 100644
index 0000000000000000000000000000000000000000..cd819b71c0cbf6d9f55a300e303955434eac3542
GIT binary patch
literal 1138
zcmah{&r{Pt7=26AY>2ItK!GZi0tzi{sUlWOp(r3sXHe8QFqI2|W-wS%45>dZp8OY_
z5r>lpxp>e^9i4%bC%yO=sb5k$BE>N?`|a-cz1{Ead-?YB%K?B<%*klSc^MZlz%eKx
zDj_CeNJ3nO2MMQ;6emCLINuuy!!lC1=!8oWMkHL8FzW2CaHKh|a$I8|_i4a}1tn
zY>`2jE*Eu%mU+X}Z&x-~b?d&iTB1x~T{m@0v-P_becLw5Cc|WOenWerrAnH)o>Fbg
zFxRIlMyaS<*;=7u8>Q4e%`BETv#|zjmcg&u+S;RA+LqhIWtHI=tF5vYPPVtp|9Bttqm+0I*)TY6svy05w#fFmQT`)
zoBA_5Z&CvxnvdnlJ^gV-D{V6bk9tvKk&Qhd37r!&<%;VeSxm1JwXH4PEHWgIo~ikF
zf=zWx8M>)w1FJt}$u8F}VQ7yw0<-8v8~wh-mHy=>n#nPWU9=0+%xLxweFFPP3x*Iy
z(M@uSXK|5cMOxtd@Dx0XpcVwhs}{V9s1`(pt7G1fHxcq4
z5PoD#RJ==~qA)xE3=g2UzI)F-cfSApdH`S+ccUG{dN{Vk%
zOQ~`UW!w=s`yUYhj9%N^wrjq?P!Co%IF9f)V@D1CqDpq#PWKj;Fo7Zdg2c)HF+|H7P@mz~7_Fd<
zOnrg)M2DMG>z$yaK8GYVOGO+S`k8yLe?zDmHo|6AGc>arF(T$_K9@geL!VjDazpq`
zuNcWDwKilT(uOkn=xyZmAg+gtG9eTC2dv3%qiE2mKWG#)tGW?47gSQ^lB(OVFE<$F
zJMCF9nl(;y4kOfHedrL&P!b~&qY`5h;}REyAYDJOPEt~xITODC$iCT~
literal 0
HcmV?d00001
diff --git a/src/SeniorQuestionGenerator.java b/src/SeniorQuestionGenerator.java
new file mode 100644
index 0000000..d7d2de6
--- /dev/null
+++ b/src/SeniorQuestionGenerator.java
@@ -0,0 +1,29 @@
+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(180);
+
+ 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();
+ }
+}
\ No newline at end of file
diff --git a/src/UserInfo.class b/src/UserInfo.class
new file mode 100644
index 0000000000000000000000000000000000000000..08202448dc4a340a26c957637cfac811df8c05d6
GIT binary patch
literal 681
zcma)(OG^S_6o%h#yz5w|qg~9d8yzbbxrwAr5Cl?z)_&AUMs$=>i~dzX613S1K1286Tp^0aM(8;+vu1A@p8*}
zFbZwMZWby7$FiHJ%=e6b|FP>de$eVukEp+7+1B7p;3PX=^q)xXPQZKKZBT2uY}w}3
zuv0Ugs!?k*5^0))+v!+ZHaD;6LO0XdCME88k-jV7zLE=Ol>Nh%?$D{57nbZ9l?^ZL
z`|goEf(jMeDuM{92ul+|hzFQ30eZX~OwSXs^yTdN8?1w-A9w<_V|3Z;U
zV^1-9AM+}rv`c)InD^3a`Wu9vA3@O%M)2r|BY0mJ=bdO%tO8;rSEvzZWrCl^Y>W|C
zDMK$v`Se#P&(l&l4v?meFGM}F=swZJLex8p=80-Z(#lo#xQasWmuvhPK0J;dbA=+w
I6bS{Z-xv{jasU7T
literal 0
HcmV?d00001
diff --git a/src/UserInfo.java b/src/UserInfo.java
new file mode 100644
index 0000000..0abbd06
--- /dev/null
+++ b/src/UserInfo.java
@@ -0,0 +1,53 @@
+/**
+ * 用户信息类
+ * 存储用户的基本信息,包括用户名、密码和用户类型
+ */
+public class UserInfo implements Info {
+ 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;
+ }
+
+ /**
+ * 获取用户名
+ * @return 用户名
+ */
+ public String getUsername() {
+ return username;
+ }
+
+ /**
+ * 获取密码
+ * @return 密码
+ */
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * 获取用户类型
+ * @return 用户类型
+ */
+ public String getUserType() {
+ return userType;
+ }
+
+ /**
+ * 设置用户类型
+ * @param userType 用户类型
+ */
+ public void setUserType(String userType) {
+ this.userType = userType;
+ }
+}
\ No newline at end of file
diff --git a/src/张三2/2025-09-24-12-24-30.txt b/src/张三2/2025-09-24-12-24-30.txt
new file mode 100644
index 0000000..5112caa
--- /dev/null
+++ b/src/张三2/2025-09-24-12-24-30.txt
@@ -0,0 +1,39 @@
+1. 1 * 34 = ?
+
+2. 30 + 93 = ?
+
+3. 82 * 33 = ?
+
+4. 98 * 97 = ?
+
+5. 58 * 77 = ?
+
+6. 97 - 96 = ?
+
+7. 86 - 27 = ?
+
+8. 73 - 22 = ?
+
+9. 52 + 5 = ?
+
+10. 42 - 6 = ?
+
+11. 72 * 62 = ?
+
+12. 60 - 23 = ?
+
+13. 43 - 37 = ?
+
+14. 198 / 99 = ?
+
+15. 4 / 1 = ?
+
+16. 42 + 57 = ?
+
+17. 356 / 89 = ?
+
+18. 144 / 36 = ?
+
+19. 189 / 21 = ?
+
+20. 74 + 43 = ?