From d332874e0a7e6a6a536fc23049115e45edd1b70a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E5=A5=87=E5=B3=B0?= Date: Sat, 27 Sep 2025 12:21:36 +0800 Subject: [PATCH 1/3] sqf --- src/Assign.java | 11 ++++++++ src/Create.java | 17 ++++++++++++ src/Function.java | 48 ++++++++++++++++++++++++++++++++ src/Generator.java | 5 ++-- src/Main.java | 69 +--------------------------------------------- src/loadFile.java | 12 ++++---- 6 files changed, 86 insertions(+), 76 deletions(-) create mode 100644 src/Assign.java create mode 100644 src/Create.java create mode 100644 src/Function.java diff --git a/src/Assign.java b/src/Assign.java new file mode 100644 index 0000000..bfeb700 --- /dev/null +++ b/src/Assign.java @@ -0,0 +1,11 @@ +public class Assign { + + public static void assign(){ + while (true) { + Login.Account user = Login.loginLoop(); + Login.Level currentLevel = user.level; + System.out.println("当前选择为 " + LanguageSwitch.levelToChinese(currentLevel) + "出题"); + Function.function(currentLevel, user); + } + } +} diff --git a/src/Create.java b/src/Create.java new file mode 100644 index 0000000..18b921d --- /dev/null +++ b/src/Create.java @@ -0,0 +1,17 @@ +import java.util.List; + +public class Create { + + public static void create(int n,Login.Level currentLevel,Login.Account user) { + List existing = LoadFile.loadExistingQuestions(user.username); + Generator.QuestionGenerator qg = new Generator.QuestionGenerator(currentLevel, existing); + List paper = qg.generatePaper(n); + if (paper.isEmpty()) { + System.out.println("未能生成题目(可能因去重约束导致)。"); + } else { + // 保存文件 + String savedPath = Save.savePaper(user.username, paper); + System.out.println("已生成 " + paper.size() + " 道题,保存为: " + savedPath); + } + } +} diff --git a/src/Function.java b/src/Function.java new file mode 100644 index 0000000..d396c62 --- /dev/null +++ b/src/Function.java @@ -0,0 +1,48 @@ +import java.util.Scanner; +import java.nio.charset.StandardCharsets; + +public class Function { + + private static final Scanner SCANNER = new Scanner(System.in, StandardCharsets.UTF_8); + + public static void function(Login.Level currentLevel,Login.Account user){ + while (true) { + System.out.print("系统提示“准备生成 " + LanguageSwitch.levelToChinese(currentLevel) + + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”\n> "); + String line = SCANNER.nextLine().trim(); + if (line.equals("-1")) { + System.out.println("退出当前用户,返回登录界面。"); + break; + } + if (line.startsWith("切换为")) { + String target = line.substring("切换为".length()).trim(); + if (target.isEmpty()) { + System.out.println("请输入小学、初中和高中三个选项中的一个"); + continue; + } + Login.Level newLevel = LanguageSwitch.chineseToLevel(target); + if (newLevel == null) { + System.out.println("请输入小学、初中和高中三个选项中的一个"); + } else { + currentLevel = newLevel; + System.out.println( + "切换成功。当前选择为 " + LanguageSwitch.levelToChinese(currentLevel) + "出题"); + } + continue; + } + int n; + try { + n = Integer.parseInt(line); + } catch (NumberFormatException e) { + System.out.println("请输入有效的整数(10-30,或-1退出)或 '切换为 XX'。"); + continue; + } + if (n < 10 || n > 30) { + System.out.println("题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录)。"); + continue; + } + // 生成题目 + Create.create(n,currentLevel,user); + } + } +} diff --git a/src/Generator.java b/src/Generator.java index a786087..d9dfdce 100644 --- a/src/Generator.java +++ b/src/Generator.java @@ -64,9 +64,10 @@ public class Generator { // 生成单题主逻辑 private String generateOneQuestion() { - int operands = RAND.nextInt(5) + 1; // 保证 2..5 个操作数 + int operands = RAND.nextInt(5) + 1; // 保证 1..5 个操作数 + int operands_p = RAND.nextInt(4) + 2; // 保证 2..5 个操作数 return switch (level) { - case PRIMARY -> genPrimary(operands); + case PRIMARY -> genPrimary(operands_p); case MIDDLE -> genMiddle(operands); case HIGH -> genHigh(operands); }; diff --git a/src/Main.java b/src/Main.java index 3071822..931cc80 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,77 +1,10 @@ -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Scanner; - public class Main { /** * 主程序:中小学数学卷子自动生成器。 */ - private static final Scanner SCANNER = new Scanner(System.in, StandardCharsets.UTF_8); - public static void main(String[] args) { System.out.println("=== 中小学数学卷子自动生成程序 ==="); - while (true) { - Login.Account user = Login.loginLoop(); - if (user == null) { - continue; - } - Login.Level currentLevel = user.level; - System.out.println("当前选择为 " + LanguageSwitch.levelToChinese(currentLevel) + "出题"); - boolean loggedIn = true; - while (loggedIn) { - System.out.print("系统提示“准备生成 " + LanguageSwitch.levelToChinese(currentLevel) - + "数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”\n> "); - String line = SCANNER.nextLine().trim(); - if (line.equals("-1")) { - System.out.println("退出当前用户,返回登录界面。"); - loggedIn = false; - break; - } - if (line.startsWith("切换为")) { - String target = line.substring("切换为".length()).trim(); - if (target.isEmpty()) { - System.out.println("请输入小学、初中和高中三个选项中的一个"); - continue; - } - Login.Level newLevel = LanguageSwitch.chineseToLevel(target); - if (newLevel == null) { - System.out.println("请输入小学、初中和高中三个选项中的一个"); - } else { - currentLevel = newLevel; - System.out.println( - "切换成功。当前选择为 " + LanguageSwitch.levelToChinese(currentLevel) + "出题"); - } - continue; - } - int n; - try { - n = Integer.parseInt(line); - } catch (NumberFormatException e) { - System.out.println("请输入有效的整数(10-30,或-1退出)或 '切换为 XX'。"); - continue; - } - if (n == -1) { - System.out.println("退出当前用户,返回登录界面。"); - loggedIn = false; - break; - } - if (n < 10 || n > 30) { - System.out.println("题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录)。"); - continue; - } - // 生成题目 - List existing = LoadFile.loadExistingQuestions(user.username); - Generator.QuestionGenerator qg = new Generator.QuestionGenerator(currentLevel, existing); - List paper = qg.generatePaper(n); - if (paper.isEmpty()) { - System.out.println("未能生成题目(可能因去重约束导致)。"); - } else { - // 保存文件 - String savedPath = Save.savePaper(user.username, paper); - System.out.println("已生成 " + paper.size() + " 道题,保存为: " + savedPath); - } - } - } + Assign.assign(); } } \ No newline at end of file diff --git a/src/loadFile.java b/src/loadFile.java index 7e44bb3..6ece62a 100644 --- a/src/loadFile.java +++ b/src/loadFile.java @@ -17,6 +17,12 @@ public class LoadFile { * @return 已存在的所有题目列表 */ // 读取该用户文件夹下已有题目的所有题目文本 + // 将文件中按题号拆分题目 + //识别题号 + // 新题开始 保存旧题 + //去题号 + // 继续当前题(空行也可能出现) + // 转链式 去空格 去空字符串 去重 转回list public static List loadExistingQuestions(String username) { List all = new ArrayList<>(); Path userDir = Paths.get("data", username); @@ -27,20 +33,15 @@ public class LoadFile { DirectoryStream ds = Files.newDirectoryStream(userDir, "*.txt"); for (Path p : ds) { List lines = Files.readAllLines(p, StandardCharsets.UTF_8); - // 将文件中按题号拆分题目 StringBuilder cur = new StringBuilder(); for (String line : lines) { - //识别题号 if (line.matches("^\\s*\\d+\\..*")) { - // 新题开始 保存旧题 if (!cur.isEmpty()) { all.add(cur.toString().trim()); } cur.setLength(0); - //去题号 cur.append(line.replaceFirst("^\\s*\\d+\\.", "").trim()); } else { - // 继续当前题(空行也可能出现) if (line.trim().isEmpty()) { if (!cur.isEmpty()) { all.add(cur.toString().trim()); @@ -61,7 +62,6 @@ public class LoadFile { } catch (IOException e) { System.err.println("读取题目文件失败:" + e.getMessage()); } - // 转链式 去空格 去空字符串 去重 转回list return all.stream().map(String::trim).filter(s -> !s.isEmpty()).distinct() .collect(Collectors.toList()); } -- 2.34.1 From 00a73e8b300caea1f0639a39c6ff82c28364da53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E5=A5=87=E5=B3=B0?= Date: Sat, 27 Sep 2025 12:28:44 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 10244 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index b9c248e4585663fc4807019413e2e442faac5e5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHM&2Q936n`(97H>m}6B3{wAd9_JVwG-oLrT>H&a$YAP?ac-Xrcrbd+jVPUeDHc z66h+@o@wv>1NsM4>Zv`oJ@r(MTsia~fCFdx=3_TuL)r@@D4LNxzw!I<`2GCG-Zu*X zSl#re0W1J8=-_Ccr0x}s>-n*-4JpYOA(B7LN37vR%%gL2pS2cf1~dbj0nLDBKr`?* zFhJjI-i#56y4MV71~dbG2Kf8IqJyKYuq#o#I;ayR0O2r+MWeC!=}%~J0imt1E0HAB zP`VOIS5zeis>%VSJLzp@-<2rc0maO89W^tm3I$c+ftD}_v?c0ZGoTsR&j7F8hhYku z5JL8H{f-w&H}yg^;n=tHw$rw%^MCW&QJ7|>(qkOT4Zrj53FCw@V%&1>vTY}Gv(2>X zCTsj`nX$<0ja~0%7;M+giEAv*+%OIj;Sl-(nXG>u#y;Dwvd!2}g|8zOM&8KR%?~=A znaY)-RlZ!_DO#QBa%r|`&CXPIcJjt#;nOdc>i42n%)XbgqIzGzs66lYKhUTjP}tZ~ z0pZ`hfS#CUFQoi?BPU1SKV^=MpB|eSo1C0HbN1Z$haY`hH&1(R<6bl2w|b35EU8AD zLESu+Qo!>K7B42j76rPJ1@|*2{Ek%P0}e}pe|uN7{Gd%X6T1R&(JzxAh}W7)=r3$+ zq(Qc_XS~X1Ya}d+7Fil*A&Xbn#q3$onvXXa&B*Uyq0Lq4%^*n$_xY^cid-*<7UC+) zGS*sklf;diLG{5(NKx=R7gIWIw-Lt8!qume#(cs4M2<`-^q4g!dLxBc_`|y+#`)!# z#X-Sdl$wHlLzx(G3Fg3ob@&##@FV;LKf|B!2>yZRn8Q&#gBS4<7V$EEhBnUO60YGo zy7-OsAL>2i^XhsEFr`8NA#XWJ9I?1bGH#y(9~d@rVbOhggrg(+p?^Gy|Fe&A^c`kdw1oeEVW4&#Z!D;zkyG6$xI(XxDU5UblI&Q+{VmqEr_;$S58zNbW>v*HFt*|SR bB-9T5&wyjR-KFdQH@yM Date: Sat, 27 Sep 2025 12:29:42 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/.DS_Store diff --git a/src/.DS_Store b/src/.DS_Store deleted file mode 100644 index 66b715a26e99781c558e719124f38f82cbc6645c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK+e*Vg5Iq}ubKjPw@x!%+6A5()3Y^ z%)so~%beNd?2^p_aOrA!4U7Q{>4MRS#SW8k@s35I=a}exjv6z(qe6{IC)zp=Q2|-I zbKKz>CH?pMy>TtqnB5oEVqR2p#&MHGvgVU-Z~k>I@W8kdIab7+IWm0UmAhbp7w&?c zS&+7}oH0v9{t~z37R=Je{Aw{zJToV&?Blqr7H5P<&b5#6*;%}fDP zz!W%G1$btQ4Nn!VGzClnQ(&Wjd>>-EU=pxV^q&qE@;fNw13@v?ai5=}&YqiE9)$6juCE%vd>!FX`UcA4`Rp1Z))9 QL$e