|
|
|
@ -7,12 +7,30 @@ import java.util.List;
|
|
|
|
|
import java.util.Random;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 初中题目生成器 题目必须包含至少一个平方或开根号运算符
|
|
|
|
|
* 初中题目生成器,负责生成包含平方或开根号运算的初中级别数学题目。
|
|
|
|
|
*
|
|
|
|
|
* <p>该生成器确保每道题目都包含至少一个高级运算符(平方或开根号),
|
|
|
|
|
* 题目结构包含基本的四则运算和高级运算的组合。
|
|
|
|
|
*
|
|
|
|
|
* @author 杨博文
|
|
|
|
|
* @version 1.0
|
|
|
|
|
* @since 2025
|
|
|
|
|
*/
|
|
|
|
|
public class JuniorHighGenerator implements QuestionGenerator {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 高级运算符数组,包含"平方"和"开根号"。
|
|
|
|
|
*/
|
|
|
|
|
private static final String[] ADVANCED_OPS = {"平方", "开根号"};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 基本运算符数组,包含四则运算符号。
|
|
|
|
|
*/
|
|
|
|
|
private static final String[] OPERATORS = {"+", "-", "*", "/"};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 随机数生成器,用于生成随机题目。
|
|
|
|
|
*/
|
|
|
|
|
private final Random random = new Random();
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@ -25,6 +43,14 @@ public class JuniorHighGenerator implements QuestionGenerator {
|
|
|
|
|
return questions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成单个初中级别的数学题目。
|
|
|
|
|
*
|
|
|
|
|
* <p>该方法确保生成的题目包含至少一个高级运算符(平方或开根号),
|
|
|
|
|
* 并根据操作数数量采用不同的生成策略。
|
|
|
|
|
*
|
|
|
|
|
* @return 生成的数学题目字符串
|
|
|
|
|
*/
|
|
|
|
|
private String generateSingleQuestion() {
|
|
|
|
|
List<String> parts = new ArrayList<>();
|
|
|
|
|
int operandCount = random.nextInt(5) + 1;
|
|
|
|
@ -46,9 +72,7 @@ public class JuniorHighGenerator implements QuestionGenerator {
|
|
|
|
|
// 随机数看取出来的是不是开根号运算符
|
|
|
|
|
if ("开根号".equals(ADVANCED_OPS[random.nextInt(ADVANCED_OPS.length)])) {
|
|
|
|
|
parts = generateRoot(parts, i);
|
|
|
|
|
}
|
|
|
|
|
// 如果不是开根号就是平方运算
|
|
|
|
|
else {
|
|
|
|
|
} else { // 如果不是开根号就是平方运算
|
|
|
|
|
parts = generateSquare(parts, i);
|
|
|
|
|
}
|
|
|
|
|
hasAdvancedOp = true;
|
|
|
|
@ -63,7 +87,15 @@ public class JuniorHighGenerator implements QuestionGenerator {
|
|
|
|
|
return String.join(" ", parts) + " =";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 产生基本操作
|
|
|
|
|
/**
|
|
|
|
|
* 生成基本的四则运算表达式部分。
|
|
|
|
|
*
|
|
|
|
|
* <p>该方法生成指定数量的操作数和运算符,构成基础的数学表达式。
|
|
|
|
|
*
|
|
|
|
|
* @param operandCount 操作数的数量
|
|
|
|
|
* @param parts 用于存储表达式各部分的列表
|
|
|
|
|
* @return 包含基本运算表达式的列表
|
|
|
|
|
*/
|
|
|
|
|
public List<String> generateBase(int operandCount, List<String> parts) {
|
|
|
|
|
for (int i = 0; i < operandCount; i++) {
|
|
|
|
|
int num = random.nextInt(100) + 1;
|
|
|
|
@ -75,7 +107,15 @@ public class JuniorHighGenerator implements QuestionGenerator {
|
|
|
|
|
return parts;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 强制加入一个高级运算符
|
|
|
|
|
/**
|
|
|
|
|
* 强制在表达式中添加一个高级运算符作为保底机制。
|
|
|
|
|
*
|
|
|
|
|
* <p>当随机生成过程中没有添加高级运算符时,使用此方法确保
|
|
|
|
|
* 每道题目都包含至少一个高级运算符。
|
|
|
|
|
*
|
|
|
|
|
* @param parts 包含表达式各部分的列表
|
|
|
|
|
* @return 添加了高级运算符的表达式列表
|
|
|
|
|
*/
|
|
|
|
|
public List<String> forceAddAdvancedOp(List<String> parts) {
|
|
|
|
|
String advancedOp = ADVANCED_OPS[random.nextInt(ADVANCED_OPS.length)];
|
|
|
|
|
if ("平方".equals(advancedOp)) {
|
|
|
|
@ -87,6 +127,16 @@ public class JuniorHighGenerator implements QuestionGenerator {
|
|
|
|
|
return parts;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 在指定位置生成开根号运算。
|
|
|
|
|
*
|
|
|
|
|
* <p>该方法在表达式指定位置添加开根号运算,可能只对单个操作数
|
|
|
|
|
* 进行开根号,或者对一段子表达式进行开根号。
|
|
|
|
|
*
|
|
|
|
|
* @param parts 包含表达式各部分的列表
|
|
|
|
|
* @param i 开根号运算的起始位置
|
|
|
|
|
* @return 添加了开根号运算的表达式列表
|
|
|
|
|
*/
|
|
|
|
|
public List<String> generateRoot(List<String> parts, int i) {
|
|
|
|
|
if (random.nextBoolean()) {
|
|
|
|
|
parts.set(i, "开根号(" + parts.get(i) + ")");
|
|
|
|
@ -108,6 +158,15 @@ public class JuniorHighGenerator implements QuestionGenerator {
|
|
|
|
|
return parts;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 在指定位置生成平方运算。
|
|
|
|
|
*
|
|
|
|
|
* <p>该方法在表达式指定位置添加平方运算,对一段子表达式进行平方运算。
|
|
|
|
|
*
|
|
|
|
|
* @param parts 包含表达式各部分的列表
|
|
|
|
|
* @param i 平方运算的起始位置
|
|
|
|
|
* @return 添加了平方运算的表达式列表
|
|
|
|
|
*/
|
|
|
|
|
public List<String> generateSquare(List<String> parts, int i) {
|
|
|
|
|
parts.set(i, "(" + parts.get(i));
|
|
|
|
|
// 为避免随机数上限出现0,此处要单独判断一下左括号正好括住倒数第二个操作数的情况
|
|
|
|
@ -124,4 +183,4 @@ public class JuniorHighGenerator implements QuestionGenerator {
|
|
|
|
|
}
|
|
|
|
|
return parts;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|