From cb70435b792a3ad45ec943a9b5d10f470189d063 Mon Sep 17 00:00:00 2001 From: unknown <1393110457@qq.com> Date: Sun, 28 Sep 2025 15:19:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/AccountManager.class | Bin 0 -> 1865 bytes src/AccountManager.java | 40 ++++++ src/Filemanager.class | Bin 0 -> 4391 bytes src/Filemanager.java | 91 +++++++++++++ src/IQuestionGenerator.class | Bin 0 -> 216 bytes src/JuniorQuestionGenerator.class | Bin 0 -> 1968 bytes src/Main.class | Bin 0 -> 4284 bytes src/Main.java | 124 ++++++++++++++++++ src/PaperGenerator.class | Bin 0 -> 2207 bytes src/PaperGenerator.java | 48 +++++++ src/PrimaryQuestionGenerator.class | Bin 0 -> 2170 bytes src/QuestionGenerator.java | 185 +++++++++++++++++++++++++++ src/QuestionGeneratorFactory$1.class | Bin 0 -> 653 bytes src/QuestionGeneratorFactory.class | Bin 0 -> 791 bytes src/SeniorQuestionGenerator.class | Bin 0 -> 2046 bytes src/User.class | Bin 0 -> 932 bytes src/User.java | 55 ++++++++ src/UserType.class | Bin 0 -> 1420 bytes 18 files changed, 543 insertions(+) create mode 100644 src/AccountManager.class create mode 100644 src/AccountManager.java create mode 100644 src/Filemanager.class create mode 100644 src/Filemanager.java create mode 100644 src/IQuestionGenerator.class create mode 100644 src/JuniorQuestionGenerator.class create mode 100644 src/Main.class create mode 100644 src/Main.java create mode 100644 src/PaperGenerator.class create mode 100644 src/PaperGenerator.java create mode 100644 src/PrimaryQuestionGenerator.class create mode 100644 src/QuestionGenerator.java create mode 100644 src/QuestionGeneratorFactory$1.class create mode 100644 src/QuestionGeneratorFactory.class create mode 100644 src/SeniorQuestionGenerator.class create mode 100644 src/User.class create mode 100644 src/User.java create mode 100644 src/UserType.class diff --git a/src/AccountManager.class b/src/AccountManager.class new file mode 100644 index 0000000000000000000000000000000000000000..e2ad10f3518061cd59683952716cedfe05c3e278 GIT binary patch literal 1865 zcma)7-%}e^6#i}!vYTZg5DG|bv8@zI2&4gjV1rnQAk-vOQb4S~F3C385_U7$O=s$V z;5gGKADrnpNr06;NQ{ef8luU?lv1H(eWX7&pr2i-#zEtb58#F`}kJ? ztEealASfZEq6cAyfm{4GPt~|lNp0@m(n>Z%cu_ZWdx;@972i=HBO*aj(JRdRmrEtH zY1nyg@QT)8hzeVs*YwY|ZA)ud68abh9nz+)*HY`;s^)oJfr?;+xCT@VBF50u6xM{# z`L<-2k#UMadiKk=Pal1emN7zJr03=%cmZP)POEqkXBcF0)%81djZCj?ZRD4?_864h zb8SXAJ+9&eMbl!5@5s2&a%N7(L~AoIW0E$1eslNP zy?bfl-IR*Ba4mdwyRfmjC1bjEPRNUNbR%jSkn30?SKQN}w1m$1kX645KjU`f=+xn5ks zvV;{CS-iv0cjB$+Y3fa?mlHR-Mbw^GPt$&*rxNUID&EC9QB^denrwIe-+>Ax{Hlug zkfQ>+*)R{YRo&1mt-uedB*xoGymyZK#la9M>J@|A%?25JZaK9|^|#oW7YCVH%20B$ zW|<(-99>pu9_~{O^8FfVRNl0!nqlko9JEb#aiEjeb%|)By0t?MNAE3=Y5_2(2d*XftGU9=N8%;FWF|}4#U^&?s;E^+ZyFk-7pNTk*#sd(r6Zy7%q0i)Xh~1l)>@;Hl^lv zM<#k1da7j`V_M#A7H3wwcFR4d6Fq z?$Zf_NTZ7v?{R@NMO^prm*^{)`=%dZ<9A4*?+^-pPl|v86PX4ku}y0a0=-wLC9vZh Y?^0yqVHj@EZx5Vy3Q7AY<0i)b0lz2C%>V!Z literal 0 HcmV?d00001 diff --git a/src/AccountManager.java b/src/AccountManager.java new file mode 100644 index 0000000..cb26a91 --- /dev/null +++ b/src/AccountManager.java @@ -0,0 +1,40 @@ +import java.util.HashMap; +import java.util.Map; + + +public class AccountManager { + private Map users; + + public AccountManager() { + initializeUsers(); + } + + private void initializeUsers() { + users = new HashMap<>(); + + addUser("张三1", "123", UserType.PRIMARY); + addUser("张三2", "123", UserType.PRIMARY); + addUser("张三3", "123", UserType.PRIMARY); + + addUser("李四1", "123", UserType.JUNIOR); + addUser("李四2", "123", UserType.JUNIOR); + addUser("李四3", "123", UserType.JUNIOR); + + addUser("王五1", "123", UserType.SENIOR); + addUser("王五2", "123", UserType.SENIOR); + addUser("王五3", "123", UserType.SENIOR); + } + + private void addUser(String username, String password, UserType type) { + users.put(username + ":" + password, new User(username, password, type)); + } + + public User authenticate(String username, String password) { + String key = username + ":" + password; + return users.get(key); + } + + public boolean isValidUserType(String typeName) { + return UserType.fromChineseName(typeName) != null; + } +} \ No newline at end of file diff --git a/src/Filemanager.class b/src/Filemanager.class new file mode 100644 index 0000000000000000000000000000000000000000..b6f639b933e6b8092b0460038ad25ec41ea36afe GIT binary patch literal 4391 zcmcInd3aP;7609A@6F81HW1)JS(*fzkgcT{=maQ)kP=MTl9C3n^d<9>44KWDH#D(Y zH@c|Z6hS~+D^gOmScrAfCKal+t=770-K`5j^!xnRul7^o@4lIVNiyPJ@{xDnyZ794 z&pE%}Irq%#m&eWl*o411k%eppIT~`2Cs4HCIAGNIjbLBhw(k9Ak0p?|#uxNi>jbhZ zDt9@d!lA&a!6n6A%|5>wFoH&(84;M(6EO|TY&4=~lP|)}p~#Sed;!hY>I>CLaTSG} zxp?@@#OYI)o;^JA@Te0SilqT=fs%^Wt0uHt5nr&cK_07NwuTbSp*`lHFKR_?dv?o( zc^Y)NkQ*5A`XUa_EYNTr7793`X4r@rv_rr>Q?HvLSgc_Qt{0daFb2$xpG0x7;kSCBv4PUeBD#pjN@V=z5A3+ljK(8Sz)4{1H*-Yp~P_BliFeR~->k8h>l($c`kxvww z#+c8~Bb^A#==8$U5R-VQM9ACf3$k?GE#SO!ueWM%?cQkZawmrHJ_Yw^ct1Wc6>__B zk%r9ko_-mQjD?N$D~u0n_>g^!6-wA4)qX_7N9AM=6$M~A_4WGgxTI>sY&B1NG z(-fvkaf_5atlD;#wJ4O)>Q zGRb5~mV)sj>`bB$2ak4^oO5`AwQWElr7c zyRR>3Sg{D*SoOcvteJsn!#b93-ERcCy+-+T)5>`*rHo6KnTDAfDtFVx_E0R+BMT4> zDUw672dR~r!Kubj$RaU~aGPoMhrCf0uk$iZ?>U4}@dhsfA<-|~XKT5Np51EB%4E;^r$8U6FzJAivmk$ z#3U1X3N8sOy0$1QS^{cZPs(MnRpl*==dh6D*ZGx&0+uK;7vieuJss2t{YN+ns4N@QaI z6vN54V$8xE_T$fUMuqqn<|tGz@B+ptO>4wMw9LiT7e_F^Y7C2jt@3~x>i6X6Ira$- zInM1IM`@S4d=$&ZaYNTAD&tu0$<=emPz!kSYN$ZZ8^cZfP{y&cYaI1mx-yE@qqxPR zX4gAP9M$JeV2Q3)mpE3$u||I9cuzpp)i`cF=n%t`Z^_pU!_YmBJHr*N3-rY zKY}gNIH|QLj_qUU0G+t~EPdIB`|$|-!N+hIM>!^9(aZ<{^B4;qvx&=fSirV?5msR_ z)-&VV__YsZ@Sz+LEX6%o#!J48x+se%(<2jZy{tt)xxjRyY-?_Sbk~ z&VF){|5p;GXAF1B0Ch{4UbCliJ$ZWGxq2nLUM*2eloR;7o>!u-@HocN zOT_xSbjK+6k0Ri4jw8&&A|5TfK3@V5?ee%@MZfNHABbb{7#d3Qk6~W5uElY093OrG z2eZ(rYuRypTz66GkvJa9y(^ASdkS<-FNou4XHI?o@MN6(CeP|F?up}b$0twen)~xy zP0k$c9G*NRRnM22zwiXy(~qDnPf3cnq*Z*=JQ@$AaI@|@Ka3KOa|BQ8jyS$DhOgQL zIjE9b?&>p4p@7I0`DhY_Vz!ve(C-mtVj1I|;LE+_1yILaxslm(6Zvv8(O*f1uYw1w ziTW+rfHl~IwFvO*09iDIMjYht70JFs{H=Zh&3KwWN}fjxUcwf<%r@ptwBoPWj(=c> z$VCS&SS!k~izj!83fwMMV~tpcE}Lf~D7uVl1@|Rr#iVsBc loadAllQuestions(String username) { + Set allQuestions = new HashSet<>(); + String userDirPath = BASE_DIR + File.separator + username; + File userDir = new File(userDirPath); + + if (!userDir.exists() || !userDir.isDirectory()) { + return allQuestions; + } + + File[] files = userDir.listFiles((dir, name) -> name.endsWith(".txt")); + if (files == null) { + return allQuestions; + } + + for (File file : files) { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + String line; + StringBuilder question = new StringBuilder(); + boolean inQuestion = false; + + while ((line = reader.readLine()) != null) { + if (line.matches("^\\d+\\.\\s.*")) { + if (inQuestion) { + allQuestions.add(question.toString().trim()); + question.setLength(0); + } + String questionContent = line.substring(line.indexOf(". ") + 2); + question.append(questionContent); + inQuestion = true; + } else if (inQuestion && !line.trim().isEmpty()) { + question.append(" ").append(line.trim()); + } + } + + if (inQuestion && question.length() > 0) { + allQuestions.add(question.toString().trim()); + } + + } catch (IOException e) { + System.err.println("读取文件失败: " + file.getName()); + } + } + + return allQuestions; + } +} \ No newline at end of file diff --git a/src/IQuestionGenerator.class b/src/IQuestionGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..84dabe75db472868b67d3b67f18aa75c9337ea68 GIT binary patch literal 216 zcmX^0Z`VEs1_oCKZgvJHMg}3zz|z#>lFa-(_td=9qQsK?B6bEAMh1bb#Ii*FoW#6z zegCAa)Z`MNP&!0KDoh6>gNTNv4?1S z^;lIs_83s5O1W^Us@eDE^_x79o9U_muD2N$y2TFz$hU(^lV9%t}IdsjqA)u6Ji7Y3J9 zBX1Ij2yY$gA&Y2`aRQADt+QoAH%p6U&9ZgVn9&Taq}pbQ087p$1|{WWs{x9Oc%zE% z6p^+|y0IytiGjr=glHI$&`Lv}gmxMRdD>GlI?%~bXBOQg7DLlb7rh3C(7ULxqZVEC z$+BL^Yo!3f@bXSh%Xkaj45FcZVkZrvK!_%LliYts##uzE1+`ezj66dJd5+~d1dMaA zJ{d9eGXyx;lv&OeG>6G4|E1se_-~&_y)EM%3^CO6s7cc-XsY3atx0&7!SnME5=Lm@ z*%uTZ#CtN{$0(JdeOy)x)NCkPQ-phP@!mCF@kL(o7{fqqgxh!g-z%4JiMWkOxJ=DQ zoUCCaWK7`-gJhd707G;1I7VC{WzERAiX@S}tL|tC)5xjzs%~$QW!b7>Q^{xkS3$&K z5Z7d+Fh_}VreUkPLAy`Y?oMo}r8H5Y899yGmasrnS-K%%k&K*aNl24HiACHX*(F~i zN+Dt9>0}yHx}nXNce7e)S#{1Txalfat8QXwNZV>|XHG31hBWHdidxX~M-i`_N0se0 zQbF1*mvY*)&Q;J-jemJJ&T(my{z(D0WtY_AoMvyCd8&Vd&Vfb7B8`4z1IQsSLgN(Q zX6QcBvu@lmceFt_q09QTnxjj1m*HM5V~2q*{8hS+15S$>f_Tx;1PejPZ_S@!X6r8+=#Cp-~z3kch*{C$~djH`{)y*%6iD# zUbE(SUB_nvJ9wc|ZT%d+0;=W+u`Q-d5JXL4juoq5@)4$i?}#XmLsu4UWY0h%H8&xN z5U!yIb2x_uOyD|Zv50vrAx#IjiW~Tl=rnN?pW+ri$4B@Q>)6KzzC{+l(7va*jbE{e z->`*e*v20)kf97`5qNyB1{ zVTY;NeaJD+)9fBj$CP<8_BlD%9U~Z1mK;MA4j_2HdD)>W2#Y$iF$Bx0#t*L&o}fpG b`r%C6qE0{@FsSrjr}}{aSzFXW0qy?)Md;s< literal 0 HcmV?d00001 diff --git a/src/Main.class b/src/Main.class new file mode 100644 index 0000000000000000000000000000000000000000..d9c434d522be40b58392ecd95c8928fd2837a296 GIT binary patch literal 4284 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 literal 0 HcmV?d00001 diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..bad3bb0 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,124 @@ +import java.util.Scanner; + + +public class Main { + private AccountManager accountManager; + private PaperGenerator paperGenerator; + private Filemanager fileManager; + private User currentUser; + private Scanner scanner; + + public Main() { + this.accountManager = new AccountManager(); + this.fileManager = new Filemanager(); + this.scanner = new Scanner(System.in); + } + + public void run() { + System.out.println("=== 中小学数学卷子自动生成程序 ==="); + + while (true) { + if (currentUser == null) { + login(); + } else { + generatePaperProcess(); + } + } + } + + private void login() { + while (true) { + System.out.print("请输入用户名和密码(用空格隔开): "); + String input = scanner.nextLine().trim(); + + if (input.equalsIgnoreCase("exit")) { + System.exit(0); + } + + String[] parts = input.split("\\s+"); + if (parts.length != 2) { + System.out.println("请输入正确的用户名、密码格式(用户名 密码)"); + continue; + } + + String username = parts[0]; + String password = parts[1]; + + currentUser = accountManager.authenticate(username, password); + if (currentUser != null) { + paperGenerator = new PaperGenerator(currentUser); + System.out.println("当前选择为 " + currentUser.getUserType().getChineseName() + " 出题"); + break; + } else { + System.out.println("请输入正确的用户名、密码"); + } + } + } + + private void generatePaperProcess() { + UserType currentType = currentUser.getUserType(); + + while (true) { + System.out.print("准备生成 " + currentType.getChineseName() + + " 数学题目,请输入生成题目数量(10-30,输入-1将退出当前用户,重新登录): "); + String input = scanner.nextLine().trim(); + + if (input.equals("-1")) { + currentUser = null; + paperGenerator = null; + System.out.println("已退出当前用户,请重新登录。"); + return; + } + + if (input.startsWith("切换为")) { + handleTypeSwitch(input); + currentType = currentUser.getUserType(); + continue; + } + + try { + int questionCount = Integer.parseInt(input); + + if (questionCount < 10 || questionCount > 30) { + System.out.println("题目数量必须在10-30之间"); + continue; + } + + String[] questions = paperGenerator.generatePaper(questionCount, fileManager); + fileManager.savePaper(currentUser.getUsername(), questions); + + } catch (NumberFormatException e) { + System.out.println("请输入有效的数字(10-30或-1)"); + } catch (Exception e) { + System.out.println("生成试卷时出错: " + e.getMessage()); + } + } + } + + private void handleTypeSwitch(String input) { + String typeName = input.substring(3).trim(); + + if (!accountManager.isValidUserType(typeName)) { + System.out.println("请输入小学、初中和高中三个选项中的一个"); + return; + } + + UserType newType = UserType.fromChineseName(typeName); + paperGenerator.setUserType(newType); + + User tempUser = new User(currentUser.getUsername(), currentUser.getPassword(), newType); + currentUser = tempUser; + + System.out.println("已切换为 " + typeName + " 出题"); + } + + public static void main(String[] args) { + try { + Main app = new Main(); + app.run(); + } catch (Exception e) { + System.err.println("程序出现异常: " + e.getMessage()); + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/PaperGenerator.class b/src/PaperGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..d4e43a7cd6e4985be892b8b1db759d6ee543c5d4 GIT binary patch literal 2207 zcmaJ@TUQfT6#h;EnIsH?k*JZ1Q9+X+;H}gevz0_x|?f+h?Er{rdTz z0QST1!U3m*DjC&qG1Q;q7kG!twPeTP;d3HxGPt@FO)+;fI78t<58Uub@XDxx%&_DL zPm9a}p@|GP^$bHzJe$b~%{*ZU+PMa-chrj|sFP4HV<~(LRXJfzQrK$8FQx^9917dY z){YDs;Fqvm#tN)tSa~!n3{%my1xLL+PVO!;)WtJ`n_@x05DXP@!UO#krco<}RWcg! z7Q@o>Zz3}^EM_F3iL~wFWKBiw=;OvnOqgD*hSLIED`OqjGx(CZT8Ko!u|Yu&6b;EJ zDxrm8U9r;rsw$FP-J3~fQ&hYCpT$MmO4p5zl+WCQyR+Z^JahZ;+|`@YFD}pBpPK&e zr!AY?wrzend2Q~_6EB((w&;s6_(M5YHi0oSqiD%!cu>NoGG=oEib{?$Yv#_qncr^De)Yr57q?zMyD@k5#`MD*vtyTXeEj?S^;eH3rXPR* z>e20)XP0MhU77y!%Jj`&XTHAra%$X*ZiKDu`egLueFk@2*G#Tx)D2}E&lq_?VUan` zhgJHe#wb1bwWa5k%xVj4*`tLVQ@AC)77d@SbWK(KfXESkO zA(Be@_-eOWg8HRf*G5La8AOgRcPwX=3*Zy+68@7 zbmaKS)qY`6-7P&1dBq%jAJ-D9Fq#K+eKebnR%Tc7OPQfPDocdz*&|W24d59ja zsxieBM4H^M(fsaFxnT%Hg3i!Vk<((KN;uEZ^#7{X9bo5$wKOFi)Sym!((I*`!y1`j z7_`?XX-{{Gt-)xTeMpia+V$BMKrk`^7HNG7DbhNQ+Gkky6oJSTRu4^J%~J$_Azg-3 z^juEXfEQJS=OM%f)M5<{JBHKvD397g-mGXmk=7hi(cHQbK{u5fK2rV|pX5wfHvxJ` z@}RNadmo<0`lg4dokH`FZ^HyaFB<!D4NCy>U`HjXVjt7shzR88U?2TnRWtNqoD z4{+AmDb*)B-6RW4Vi&_s*CmPhCBOT=1=c;}+c$yU7q+Qu5(gX@oBzjB4$$rc2fmsA zs~|f}ux);VtvVBMJ;yOR`|n16l(Bg generatedQuestions; + private User currentUser; + + public PaperGenerator(User user) { + this.currentUser = user; + this.questionGenerator = QuestionGeneratorFactory.createGenerator(user.getUserType()); + this.generatedQuestions = new HashSet<>(); + } + + public void setUserType(UserType userType) { + this.questionGenerator = QuestionGeneratorFactory.createGenerator(userType); + } + + public String[] generatePaper(int questionCount, Filemanager fileManager) { + if (questionCount < 10 || questionCount > 30) { + throw new IllegalArgumentException("题目数量必须在10-30之间"); + } + + String[] questions = new String[questionCount]; + Set allHistoryQuestions = fileManager.loadAllQuestions(currentUser.getUsername()); + generatedQuestions.addAll(allHistoryQuestions); + + for (int i = 0; i < questionCount; i++) { + String question; + int attempt = 0; + int maxAttempts = 100; + + do { + question = questionGenerator.generateQuestion(); + attempt++; + if (attempt >= maxAttempts) { + throw new RuntimeException("无法生成不重复的题目,请尝试清理历史文件"); + } + } while (generatedQuestions.contains(question) || !questionGenerator.isValidQuestion(question)); + + generatedQuestions.add(question); + questions[i] = (i + 1) + ". " + question; + } + + return questions; + } +} \ No newline at end of file diff --git a/src/PrimaryQuestionGenerator.class b/src/PrimaryQuestionGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..764a687cfd048de63aee65e3c12aacb3363ac488 GIT binary patch literal 2170 zcmaJ?OKcNY6g|%#dj@A9W`Ye)NE$*y{fRLRY1+g|__%yblkhQ32nm#l{hADMX3TgD zMcuOKs_Krys){P1N>$ZXU?fmkbjhllZoBBB-LHgs57XZ-B`PM_*CV zjXeyq$=`SKCPgU4^NGBSy$m}y!uJdxtr_JKw?pWGUmW{Xyoxx5pjRr~EHUgR-A#7Z zv|MvZ6)E&Hv)85GCz0$|t?-;6+>wIHiv6l0XMqE$1U+>%bEi8gT{m&j|>EQeGa#u3WVioVQq zmRZ!D8N*p3s_N*bLmA)KM7fD=4Gf1AyhSCtJa-^HoSIK3Gx5a!`Rb+ASZ@en99MAy zC#gg$x>H=@1RZGxO&L5z3Ha_Cp);Xk5>pg;(J~#~FiEMSQAxyC;MZ#0Eb?rERL@Wq ze){mPf^$Sv4O78+B8pa3!88#RlYqUTVip&ve2yg$j@Y(-Q*=yXE+=E2S~%aN!KIv4 z;tZ`5hRLUDD+}B{uP>B|6JGSDfUhetY%Mr?ad}d&tckQ5)oHzKl-4C=6e-5J97CvJ z)$AfaZV064`umHy+An&SOi+(GRmavVliXRdN)*l#0kDLEtK>NA9_wxmq8!2sOc|Ca zYK5V9qwx*%y0y$RUi)};KCTyOa4GIj8Z){k=$Sc5BVFdz-U-WEu2r&|+qi-AlH&QB z72ZU=ad^E=^wJ=#LFDvuxnMXv%b?~>S}?h?Uaj(~3@U%$rkI+!Dx=2G_5Y$Y?_ONA zIa+98GR)EG6N`=p!zXqR-4gxN5~bHmL`@LQ=H`lJ3FM(D(3sO zbRC(PM29v&MrP5ypY3TLBXNjXsV7Ur~;HZoZ}wAv#Ri+Kx8*+e_a` zL@|b)IE5J1s~y+Sfe)xwx2alRq6_!22Tw`vd-UN4?8A?=gMUFBzaoL(N&9c4afML3 z5qyR|CZmV_gO6l{*`J8~g}^gJ#RqGny68CRRR_y%X8@xqEmy~}I~Yu9`8wXdi&RQG z?GimH?W{}0Qd+?!!YSOM zN1fJ%5z59eWnk2`*AD-4O0O)V#f@3U0;BGZ{y{o^lw5x~-lKaP=`WK@i|%Pq) closeCount) { + result += ")"; + closeCount++; + } + + return result + " = "; + } + + @Override + public boolean isValidQuestion(String question) { + return question.matches("^[0-9+\\-*/().\\s]+=$") && + !question.contains("²") && !question.contains("√") && + !question.contains("sin") && !question.contains("cos") && !question.contains("tan"); + } + + private int countChar(String str, char ch) { + int count = 0; + for (char c : str.toCharArray()) { + if (c == ch) count++; + } + return count; + } +} + + +class JuniorQuestionGenerator implements IQuestionGenerator { + private Random random = new Random(); + private String[] operators = {"+", "-", "*", "/"}; + + @Override + public String generateQuestion() { + StringBuilder question = new StringBuilder(); + int operandCount = random.nextInt(3) + 2; + boolean hasSpecialOperator = false; + + question.append(random.nextInt(100) + 1); + + for (int i = 1; i < operandCount; i++) { + String operator; + if (!hasSpecialOperator && random.nextDouble() < 0.4) { + if (random.nextBoolean()) { + operator = "²"; + hasSpecialOperator = true; + } else { + operator = "√"; + hasSpecialOperator = true; + } + } else { + operator = operators[random.nextInt(operators.length)]; + } + + int operand = random.nextInt(100) + 1; + + if (operator.equals("²")) { + question.append("²"); + } else if (operator.equals("√")) { + question.append(" ").append(operator).append(operand); + } else { + question.append(" ").append(operator).append(" ").append(operand); + } + } + + if (!hasSpecialOperator) { + if (random.nextBoolean()) { + question.append("²"); + } else { + question.append(" √").append(random.nextInt(100) + 1); + } + } + + return question.toString() + " = "; + } + + @Override + public boolean isValidQuestion(String question) { + return (question.contains("²") || question.contains("√")) && + !question.contains("sin") && !question.contains("cos") && !question.contains("tan"); + } +} + + +class SeniorQuestionGenerator implements IQuestionGenerator { + private Random random = new Random(); + private String[] operators = {"+", "-", "*", "/"}; + private String[] trigFunctions = {"sin", "cos", "tan"}; + + @Override + public String generateQuestion() { + StringBuilder question = new StringBuilder(); + int operandCount = random.nextInt(3) + 2; + boolean hasTrigFunction = false; + + if (random.nextDouble() < 0.6) { + String trigFunc = trigFunctions[random.nextInt(trigFunctions.length)]; + int angle = random.nextInt(360) + 1; + question.append(trigFunc).append("(").append(angle).append("°)"); + hasTrigFunction = true; + } else { + question.append(random.nextInt(100) + 1); + } + + for (int i = 1; i < operandCount; i++) { + String operator = operators[random.nextInt(operators.length)]; + + if (!hasTrigFunction && random.nextDouble() < 0.5) { + String trigFunc = trigFunctions[random.nextInt(trigFunctions.length)]; + int angle = random.nextInt(360) + 1; + question.append(" ").append(operator).append(" ").append(trigFunc).append("(").append(angle).append("°)"); + hasTrigFunction = true; + } else { + int operand = random.nextInt(100) + 1; + question.append(" ").append(operator).append(" ").append(operand); + } + } + + if (!hasTrigFunction) { + String trigFunc = trigFunctions[random.nextInt(trigFunctions.length)]; + int angle = random.nextInt(360) + 1; + question.append(" ").append(operators[random.nextInt(operators.length)]) + .append(" ").append(trigFunc).append("(").append(angle).append("°)"); + } + + return question.toString() + " = "; + } + + @Override + public boolean isValidQuestion(String question) { + return question.contains("sin") || question.contains("cos") || question.contains("tan"); + } +} + + +class QuestionGeneratorFactory { + public static IQuestionGenerator createGenerator(UserType userType) { + switch (userType) { + case PRIMARY: + return new PrimaryQuestionGenerator(); + case JUNIOR: + return new JuniorQuestionGenerator(); + case SENIOR: + return new SeniorQuestionGenerator(); + default: + throw new IllegalArgumentException("不支持的题目类型"); + } + } +} \ No newline at end of file diff --git a/src/QuestionGeneratorFactory$1.class b/src/QuestionGeneratorFactory$1.class new file mode 100644 index 0000000000000000000000000000000000000000..d199ebe5caee6d0bc833090964099a14f735eb06 GIT binary patch literal 653 zcmZWmQBM;=5dOA3?%MMThagl`K&`gbL?Q|CL1JP^tEaTpo@fkD+v|odp1b7kis6O7 z!<&hk7-9@Rz#nCty?}in+04xM&FnX`vw!~nIs?$cLl*@U9atWwU^A3CcsV7<=aBEhK%Tq0=a@Ect(V;+mRhAQsjKKVM< wu|d9oJ0xu9@?R+j%)B>nAXF#Y%$YhKkazQWDez1G07r<4=>Px# literal 0 HcmV?d00001 diff --git a/src/QuestionGeneratorFactory.class b/src/QuestionGeneratorFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..14e3b321cacd0376ec58f0cd5d060b4ce2169aad GIT binary patch literal 791 zcmZ`%&ubGw6#gcO+08b!v9ak7Q;l`iB-RwcTZ$m1kx1Gq(L(Vw*$#2*W;e`k)OZuT zsW%Uz;K8FvZHqKwK=1w?+TcGSz6sSFq62T<V~u%T(*Zg8Az(hCmANMw_Mwk|3IV^Vulb^@gKyrLd-JE4K7}G98u@aRatK}gc~eB zv_w z>mF%;NMcmImb664R*b2kih>%LVPuuwb494;K100h(z7l(-1mi#49?JJQA_RgUBGab zqFM4xW%3=cT?!b^(XNhx_lV&xj(qtytd>6@$ z4kmWGNRgi+KTZAw`Siy4$qq7K2^H%1O3^sLHr4H59(%<15sTPIjJKx7& SAOsMhemX8vWb`8n68djC48j@! literal 0 HcmV?d00001 diff --git a/src/SeniorQuestionGenerator.class b/src/SeniorQuestionGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..c66ecd05889e9a633066e2b029aef517f5b82160 GIT binary patch literal 2046 zcma)6-BTM?6#w01lU>rSgoU)FP)sR>d`P3UqLNaSAZ-+=B?yF~Wl2_82)i-abc*_* zPV48?@!MLd&h&*BAL@)vXWEemAN?zw={Vy*;7jdP&)p3WKBnVla?iQh+ggEm@~qqvB= zHUD-HDXX9xvl8kVSX4rQNT-CoL?RLziNrW;lZ<8@V5l+k4oH!q{;cD@%1vCtqm)Kb zHzXV+CSw*Q93sY24esW!jCSs3H-XL$l#C1yyeJ|>*=*Fs38}B7=dxPChYq-T`cWB= zp_4&0vQz>KCc;B zhR)FT1j5^nDsfP1&r&r)+*6!;I?m8c0X#&X-{@~Q!rtCLs1xXu&_^DE+(W-itueqL zS*DXMLqll0ued^Hr(`7YB2{QnUCmp?jH-6s{j*LZ zYHLPx-6>1WEDWjnib}0s98+_8c0(gj9fMO5LZ=%|nWaKT8_@ZU?pf1cZ}lU*X{eq1 zOw%e_1vNjUS#xHVn(i#M2MhKDYrS~Yhu3gU#5AuXX}4{3nr@so7qplI=#+Lq&Cm=j zFb6RxX>j8gy!p5rt|$=#;N1fbKokb_>qm=OUT2t+k))n3hT&XRC%7D z8VU56!%+&AK*UXfv~#;k99`b6W&twm9=|BCm4CAo#l&{ptr^>Bq_#PS^)Pm-N3@K@ zZJY#d(9O8)TQbl@{5y0L@1h>>A%KfGgiG{JzK?!-{5b2%XZ;1tHbv!fMpiKHP(e6*a&`P^SF*tLTiEefDd*D zW3~6;V)s!J;lGF0d+_{&3F?nmFy?d#y|ym;0SBW>OBpX+MIfpKZAOkNt;Bo>QCNZC s{%JiW-qpa04dsQq$^9I?=NPx;6G#)4NMnlrlbE5MkGKppnu5mv0H40~7XSbN literal 0 HcmV?d00001 diff --git a/src/User.class b/src/User.class new file mode 100644 index 0000000000000000000000000000000000000000..aa0783df8f4a4369f77ad93321ef6bcddc2d0c56 GIT binary patch literal 932 zcmZuv%Wl(96r3A7aUOOO@}f`*6bdAEO2s-AAXOkCrGOOZf)!3`r739=@+jg{_yAy& z1xO@FED$Red=o;g`Eq3`g?~us z1za?+YT^>sPMHWwpb78w#O;z^EHAMGi?zxN5x8RFD%P3nz#Sdz^!Hf}9Y0dIvrGv+ zEs6X)SrlH`V`Bn=Ouf_d9#4*%^yD_XluXfyAcJldPMHan0?^a2Q74q3LnbMUR0>vO z?6zL*x`R+Z+2~J(E$?ARk|hLqTP_6a?01A$u5snn@hc)X;zwQrV+@KjaE-O?*_$(DKl5B+gKLQlfa4=$!6%I*wNm_h12;pZHAY2L)cykF(}F7L z0E_Fb|3a;^&@`cCRJclg%c|M4&HZ07@_`qcS}v^__`;rkv@ZR-3$ zd{?Tg@||Pl9g5sp+*$t4&_6=grj&^Iu5*58^7LK63W`irg6*4$8fo<#8wTR{#Wd$B etf5S*_{~b1IWCJn!%GnjS{d|Xl{?2zRQ(HklBin% literal 0 HcmV?d00001 diff --git a/src/User.java b/src/User.java new file mode 100644 index 0000000..a4df58d --- /dev/null +++ b/src/User.java @@ -0,0 +1,55 @@ + +public class User { + private String username; + private String password; + private UserType userType; + + public User(String username, String password, UserType userType) { + this.username = username; + this.password = password; + this.userType = userType; + } + + public String getUsername() { return username; } + public String getPassword() { return password; } + public UserType getUserType() { return userType; } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + User user = (User) obj; + return username.equals(user.username) && password.equals(user.password); + } + + @Override + public int hashCode() { + return username.hashCode() + password.hashCode(); + } +} + + +enum UserType { + PRIMARY("小学"), + JUNIOR("初中"), + SENIOR("高中"); + + private final String chineseName; + + UserType(String chineseName) { + this.chineseName = chineseName; + } + + public String getChineseName() { + return chineseName; + } + + public static UserType fromChineseName(String name) { + for (UserType type : values()) { + if (type.chineseName.equals(name)) { + return type; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/UserType.class b/src/UserType.class new file mode 100644 index 0000000000000000000000000000000000000000..0c9eae2a8b1ed408c12baa1320a4014798cb3bd4 GIT binary patch literal 1420 zcmZuwO;Zy=5Pg$mvzxfVxGD$|jfk2JAc*2u5J8NJ2C#@wqNgP;7!8T$!zyncJb3e} z2QMDgt^*ljX*s3FJVjH##Xqj9g?+R>-*{NI3J*PM4=A2R~(cnmzi`o1_qOpQZpz=pd?80tp8qDUi zR zbeZTzk3hJtZLKDO?%j%$BXD~oqiSpHYX&p}eGL1t^!Uf?7qVo()N)uL)(EIc*vQhJ zF%U3tROWc}?EC6#1Ezr!G=IK&LQ|$pm>85Q^v;?L-)P|mRc}tQ1rwFUIqr`$m!oIb zf2!K`!BgY7TfSMiaoH)dZ)LYgX@PWhA@7tcMdH`Vtc`4jV_$H~qm2z;zbn;9GMXVN_H#9|V#9*E7P=f29E>wyc_gq%W3&^K%P>yN1 zkBw>JE7FEr<%WrW^i%U4)Sv;>Cu z?^kzG#<$@#Jk@xQ@&+vtUq$m*h>h{X#A;0Y00eOh;8oCWo<3fg@vim{Xpi^2L-Y;p zwPH=Y1!?&a!zS1mrWK+~QkEZoBm6u#L%=A`@?Y|g@RSO)_*+E(rP596Nm5@6ohMjh zD0z3Ly1tz94n^9ZBhnS=Kj~}r5gvb!*i-mheM=9$;^m+3N}5NtqFEvPuoZ`}8~tos zA9)Vo9P^R+Zv=E$LhSejEgY0PWDgG+w_{)rg= literal 0 HcmV?d00001 -- 2.34.1