From f47190ba33d5a8f5dd35843997635e4b167f6db6 Mon Sep 17 00:00:00 2001 From: hnu202326010302 <1677625723@qq.com> Date: Sun, 28 Sep 2025 22:41:34 +0800 Subject: [PATCH] ADD file via upload --- src/MiddleSchoolProblemGenerator.java | 129 ++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/MiddleSchoolProblemGenerator.java diff --git a/src/MiddleSchoolProblemGenerator.java b/src/MiddleSchoolProblemGenerator.java new file mode 100644 index 0000000..94c6bad --- /dev/null +++ b/src/MiddleSchoolProblemGenerator.java @@ -0,0 +1,129 @@ +// Middleproblem.java +import java.util.Random; + +/** + * 初中数学题目生成器实现类。 + */ +public class MiddleSchoolProblemGenerator implements MathProblemGenerator { + private final Random random = new Random(); + private static int advancedOperationFlag = 1; + private String userName = "default"; + private String timestamp = "default"; + private int problemNumber = 1; + + public static void main(String[] args) { + for (int index = 0; index < 15; index++) { + advancedOperationFlag = 1; + MiddleSchoolProblemGenerator generator = new MiddleSchoolProblemGenerator(); + System.out.println((index + 1) + ". " + generator.generateSmartExpression()); + } + } + + public void start(int problemCount, String userName) { + this.userName = userName; + TimeManager timeManager = new TimeManager(); + timestamp = timeManager.getCurrentTime(); + + for (int index = 0; index < problemCount; index++) { + advancedOperationFlag = 1; + System.out.println((index + 1) + ". " + generateSmartExpression()); + System.out.println(); + } + } + + @Override + public String generateSmartExpression() { + int operatorCount = random.nextInt(3) + 1; + int advancedOperationTarget = random.nextInt(operatorCount) + 1; + String result; + + while (true) { + boolean isDuplicate = false; + result = buildExpression(operatorCount, advancedOperationTarget); + + FileManager fileManager = new FileManager(); + fileManager.readUserFiles(userName); + + for (String line : fileManager.getFileLines()) { + String[] parts = line.split("\\.", 2); + String expression = parts.length > 1 ? parts[1] : line; + if (result.equals(expression)) { + isDuplicate = true; + break; + } + } + + if (isDuplicate) { + continue; + } + + fileManager.createUserFile(userName, timestamp); + fileManager.writeToFile(userName, timestamp, problemNumber + "." + result); + fileManager.writeToFile(userName, timestamp, " "); + problemNumber++; + break; + } + return result; + } + + @Override + public String buildExpression(int operatorCount, int advancedOperationTarget) { + if (operatorCount == 1) { + return generateSimpleExpression(advancedOperationTarget); + } + + int splitPoint = random.nextInt(operatorCount - 1) + 1; + + String leftPart = (splitPoint > 1 && random.nextBoolean()) + ? "(" + buildExpression(splitPoint, advancedOperationTarget) + ")" + : buildExpression(splitPoint, advancedOperationTarget); + + String rightPart = (operatorCount - splitPoint > 1 && random.nextBoolean()) + ? "(" + buildExpression(operatorCount - splitPoint, advancedOperationTarget) + ")" + : buildExpression(operatorCount - splitPoint, advancedOperationTarget); + + char operator = getRandomOperator("+-*/"); + return leftPart + " " + operator + " " + rightPart; + } + + @Override + public String generateSimpleExpression(int advancedOperationTarget) { + int firstOperand = random.nextInt(100) + 1; + int secondOperand = random.nextInt(100) + 1; + char operator = getRandomOperator("+-*/√²"); + + if (advancedOperationFlag == advancedOperationTarget) { + operator = getRandomOperator("√²"); + if (operator == '√') { + advancedOperationFlag = 0; + return operator + "" + secondOperand; + } else if (operator == '²') { + advancedOperationFlag = 0; + return firstOperand + "" + operator; + } + } else { + advancedOperationFlag++; + } + + if (random.nextInt(2) == 0) { + return firstOperand + ""; + } + + if (operator == '√') { + return operator + "" + secondOperand; + } else if (operator == '²') { + return firstOperand + "" + operator; + } else { + if (random.nextBoolean()) { + return firstOperand + " " + operator + " " + secondOperand; + } else { + return "(" + firstOperand + " " + operator + " " + secondOperand + ")"; + } + } + } + + @Override + public char getRandomOperator(String operators) { + return operators.charAt(random.nextInt(operators.length())); + } +} \ No newline at end of file