|
|
|
|
@ -21,10 +21,10 @@ public class PrimaryQuestionGenerator extends BaseQuestionGenerator {
|
|
|
|
|
boolean useParentheses = random.nextDouble() < 0.3 && operandCount >= 3;
|
|
|
|
|
int[] parenthesesPositions = findParenthesesPositions(operations, useParentheses);
|
|
|
|
|
|
|
|
|
|
questionText = buildQuestionText(operands, operations,
|
|
|
|
|
parenthesesPositions[0], parenthesesPositions[1]);
|
|
|
|
|
answer = calculateAnswer(operands, operations,
|
|
|
|
|
parenthesesPositions[0], parenthesesPositions[1]);
|
|
|
|
|
questionText =
|
|
|
|
|
buildQuestionText(operands, operations, parenthesesPositions[0], parenthesesPositions[1]);
|
|
|
|
|
answer =
|
|
|
|
|
calculateAnswer(operands, operations, parenthesesPositions[0], parenthesesPositions[1]);
|
|
|
|
|
|
|
|
|
|
} while (!isValidAnswer(answer));
|
|
|
|
|
|
|
|
|
|
@ -45,7 +45,7 @@ public class PrimaryQuestionGenerator extends BaseQuestionGenerator {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new int[]{parenStart, parenEnd};
|
|
|
|
|
return new int[] {parenStart, parenEnd};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int findSuitableParenthesesPosition(int[] operations) {
|
|
|
|
|
@ -86,12 +86,12 @@ public class PrimaryQuestionGenerator extends BaseQuestionGenerator {
|
|
|
|
|
return calculateWithParentheses(operands, operations, parenStart, parenEnd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private double calculateWithParentheses(int[] operands, int[] operations, int parenStart, int parenEnd) {
|
|
|
|
|
// 修改:使用Double列表
|
|
|
|
|
List<Double> numbers = new ArrayList<>();
|
|
|
|
|
private double calculateWithParentheses(
|
|
|
|
|
int[] operands, int[] operations, int parenStart, int parenEnd) {
|
|
|
|
|
List<Integer> numbers = new ArrayList<>();
|
|
|
|
|
List<Integer> ops = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
for (int operand : operands) numbers.add((double) operand);
|
|
|
|
|
for (int operand : operands) numbers.add(operand);
|
|
|
|
|
for (int operation : operations) ops.add(operation);
|
|
|
|
|
|
|
|
|
|
double parenthesesResult = calculateParenthesesContent(numbers, ops, parenStart, parenEnd);
|
|
|
|
|
@ -99,45 +99,28 @@ public class PrimaryQuestionGenerator extends BaseQuestionGenerator {
|
|
|
|
|
if (!isValidAnswer(parenthesesResult)) return -1;
|
|
|
|
|
|
|
|
|
|
replaceWithParenthesesResult(numbers, ops, parenStart, parenEnd, parenthesesResult);
|
|
|
|
|
// 修改:调用新的方法名
|
|
|
|
|
return calculateDoubleList(numbers, ops);
|
|
|
|
|
return calculateWithoutParentheses(numbers, ops);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private double calculateParenthesesContent(List<Double> numbers, List<Integer> ops, int start, int end) {
|
|
|
|
|
List<Double> parenNumbers = new ArrayList<>();
|
|
|
|
|
private double calculateParenthesesContent(
|
|
|
|
|
List<Integer> numbers, List<Integer> ops, int start, int end) {
|
|
|
|
|
List<Integer> parenNumbers = new ArrayList<>();
|
|
|
|
|
List<Integer> parenOps = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
for (int i = start; i <= end; i++) parenNumbers.add(numbers.get(i));
|
|
|
|
|
for (int i = start; i < end; i++) parenOps.add(ops.get(i));
|
|
|
|
|
|
|
|
|
|
// 修改:调用新的方法名
|
|
|
|
|
return calculateDoubleList(parenNumbers, parenOps);
|
|
|
|
|
return calculateWithoutParentheses(parenNumbers, parenOps);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void replaceWithParenthesesResult(List<Double> numbers, List<Integer> ops,
|
|
|
|
|
int start, int end, double result) {
|
|
|
|
|
private void replaceWithParenthesesResult(
|
|
|
|
|
List<Integer> numbers, List<Integer> ops, int start, int end, double result) {
|
|
|
|
|
int numCountToRemove = end - start + 1;
|
|
|
|
|
int opCountToRemove = end - start;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < numCountToRemove; i++) numbers.remove(start);
|
|
|
|
|
for (int i = 0; i < opCountToRemove; i++) ops.remove(start);
|
|
|
|
|
|
|
|
|
|
// 修改:直接添加double结果,不转换为int
|
|
|
|
|
numbers.add(start, result);
|
|
|
|
|
numbers.add(start, (int) Math.round(result));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 修改:重命名方法,避免与父类冲突
|
|
|
|
|
private double calculateDoubleList(List<Double> numbers, List<Integer> ops) {
|
|
|
|
|
double[] doubleNumbers = new double[numbers.size()];
|
|
|
|
|
for (int i = 0; i < numbers.size(); i++) {
|
|
|
|
|
doubleNumbers[i] = numbers.get(i);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int[] intOps = new int[ops.size()];
|
|
|
|
|
for (int i = 0; i < ops.size(); i++) {
|
|
|
|
|
intOps[i] = ops.get(i);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return calculateExpression(doubleNumbers, intOps);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|