本篇文章对刘其同学的个人项目代码进行分析评价。
刘其同学使用 Java 作为项目语言,数据存储在 sqlite3 数据库中。
很好地完成了需求文档中的要求,功能完整,输入提示叙述清晰。
. ├── GenPaper.iml ├── data │ ├── userInfo.txt │ └── 张三1 │ ├── 2022-09-10-09-56-10.txt │ └── 2022-09-10-10-00-07.txt ├── database │ └── paperManageSystem.sqlite ├── lib │ ├── mysql-connector-java-8.0.29.jar │ └── sqlite-jdbc-3.7.2.jar ├── out │ └── production │ └── GenPaper │ ├── LoginUIListener.class │ ├── Main.class │ ├── TestCode │ │ ├── TestConnectDatabase.class │ │ ├── TestCurrentDirectory.class │ │ ├── TestFileOperate.class │ │ ├── TestSetDuplicate.class │ │ └── TestStringSplit.class │ ├── TestGUI$1.class │ ├── TestGUI.class │ └── User.class └── src ├── LoginUIListener.java ├── Main.java ├── TestCode │ ├── TestConnectDatabase.java │ ├── TestCurrentDirectory.java │ ├── TestFileOperate.java │ ├── TestSetDuplicate.java │ └── TestStringSplit.java ├── TestGUI.java └── User.java
该项目中使用的文件夹功能如下:
本项目架构清晰,文件内容完整。
主要发挥功能的代码有两个,功能如下:
Main.java 中主要的几个函数调用过程如下图所示
实现的具体功能如下:
以小学代码为例,分析出题逻辑,其余两个与之类似。
ArrayList<String> pros = new ArrayList<>(); Random random = new Random(); int countNum = 0; while (true) { if (countNum == num) { break; } int opCount = random.nextInt() % 5 + 1; // 随机操作数数量 ArrayList<Integer> opNums = new ArrayList<>(); // 随机操作数数值 for (int i = 0; i < opCount; i++) { opNums.add(random.nextInt(100) + 1); }
生成随机数与操作数的代码如上,首先在程序的开始就将其初始化,程序中直接使用即可。
if (bracketNumber > 0 && random.nextInt(2) == 0) { bracketNumber--; leftBracketNum++; problem.append("("); distance = 0; } /*...*/ distance++; if (leftBracketNum > 0 && distance >= 2 && random.nextInt(2) == 0) { leftBracketNum--; problem.append(")"); } /*...*/ if (leftBracketNum != 0) { for (int i = 0; i < leftBracketNum; i++) { problem.append(")"); }
括号的生成逻辑如上部分代码所示,引入 distance 来规范括号的长度,避免括号中只有一个操作数或一个一元表达式的情况出现。
String write = problem.toString(); if (!duplicateCheck(write) && write.length() >= 7) { pros.add(write); currentUserAllProblems.add(write); countNum++; } savePro(pros, accN);
题目生成后的处理逻辑如上,将其转为 string 后存储。
在另外两个年级还设计了题目难度的相关代码,这里不再赘述。