test5小学、初中、高中题型解耦及功能无误

pull/1/head
杨博文 5 months ago
parent c7c549d11f
commit 97a2c3db3e

@ -1,13 +1,16 @@
package mathpuzzle.service;
import java.util.*;
import static mathpuzzle.service.PrimarySchoolGenerator.isNumeric;
/**
*
* sin, cos, tan
*/
public class SeniorHighGenerator implements QuestionGenerator {
private static final String[] TRIG_FUNCS = {"sin", "cos", "tan"};
private Random random = new Random();
private static final String[] OPERATORS = {"+", "-", "*", "/"};
private final Random random = new Random();
@Override
public List<String> generateQuestions(int count) {
@ -20,20 +23,62 @@ public class SeniorHighGenerator implements QuestionGenerator {
}
private String generateSingleQuestion() {
StringBuilder sb = new StringBuilder();
String trigFunc = TRIG_FUNCS[random.nextInt(TRIG_FUNCS.length)];
int angle = random.nextInt(360); // 角度0-359度
sb.append(trigFunc).append("(").append(angle).append("°)");
// 可能再附加一个基础运算
if (random.nextBoolean()) {
String[] basicOps = {"+", "-", "*", "/"};
String op = basicOps[random.nextInt(basicOps.length)];
int anotherNum = random.nextInt(100) + 1;
sb.append(" ").append(op).append(" ").append(anotherNum);
List<String> parts = new ArrayList<>();
int operandCount = random.nextInt(5) + 1;
parts = generateBase(operandCount, parts);
String advancedOp;
// hasAdvancedOp用以检测下面的循环是否加入了高级运算符如果没有就启动保底
if(operandCount == 1) {
advancedOp = TRIG_FUNCS[random.nextInt(TRIG_FUNCS.length)];
parts.set(0, advancedOp + parts.get(0));
} else {
// 遍历查找左括号的合理位置
for(int i = 0; i < parts.size(); i++) {
// 最后一次循环保底生成高中三角函数
if (i == parts.size()-1) {
advancedOp = TRIG_FUNCS[random.nextInt(TRIG_FUNCS.length)];
parts.set(i, advancedOp + parts.get(i));
} else if (isNumeric(parts.get(i)) && random.nextBoolean()) { // 随机数看是否为操作数且随即进入生成程序
// 进入随机生成tan\sin\cos的程序
parts = generateTrig(parts, i);
break;
}
}
}
return String.join(" ", parts) + " =";
}
// 产生基本操作
public List<String> generateBase(int operandCount, List<String> parts) {
for (int i = 0; i < operandCount; i++) {
int num = random.nextInt(100) + 1;
parts.add(String.valueOf(num));
if (i < operandCount - 1) {
parts.add(OPERATORS[random.nextInt(OPERATORS.length)]);
}
}
return parts;
}
return sb.toString() + " =";
// 产生三角函数运算符
public List<String> generateTrig(List<String> parts, int i) {
String trigOp = TRIG_FUNCS[random.nextInt(TRIG_FUNCS.length)];
if(random.nextBoolean()) {
parts.set(i, trigOp + parts.get(i));
} else {
parts.set(i, trigOp + "(" + parts.get(i));
// 为避免随机数上限出现0此处要单独判断一下左括号正好括住倒数第二个操作数的情况
if (i == parts.size() - 3) {
parts.set(parts.size() - 1, parts.get(parts.size() - 1) + ")");
} else {
while(true) {
int i2 = random.nextInt(parts.size() - 3 - i) + 2;
if(isNumeric(parts.get(i + i2))) {
parts.set(i + i2, parts.get(i + i2) + ")");
break;
}
}
}
}
return parts;
}
}

Loading…
Cancel
Save