|
|
|
|
@ -85,61 +85,86 @@ public class ChoiceQuestionGenerator {
|
|
|
|
|
|
|
|
|
|
// 30%概率生成纯平方/开方题目,70%概率生成包含平方/开方的复合运算题目
|
|
|
|
|
if (random.nextDouble() < 0.3) {
|
|
|
|
|
// 生成纯平方或开方题目
|
|
|
|
|
if (random.nextBoolean()) {
|
|
|
|
|
// 平方题目
|
|
|
|
|
int a = MIN_OPERAND_VALUE + random.nextInt(MAX_OPERAND_VALUE);
|
|
|
|
|
String questionText = String.format("%d² = ?", a);
|
|
|
|
|
int correctAnswer = a * a;
|
|
|
|
|
List<Integer> options = generateWrongOptions(correctAnswer);
|
|
|
|
|
options.add(correctAnswer);
|
|
|
|
|
Collections.shuffle(options);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText,
|
|
|
|
|
String.valueOf(options.get(0)),
|
|
|
|
|
String.valueOf(options.get(1)),
|
|
|
|
|
String.valueOf(options.get(2)),
|
|
|
|
|
String.valueOf(options.get(3)),
|
|
|
|
|
String.valueOf(correctAnswer),
|
|
|
|
|
questionNumber);
|
|
|
|
|
} else {
|
|
|
|
|
// 开方题目
|
|
|
|
|
int perfectSquare = (int) Math.pow(random.nextInt(10) + 1, 2);
|
|
|
|
|
String questionText = String.format("√%d = ?", perfectSquare);
|
|
|
|
|
int correctAnswer = (int) Math.sqrt(perfectSquare);
|
|
|
|
|
List<Integer> options = generateWrongOptions(correctAnswer);
|
|
|
|
|
options.add(correctAnswer);
|
|
|
|
|
Collections.shuffle(options);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText,
|
|
|
|
|
String.valueOf(options.get(0)),
|
|
|
|
|
String.valueOf(options.get(1)),
|
|
|
|
|
String.valueOf(options.get(2)),
|
|
|
|
|
String.valueOf(options.get(3)),
|
|
|
|
|
String.valueOf(correctAnswer),
|
|
|
|
|
questionNumber);
|
|
|
|
|
}
|
|
|
|
|
return generatePureSquareOrRootQuestion(questionNumber);
|
|
|
|
|
} else {
|
|
|
|
|
// 生成包含平方/开方的复合运算表达式(确保包含平方或开方)
|
|
|
|
|
String[] expression = generateJuniorCompoundExpressionWithGuarantee(operatorCount);
|
|
|
|
|
String questionText = expression[0];
|
|
|
|
|
int correctAnswer = Integer.parseInt(expression[1]);
|
|
|
|
|
|
|
|
|
|
// 生成错误选项
|
|
|
|
|
List<Integer> options = generateWrongOptions(correctAnswer);
|
|
|
|
|
options.add(correctAnswer);
|
|
|
|
|
Collections.shuffle(options);
|
|
|
|
|
return generateJuniorCompoundQuestion(operatorCount, questionNumber);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new Question(questionText,
|
|
|
|
|
String.valueOf(options.get(0)),
|
|
|
|
|
String.valueOf(options.get(1)),
|
|
|
|
|
String.valueOf(options.get(2)),
|
|
|
|
|
String.valueOf(options.get(3)),
|
|
|
|
|
String.valueOf(correctAnswer),
|
|
|
|
|
questionNumber);
|
|
|
|
|
/**
|
|
|
|
|
* 生成纯平方或开方题目
|
|
|
|
|
*/
|
|
|
|
|
private Question generatePureSquareOrRootQuestion(int questionNumber) {
|
|
|
|
|
if (random.nextBoolean()) {
|
|
|
|
|
return generateSquareQuestion(questionNumber);
|
|
|
|
|
} else {
|
|
|
|
|
return generateRootQuestion(questionNumber);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成平方题目
|
|
|
|
|
*/
|
|
|
|
|
private Question generateSquareQuestion(int questionNumber) {
|
|
|
|
|
int a = MIN_OPERAND_VALUE + random.nextInt(MAX_OPERAND_VALUE);
|
|
|
|
|
String questionText = String.format("%d² = ?", a);
|
|
|
|
|
int correctAnswer = a * a;
|
|
|
|
|
List<Integer> options = generateWrongOptions(correctAnswer);
|
|
|
|
|
options.add(correctAnswer);
|
|
|
|
|
Collections.shuffle(options);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText,
|
|
|
|
|
String.valueOf(options.get(0)),
|
|
|
|
|
String.valueOf(options.get(1)),
|
|
|
|
|
String.valueOf(options.get(2)),
|
|
|
|
|
String.valueOf(options.get(3)),
|
|
|
|
|
String.valueOf(correctAnswer),
|
|
|
|
|
questionNumber);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成开方题目
|
|
|
|
|
*/
|
|
|
|
|
private Question generateRootQuestion(int questionNumber) {
|
|
|
|
|
int perfectSquare = (int) Math.pow(random.nextInt(10) + 1, 2);
|
|
|
|
|
String questionText = String.format("√%d = ?", perfectSquare);
|
|
|
|
|
int correctAnswer = (int) Math.sqrt(perfectSquare);
|
|
|
|
|
List<Integer> options = generateWrongOptions(correctAnswer);
|
|
|
|
|
options.add(correctAnswer);
|
|
|
|
|
Collections.shuffle(options);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText,
|
|
|
|
|
String.valueOf(options.get(0)),
|
|
|
|
|
String.valueOf(options.get(1)),
|
|
|
|
|
String.valueOf(options.get(2)),
|
|
|
|
|
String.valueOf(options.get(3)),
|
|
|
|
|
String.valueOf(correctAnswer),
|
|
|
|
|
questionNumber);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成初中复合运算题目
|
|
|
|
|
*/
|
|
|
|
|
private Question generateJuniorCompoundQuestion(int operatorCount, int questionNumber) {
|
|
|
|
|
// 生成包含平方/开方的复合运算表达式(确保包含平方或开方)
|
|
|
|
|
String[] expression = generateJuniorCompoundExpressionWithGuarantee(operatorCount);
|
|
|
|
|
String questionText = expression[0];
|
|
|
|
|
int correctAnswer = Integer.parseInt(expression[1]);
|
|
|
|
|
|
|
|
|
|
// 生成错误选项
|
|
|
|
|
List<Integer> options = generateWrongOptions(correctAnswer);
|
|
|
|
|
options.add(correctAnswer);
|
|
|
|
|
Collections.shuffle(options);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText,
|
|
|
|
|
String.valueOf(options.get(0)),
|
|
|
|
|
String.valueOf(options.get(1)),
|
|
|
|
|
String.valueOf(options.get(2)),
|
|
|
|
|
String.valueOf(options.get(3)),
|
|
|
|
|
String.valueOf(correctAnswer),
|
|
|
|
|
questionNumber);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成高中题目
|
|
|
|
|
*/
|
|
|
|
|
@ -149,50 +174,63 @@ public class ChoiceQuestionGenerator {
|
|
|
|
|
|
|
|
|
|
// 30%概率生成纯三角函数题目,70%概率生成包含三角函数的复合运算题目
|
|
|
|
|
if (random.nextDouble() < 0.3) {
|
|
|
|
|
// 生成纯三角函数题目
|
|
|
|
|
int[] commonAngles = {0, 30, 45, 60, 90, 120, 135, 150, 180, 210, 225, 270, 300, 315, 330};
|
|
|
|
|
int angle = commonAngles[random.nextInt(commonAngles.length)];
|
|
|
|
|
String[] functions = {"sin", "cos", "tan"};
|
|
|
|
|
String function = functions[random.nextInt(functions.length)];
|
|
|
|
|
|
|
|
|
|
String questionText = String.format("%s(%d°) = ?", function, angle);
|
|
|
|
|
double result = calculateTrigFunction(function, angle);
|
|
|
|
|
|
|
|
|
|
// 生成选项
|
|
|
|
|
List<String> options = generateTrigOptions(result);
|
|
|
|
|
// 使用格式化后的值作为正确答案,确保与选项一致
|
|
|
|
|
String correctAnswer = formatTrigValue(result);
|
|
|
|
|
|
|
|
|
|
// 随机打乱选项
|
|
|
|
|
Collections.shuffle(options);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText,
|
|
|
|
|
options.get(0),
|
|
|
|
|
options.get(1),
|
|
|
|
|
options.get(2),
|
|
|
|
|
options.get(3),
|
|
|
|
|
correctAnswer,
|
|
|
|
|
questionNumber);
|
|
|
|
|
return generatePureTrigQuestion(questionNumber);
|
|
|
|
|
} else {
|
|
|
|
|
// 生成包含三角函数的复合运算表达式(确保包含三角函数)
|
|
|
|
|
String[] expression = generateSeniorCompoundExpressionWithGuarantee(operatorCount);
|
|
|
|
|
String questionText = expression[0];
|
|
|
|
|
int correctAnswer = Integer.parseInt(expression[1]);
|
|
|
|
|
|
|
|
|
|
// 生成错误选项
|
|
|
|
|
List<Integer> options = generateWrongOptions(correctAnswer);
|
|
|
|
|
options.add(correctAnswer);
|
|
|
|
|
Collections.shuffle(options);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText,
|
|
|
|
|
String.valueOf(options.get(0)),
|
|
|
|
|
String.valueOf(options.get(1)),
|
|
|
|
|
String.valueOf(options.get(2)),
|
|
|
|
|
String.valueOf(options.get(3)),
|
|
|
|
|
String.valueOf(correctAnswer),
|
|
|
|
|
questionNumber);
|
|
|
|
|
return generateSeniorCompoundQuestion(operatorCount, questionNumber);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成纯三角函数题目
|
|
|
|
|
*/
|
|
|
|
|
private Question generatePureTrigQuestion(int questionNumber) {
|
|
|
|
|
int[] commonAngles = {0, 30, 45, 60, 90, 120, 135, 150, 180, 210, 225, 270, 300, 315, 330};
|
|
|
|
|
int angle = commonAngles[random.nextInt(commonAngles.length)];
|
|
|
|
|
String[] functions = {"sin", "cos", "tan"};
|
|
|
|
|
String function = functions[random.nextInt(functions.length)];
|
|
|
|
|
|
|
|
|
|
String questionText = String.format("%s(%d°) = ?", function, angle);
|
|
|
|
|
double result = calculateTrigFunction(function, angle);
|
|
|
|
|
|
|
|
|
|
// 生成选项
|
|
|
|
|
List<String> options = generateTrigOptions(result);
|
|
|
|
|
// 使用格式化后的值作为正确答案,确保与选项一致
|
|
|
|
|
String correctAnswer = formatTrigValue(result);
|
|
|
|
|
|
|
|
|
|
// 随机打乱选项
|
|
|
|
|
Collections.shuffle(options);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText,
|
|
|
|
|
options.get(0),
|
|
|
|
|
options.get(1),
|
|
|
|
|
options.get(2),
|
|
|
|
|
options.get(3),
|
|
|
|
|
correctAnswer,
|
|
|
|
|
questionNumber);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成高中复合运算题目
|
|
|
|
|
*/
|
|
|
|
|
private Question generateSeniorCompoundQuestion(int operatorCount, int questionNumber) {
|
|
|
|
|
// 生成包含三角函数的复合运算表达式(确保包含三角函数)
|
|
|
|
|
String[] expression = generateSeniorCompoundExpressionWithGuarantee(operatorCount);
|
|
|
|
|
String questionText = expression[0];
|
|
|
|
|
int correctAnswer = Integer.parseInt(expression[1]);
|
|
|
|
|
|
|
|
|
|
// 生成错误选项
|
|
|
|
|
List<Integer> options = generateWrongOptions(correctAnswer);
|
|
|
|
|
options.add(correctAnswer);
|
|
|
|
|
Collections.shuffle(options);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText,
|
|
|
|
|
String.valueOf(options.get(0)),
|
|
|
|
|
String.valueOf(options.get(1)),
|
|
|
|
|
String.valueOf(options.get(2)),
|
|
|
|
|
String.valueOf(options.get(3)),
|
|
|
|
|
String.valueOf(correctAnswer),
|
|
|
|
|
questionNumber);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成三角函数题目的选项
|
|
|
|
|
@ -296,69 +334,90 @@ private String generateNearbyValue(double correctAnswer, Set<String> usedOptions
|
|
|
|
|
* 计算三角函数
|
|
|
|
|
*/
|
|
|
|
|
private double calculateTrigFunction(String function, int angle) {
|
|
|
|
|
double radians = Math.toRadians(angle);
|
|
|
|
|
switch (function) {
|
|
|
|
|
case "sin":
|
|
|
|
|
// 对特定角度返回精确值
|
|
|
|
|
switch (angle) {
|
|
|
|
|
case 0: return 0;
|
|
|
|
|
case 30: return 0.5;
|
|
|
|
|
case 45: return Math.sqrt(2)/2;
|
|
|
|
|
case 60: return Math.sqrt(3)/2;
|
|
|
|
|
case 90: return 1;
|
|
|
|
|
case 120: return Math.sqrt(3)/2;
|
|
|
|
|
case 135: return Math.sqrt(2)/2;
|
|
|
|
|
case 150: return 0.5;
|
|
|
|
|
case 180: return 0;
|
|
|
|
|
case 210: return -0.5;
|
|
|
|
|
case 225: return -Math.sqrt(2)/2;
|
|
|
|
|
case 270: return -1;
|
|
|
|
|
case 300: return -Math.sqrt(3)/2;
|
|
|
|
|
case 315: return -Math.sqrt(2)/2;
|
|
|
|
|
case 330: return -0.5;
|
|
|
|
|
default: return Math.sin(radians);
|
|
|
|
|
}
|
|
|
|
|
return calculateSin(angle);
|
|
|
|
|
case "cos":
|
|
|
|
|
// 对特定角度返回精确值
|
|
|
|
|
switch (angle) {
|
|
|
|
|
case 0: return 1;
|
|
|
|
|
case 30: return Math.sqrt(3)/2;
|
|
|
|
|
case 45: return Math.sqrt(2)/2;
|
|
|
|
|
case 60: return 0.5;
|
|
|
|
|
case 90: return 0;
|
|
|
|
|
case 120: return -0.5;
|
|
|
|
|
case 135: return -Math.sqrt(2)/2;
|
|
|
|
|
case 150: return -Math.sqrt(3)/2;
|
|
|
|
|
case 180: return -1;
|
|
|
|
|
case 210: return -Math.sqrt(3)/2;
|
|
|
|
|
case 225: return -Math.sqrt(2)/2;
|
|
|
|
|
case 270: return 0;
|
|
|
|
|
case 300: return 0.5;
|
|
|
|
|
case 315: return Math.sqrt(2)/2;
|
|
|
|
|
case 330: return Math.sqrt(3)/2;
|
|
|
|
|
default: return Math.cos(radians);
|
|
|
|
|
}
|
|
|
|
|
return calculateCos(angle);
|
|
|
|
|
case "tan":
|
|
|
|
|
// 对特定角度返回精确值或未定义
|
|
|
|
|
switch (angle) {
|
|
|
|
|
case 0: return 0;
|
|
|
|
|
case 30: return Math.sqrt(3)/3;
|
|
|
|
|
case 45: return 1;
|
|
|
|
|
case 60: return Math.sqrt(3);
|
|
|
|
|
case 90: return Double.POSITIVE_INFINITY; // 未定义
|
|
|
|
|
case 120: return -Math.sqrt(3);
|
|
|
|
|
case 135: return -1;
|
|
|
|
|
case 150: return -Math.sqrt(3)/3;
|
|
|
|
|
case 180: return 0;
|
|
|
|
|
case 210: return Math.sqrt(3)/3;
|
|
|
|
|
case 225: return 1;
|
|
|
|
|
case 270: return Double.POSITIVE_INFINITY; // 未定义
|
|
|
|
|
case 300: return -Math.sqrt(3);
|
|
|
|
|
case 315: return -1;
|
|
|
|
|
case 330: return -Math.sqrt(3)/3;
|
|
|
|
|
default: return Math.tan(radians);
|
|
|
|
|
}
|
|
|
|
|
default: return 0;
|
|
|
|
|
return calculateTan(angle);
|
|
|
|
|
default:
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 计算正弦函数
|
|
|
|
|
*/
|
|
|
|
|
private double calculateSin(int angle) {
|
|
|
|
|
switch (angle) {
|
|
|
|
|
case 0: return 0;
|
|
|
|
|
case 30: return 0.5;
|
|
|
|
|
case 45: return Math.sqrt(2)/2;
|
|
|
|
|
case 60: return Math.sqrt(3)/2;
|
|
|
|
|
case 90: return 1;
|
|
|
|
|
case 120: return Math.sqrt(3)/2;
|
|
|
|
|
case 135: return Math.sqrt(2)/2;
|
|
|
|
|
case 150: return 0.5;
|
|
|
|
|
case 180: return 0;
|
|
|
|
|
case 210: return -0.5;
|
|
|
|
|
case 225: return -Math.sqrt(2)/2;
|
|
|
|
|
case 270: return -1;
|
|
|
|
|
case 300: return -Math.sqrt(3)/2;
|
|
|
|
|
case 315: return -Math.sqrt(2)/2;
|
|
|
|
|
case 330: return -0.5;
|
|
|
|
|
default:
|
|
|
|
|
return Math.sin(Math.toRadians(angle));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 计算余弦函数
|
|
|
|
|
*/
|
|
|
|
|
private double calculateCos(int angle) {
|
|
|
|
|
switch (angle) {
|
|
|
|
|
case 0: return 1;
|
|
|
|
|
case 30: return Math.sqrt(3)/2;
|
|
|
|
|
case 45: return Math.sqrt(2)/2;
|
|
|
|
|
case 60: return 0.5;
|
|
|
|
|
case 90: return 0;
|
|
|
|
|
case 120: return -0.5;
|
|
|
|
|
case 135: return -Math.sqrt(2)/2;
|
|
|
|
|
case 150: return -Math.sqrt(3)/2;
|
|
|
|
|
case 180: return -1;
|
|
|
|
|
case 210: return -Math.sqrt(3)/2;
|
|
|
|
|
case 225: return -Math.sqrt(2)/2;
|
|
|
|
|
case 270: return 0;
|
|
|
|
|
case 300: return 0.5;
|
|
|
|
|
case 315: return Math.sqrt(2)/2;
|
|
|
|
|
case 330: return Math.sqrt(3)/2;
|
|
|
|
|
default:
|
|
|
|
|
return Math.cos(Math.toRadians(angle));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 计算正切函数
|
|
|
|
|
*/
|
|
|
|
|
private double calculateTan(int angle) {
|
|
|
|
|
switch (angle) {
|
|
|
|
|
case 0: return 0;
|
|
|
|
|
case 30: return Math.sqrt(3)/3;
|
|
|
|
|
case 45: return 1;
|
|
|
|
|
case 60: return Math.sqrt(3);
|
|
|
|
|
case 90: return Double.POSITIVE_INFINITY; // 未定义
|
|
|
|
|
case 120: return -Math.sqrt(3);
|
|
|
|
|
case 135: return -1;
|
|
|
|
|
case 150: return -Math.sqrt(3)/3;
|
|
|
|
|
case 180: return 0;
|
|
|
|
|
case 210: return Math.sqrt(3)/3;
|
|
|
|
|
case 225: return 1;
|
|
|
|
|
case 270: return Double.POSITIVE_INFINITY; // 未定义
|
|
|
|
|
case 300: return -Math.sqrt(3);
|
|
|
|
|
case 315: return -1;
|
|
|
|
|
case 330: return -Math.sqrt(3)/3;
|
|
|
|
|
default:
|
|
|
|
|
return Math.tan(Math.toRadians(angle));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -796,11 +855,23 @@ private double calculateTrigFunction(String function, int angle) {
|
|
|
|
|
* 计算初中复合表达式(包含平方/开方)
|
|
|
|
|
*/
|
|
|
|
|
private int calculateJuniorCompoundExpression(List<Integer> operands, List<String> operators) {
|
|
|
|
|
// 先处理平方和开方运算
|
|
|
|
|
List<Integer> numbers = new ArrayList<>(operands);
|
|
|
|
|
List<String> ops = new ArrayList<>(operators);
|
|
|
|
|
|
|
|
|
|
// 第一轮:处理平方和开方运算
|
|
|
|
|
processSquareAndRootOperations(numbers, ops);
|
|
|
|
|
|
|
|
|
|
// 第二轮:处理乘除法
|
|
|
|
|
processMultiplicationAndDivision(numbers, ops);
|
|
|
|
|
|
|
|
|
|
// 第三轮:处理加减法
|
|
|
|
|
return processAdditionAndSubtraction(numbers, ops);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理平方和开方运算
|
|
|
|
|
*/
|
|
|
|
|
private void processSquareAndRootOperations(List<Integer> numbers, List<String> ops) {
|
|
|
|
|
for (int i = 0; i < ops.size(); i++) {
|
|
|
|
|
if (ops.get(i).equals("²")) {
|
|
|
|
|
int result = numbers.get(i) * numbers.get(i);
|
|
|
|
|
@ -813,8 +884,12 @@ private double calculateTrigFunction(String function, int angle) {
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 第二轮:处理乘除法
|
|
|
|
|
/**
|
|
|
|
|
* 处理乘除法运算
|
|
|
|
|
*/
|
|
|
|
|
private void processMultiplicationAndDivision(List<Integer> numbers, List<String> ops) {
|
|
|
|
|
for (int i = 0; i < ops.size(); i++) {
|
|
|
|
|
if (ops.get(i).equals("*")) {
|
|
|
|
|
int result = numbers.get(i) * numbers.get(i + 1);
|
|
|
|
|
@ -823,25 +898,35 @@ private double calculateTrigFunction(String function, int angle) {
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
} else if (ops.get(i).equals("/")) {
|
|
|
|
|
if (numbers.get(i + 1) != 0) {
|
|
|
|
|
int result = numbers.get(i) / numbers.get(i + 1);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
} else {
|
|
|
|
|
// 避免除零错误,重新生成
|
|
|
|
|
numbers.set(i + 1, 1 + random.nextInt(MAX_OPERAND_VALUE));
|
|
|
|
|
int result = numbers.get(i) / numbers.get(i + 1);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
}
|
|
|
|
|
handleDivision(numbers, ops, i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 第三轮:处理加减法
|
|
|
|
|
/**
|
|
|
|
|
* 处理除法运算
|
|
|
|
|
*/
|
|
|
|
|
private void handleDivision(List<Integer> numbers, List<String> ops, int i) {
|
|
|
|
|
if (numbers.get(i + 1) != 0) {
|
|
|
|
|
int result = numbers.get(i) / numbers.get(i + 1);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
} else {
|
|
|
|
|
// 避免除零错误,重新生成
|
|
|
|
|
numbers.set(i + 1, 1 + random.nextInt(MAX_OPERAND_VALUE));
|
|
|
|
|
int result = numbers.get(i) / numbers.get(i + 1);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理加减法运算
|
|
|
|
|
*/
|
|
|
|
|
private int processAdditionAndSubtraction(List<Integer> numbers, List<String> ops) {
|
|
|
|
|
int result = numbers.get(0);
|
|
|
|
|
for (int i = 0; i < ops.size(); i++) {
|
|
|
|
|
if (ops.get(i).equals("+")) {
|
|
|
|
|
@ -850,7 +935,6 @@ private double calculateTrigFunction(String function, int angle) {
|
|
|
|
|
result -= numbers.get(i + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -858,11 +942,25 @@ private double calculateTrigFunction(String function, int angle) {
|
|
|
|
|
* 计算高中复合表达式(包含三角函数)
|
|
|
|
|
*/
|
|
|
|
|
private int calculateSeniorCompoundExpression(List<Double> operands, List<String> operators) {
|
|
|
|
|
// 先处理三角函数运算
|
|
|
|
|
List<Double> numbers = new ArrayList<>(operands);
|
|
|
|
|
List<String> ops = new ArrayList<>(operators);
|
|
|
|
|
|
|
|
|
|
// 第一轮:处理三角函数运算
|
|
|
|
|
processTrigonometricOperations(numbers, ops);
|
|
|
|
|
|
|
|
|
|
// 第二轮:处理乘除法
|
|
|
|
|
processDoubleMultiplicationAndDivision(numbers, ops);
|
|
|
|
|
|
|
|
|
|
// 第三轮:处理加减法
|
|
|
|
|
double result = processDoubleAdditionAndSubtraction(numbers, ops);
|
|
|
|
|
|
|
|
|
|
return (int) Math.round(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理三角函数运算
|
|
|
|
|
*/
|
|
|
|
|
private void processTrigonometricOperations(List<Double> numbers, List<String> ops) {
|
|
|
|
|
for (int i = 0; i < ops.size(); i++) {
|
|
|
|
|
if (ops.get(i).equals("sin") || ops.get(i).equals("cos") || ops.get(i).equals("tan")) {
|
|
|
|
|
// 三角函数运算已经在生成时处理了
|
|
|
|
|
@ -870,8 +968,12 @@ private double calculateTrigFunction(String function, int angle) {
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 第二轮:处理乘除法
|
|
|
|
|
/**
|
|
|
|
|
* 处理双精度乘除法运算
|
|
|
|
|
*/
|
|
|
|
|
private void processDoubleMultiplicationAndDivision(List<Double> numbers, List<String> ops) {
|
|
|
|
|
for (int i = 0; i < ops.size(); i++) {
|
|
|
|
|
if (ops.get(i).equals("*")) {
|
|
|
|
|
double result = numbers.get(i) * numbers.get(i + 1);
|
|
|
|
|
@ -880,25 +982,35 @@ private double calculateTrigFunction(String function, int angle) {
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
} else if (ops.get(i).equals("/")) {
|
|
|
|
|
if (numbers.get(i + 1) != 0) {
|
|
|
|
|
double result = numbers.get(i) / numbers.get(i + 1);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
} else {
|
|
|
|
|
// 避免除零错误,重新生成
|
|
|
|
|
numbers.set(i + 1, 1.0 + random.nextInt(MAX_OPERAND_VALUE));
|
|
|
|
|
double result = numbers.get(i) / numbers.get(i + 1);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
}
|
|
|
|
|
handleDoubleDivision(numbers, ops, i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 第三轮:处理加减法
|
|
|
|
|
/**
|
|
|
|
|
* 处理双精度除法运算
|
|
|
|
|
*/
|
|
|
|
|
private void handleDoubleDivision(List<Double> numbers, List<String> ops, int i) {
|
|
|
|
|
if (numbers.get(i + 1) != 0) {
|
|
|
|
|
double result = numbers.get(i) / numbers.get(i + 1);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
} else {
|
|
|
|
|
// 避免除零错误,重新生成
|
|
|
|
|
numbers.set(i + 1, 1.0 + random.nextInt(MAX_OPERAND_VALUE));
|
|
|
|
|
double result = numbers.get(i) / numbers.get(i + 1);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理双精度加减法运算
|
|
|
|
|
*/
|
|
|
|
|
private double processDoubleAdditionAndSubtraction(List<Double> numbers, List<String> ops) {
|
|
|
|
|
double result = numbers.get(0);
|
|
|
|
|
for (int i = 0; i < ops.size(); i++) {
|
|
|
|
|
if (ops.get(i).equals("+")) {
|
|
|
|
|
@ -907,66 +1019,38 @@ private double calculateTrigFunction(String function, int angle) {
|
|
|
|
|
result -= numbers.get(i + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (int) Math.round(result);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 计算高级复合表达式(包含平方运算)
|
|
|
|
|
*/
|
|
|
|
|
private int calculateAdvancedCompoundExpression(List<Integer> operands, List<String> operators) {
|
|
|
|
|
// 先处理平方运算
|
|
|
|
|
List<Integer> numbers = new ArrayList<>(operands);
|
|
|
|
|
List<String> ops = new ArrayList<>(operators);
|
|
|
|
|
|
|
|
|
|
// 第一轮:处理平方运算
|
|
|
|
|
for (int i = 0; i < ops.size(); i++) {
|
|
|
|
|
if (ops.get(i).equals("²")) {
|
|
|
|
|
int result = numbers.get(i) * numbers.get(i);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
processSquareOperations(numbers, ops);
|
|
|
|
|
|
|
|
|
|
// 第二轮:处理乘除法
|
|
|
|
|
processMultiplicationAndDivision(numbers, ops);
|
|
|
|
|
|
|
|
|
|
// 第三轮:处理加减法
|
|
|
|
|
return processAdditionAndSubtraction(numbers, ops);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 处理平方运算
|
|
|
|
|
*/
|
|
|
|
|
private void processSquareOperations(List<Integer> numbers, List<String> ops) {
|
|
|
|
|
for (int i = 0; i < ops.size(); i++) {
|
|
|
|
|
if (ops.get(i).equals("*")) {
|
|
|
|
|
int result = numbers.get(i) * numbers.get(i + 1);
|
|
|
|
|
if (ops.get(i).equals("²")) {
|
|
|
|
|
int result = numbers.get(i) * numbers.get(i);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
} else if (ops.get(i).equals("/")) {
|
|
|
|
|
if (numbers.get(i + 1) != 0) {
|
|
|
|
|
int result = numbers.get(i) / numbers.get(i + 1);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
} else {
|
|
|
|
|
// 避免除零错误,重新生成
|
|
|
|
|
numbers.set(i + 1, 1 + random.nextInt(MAX_OPERAND_VALUE));
|
|
|
|
|
int result = numbers.get(i) / numbers.get(i + 1);
|
|
|
|
|
numbers.set(i, result);
|
|
|
|
|
numbers.remove(i + 1);
|
|
|
|
|
ops.remove(i);
|
|
|
|
|
i--; // 调整索引
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 第三轮:处理加减法
|
|
|
|
|
int result = numbers.get(0);
|
|
|
|
|
for (int i = 0; i < ops.size(); i++) {
|
|
|
|
|
if (ops.get(i).equals("+")) {
|
|
|
|
|
result += numbers.get(i + 1);
|
|
|
|
|
} else if (ops.get(i).equals("-")) {
|
|
|
|
|
result -= numbers.get(i + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|