|
|
|
|
@ -1,486 +1,7 @@
|
|
|
|
|
package com.mathlearning.model;
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Random;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
|
|
|
|
|
public class QuestionGenerator {
|
|
|
|
|
private Random random = new Random();
|
|
|
|
|
|
|
|
|
|
public List<Question> generateQuestions(String level, int count) {
|
|
|
|
|
List<Question> questions = new ArrayList<>();
|
|
|
|
|
Set<String> questionTexts = new HashSet<>();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
|
|
|
Question question;
|
|
|
|
|
int attempt = 0;
|
|
|
|
|
do {
|
|
|
|
|
question = generateQuestion(level, i);
|
|
|
|
|
attempt++;
|
|
|
|
|
} while (questionTexts.contains(question.getQuestionText()) && attempt < 10);
|
|
|
|
|
|
|
|
|
|
if (question != null) {
|
|
|
|
|
questionTexts.add(question.getQuestionText());
|
|
|
|
|
questions.add(question);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return questions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Question generateQuestion(String level, int index) {
|
|
|
|
|
switch (level) {
|
|
|
|
|
case "小学":
|
|
|
|
|
return generatePrimaryQuestion(index);
|
|
|
|
|
case "初中":
|
|
|
|
|
return generateMiddleSchoolQuestion(index);
|
|
|
|
|
case "高中":
|
|
|
|
|
return generateHighSchoolQuestion(index);
|
|
|
|
|
default:
|
|
|
|
|
return generatePrimaryQuestion(index);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Question generatePrimaryQuestion(int index) {
|
|
|
|
|
int operandCount = random.nextInt(4) + 2;
|
|
|
|
|
List<Integer> operands = new ArrayList<>();
|
|
|
|
|
List<Character> operators = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
// 生成操作数和运算符,确保结果非负
|
|
|
|
|
generateSafePrimaryExpression(operands, operators, operandCount);
|
|
|
|
|
|
|
|
|
|
String questionText;
|
|
|
|
|
int result;
|
|
|
|
|
int attempts = 0;
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
boolean useParentheses = random.nextBoolean() && operandCount >= 3;
|
|
|
|
|
if (useParentheses) {
|
|
|
|
|
int parenPos = random.nextInt(operandCount - 1);
|
|
|
|
|
questionText = buildParenthesesExpression(operands, operators, parenPos);
|
|
|
|
|
result = evaluateWithParentheses(operands, operators, parenPos);
|
|
|
|
|
} else {
|
|
|
|
|
questionText = buildSimpleExpression(operands, operators);
|
|
|
|
|
result = evaluateSequential(operands, operators);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
attempts++;
|
|
|
|
|
if (result < 0) {
|
|
|
|
|
// 重新生成安全的表达式
|
|
|
|
|
generateSafePrimaryExpression(operands, operators, operandCount);
|
|
|
|
|
}
|
|
|
|
|
} while (result < 0 && attempts < 10);
|
|
|
|
|
|
|
|
|
|
// 如果还是负数,强制使用加法
|
|
|
|
|
if (result < 0) {
|
|
|
|
|
for (int i = 0; i < operators.size(); i++) {
|
|
|
|
|
operators.set(i, '+');
|
|
|
|
|
}
|
|
|
|
|
questionText = buildSimpleExpression(operands, operators);
|
|
|
|
|
result = evaluateSequential(operands, operators);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return generateIntOptions(questionText + " = ?", result, "小学");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void generateSafePrimaryExpression(List<Integer> operands, List<Character> operators, int operandCount) {
|
|
|
|
|
operands.clear();
|
|
|
|
|
operators.clear();
|
|
|
|
|
|
|
|
|
|
// 首先生成所有操作数
|
|
|
|
|
for (int i = 0; i < operandCount; i++) {
|
|
|
|
|
operands.add(random.nextInt(100) + 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 然后生成安全的运算符序列
|
|
|
|
|
int currentValue = operands.get(0);
|
|
|
|
|
for (int i = 1; i < operandCount; i++) {
|
|
|
|
|
char op;
|
|
|
|
|
if (currentValue < operands.get(i)) {
|
|
|
|
|
// 如果当前值小于下一个操作数,避免减法导致负数
|
|
|
|
|
if (random.nextBoolean()) {
|
|
|
|
|
op = '+';
|
|
|
|
|
currentValue += operands.get(i);
|
|
|
|
|
} else {
|
|
|
|
|
op = (random.nextBoolean() && currentValue > 0) ? '*' : '+';
|
|
|
|
|
if (op == '*') currentValue *= operands.get(i);
|
|
|
|
|
else currentValue += operands.get(i);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 可以安全使用减法
|
|
|
|
|
op = getRandomOperation("+-*/");
|
|
|
|
|
switch (op) {
|
|
|
|
|
case '+': currentValue += operands.get(i); break;
|
|
|
|
|
case '-': currentValue -= operands.get(i); break;
|
|
|
|
|
case '*': currentValue *= operands.get(i); break;
|
|
|
|
|
case '/':
|
|
|
|
|
if (operands.get(i) != 0) currentValue /= operands.get(i);
|
|
|
|
|
else currentValue += operands.get(i);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
operators.add(op);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Question generateMiddleSchoolQuestion(int index) {
|
|
|
|
|
int type = random.nextInt(4);
|
|
|
|
|
MathExpression expression = new MathExpression();
|
|
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
|
case 0:
|
|
|
|
|
expression = createSquareExpression();
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
expression = createSqrtExpression();
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
expression = createSquareProductExpression();
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
expression = createSquareDivisionExpression();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 确保初中题目结果非负
|
|
|
|
|
if (expression.result < 0) {
|
|
|
|
|
expression = createSquareExpression(); // 重新生成一个肯定为正的题目
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return generateIntOptions(expression.questionText + " = ?", expression.result, "初中");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MathExpression createSquareExpression() {
|
|
|
|
|
int a = random.nextInt(10) + 1;
|
|
|
|
|
int b = random.nextInt(100) + 1;
|
|
|
|
|
int c = random.nextInt(100) + 1;
|
|
|
|
|
// 只使用加法确保结果为正
|
|
|
|
|
char op = '+';
|
|
|
|
|
|
|
|
|
|
String questionText = a + "² " + op + " " + b + " × " + c;
|
|
|
|
|
int result = a * a + b * c;
|
|
|
|
|
|
|
|
|
|
return new MathExpression(questionText, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MathExpression createSqrtExpression() {
|
|
|
|
|
int sqrtBase = findPerfectSquare(100);
|
|
|
|
|
int sqrtVal = (int) Math.sqrt(sqrtBase);
|
|
|
|
|
int d = random.nextInt(100) + 1;
|
|
|
|
|
// 只使用加法确保结果为正
|
|
|
|
|
char op = '+';
|
|
|
|
|
|
|
|
|
|
String questionText = "√" + sqrtBase + " " + op + " " + d;
|
|
|
|
|
int result = sqrtVal + d;
|
|
|
|
|
|
|
|
|
|
return new MathExpression(questionText, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MathExpression createSquareProductExpression() {
|
|
|
|
|
int e = random.nextInt(100) + 1;
|
|
|
|
|
int f = random.nextInt(10) + 1;
|
|
|
|
|
int g = random.nextInt(100) + 1;
|
|
|
|
|
// 只使用加法确保结果为正
|
|
|
|
|
char op = '+';
|
|
|
|
|
|
|
|
|
|
String questionText = e + " × " + f + "² " + op + " " + g;
|
|
|
|
|
int result = e * f * f + g;
|
|
|
|
|
|
|
|
|
|
return new MathExpression(questionText, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MathExpression createSquareDivisionExpression() {
|
|
|
|
|
int h = random.nextInt(50) + 1;
|
|
|
|
|
int i = random.nextInt(50) + 1;
|
|
|
|
|
int sum = h + i;
|
|
|
|
|
int square = sum * sum;
|
|
|
|
|
int j = findDivisor(square);
|
|
|
|
|
|
|
|
|
|
String questionText = "(" + h + " + " + i + ")² ÷ " + j;
|
|
|
|
|
int result = square / j;
|
|
|
|
|
|
|
|
|
|
return new MathExpression(questionText, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Question generateHighSchoolQuestion(int index) {
|
|
|
|
|
int type = random.nextInt(4);
|
|
|
|
|
TrigExpression expression = new TrigExpression();
|
|
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
|
case 0:
|
|
|
|
|
expression = createSinExpression();
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
expression = createCosExpression();
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
expression = createTanExpression();
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
expression = createSinCosExpression();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return generateDoubleOptions(expression.questionText + " = ?", expression.result, "高中");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private TrigExpression createSinExpression() {
|
|
|
|
|
String[] angles = {"0°", "30°", "45°", "60°", "90°"};
|
|
|
|
|
double[] sinValues = {0, 0.5, 0.71, 0.87, 1.0};
|
|
|
|
|
|
|
|
|
|
int idx = random.nextInt(angles.length);
|
|
|
|
|
int b = random.nextInt(100) + 1;
|
|
|
|
|
// 只使用加法确保结果为正
|
|
|
|
|
char op = '+';
|
|
|
|
|
|
|
|
|
|
String questionText = "sin(" + angles[idx] + ") " + op + " " + b;
|
|
|
|
|
double result = sinValues[idx] + b;
|
|
|
|
|
|
|
|
|
|
return new TrigExpression(questionText, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private TrigExpression createCosExpression() {
|
|
|
|
|
String[] angles = {"0°", "30°", "45°", "60°"};
|
|
|
|
|
double[] cosValues = {1.0, 0.87, 0.71, 0.5};
|
|
|
|
|
|
|
|
|
|
int idx = random.nextInt(angles.length);
|
|
|
|
|
int a = random.nextInt(100) + 1;
|
|
|
|
|
|
|
|
|
|
String questionText = a + " × cos(" + angles[idx] + ")";
|
|
|
|
|
double result = a * cosValues[idx];
|
|
|
|
|
|
|
|
|
|
return new TrigExpression(questionText, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private TrigExpression createTanExpression() {
|
|
|
|
|
String[] angles = {"0°", "30°", "45°", "60°"};
|
|
|
|
|
double[] tanValues = {0, 0.58, 1.0, 1.73};
|
|
|
|
|
|
|
|
|
|
int idx = random.nextInt(angles.length);
|
|
|
|
|
int c = random.nextInt(20) + 1;
|
|
|
|
|
|
|
|
|
|
String questionText = "tan(" + angles[idx] + ") ÷ " + c;
|
|
|
|
|
double result = tanValues[idx] / c;
|
|
|
|
|
|
|
|
|
|
return new TrigExpression(questionText, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private TrigExpression createSinCosExpression() {
|
|
|
|
|
String[] angles = {"0°", "30°", "45°", "60°"};
|
|
|
|
|
double[] sinValues = {0, 0.5, 0.71, 0.87};
|
|
|
|
|
double[] cosValues = {1.0, 0.87, 0.71, 0.5};
|
|
|
|
|
|
|
|
|
|
int idx1 = random.nextInt(angles.length);
|
|
|
|
|
int idx2 = random.nextInt(angles.length);
|
|
|
|
|
int d = random.nextInt(100) + 1;
|
|
|
|
|
// 只使用加法确保结果为正
|
|
|
|
|
char op = '+';
|
|
|
|
|
|
|
|
|
|
String questionText = "sin(" + angles[idx1] + ") × cos(" + angles[idx2] + ") " + op + " " + d;
|
|
|
|
|
double product = sinValues[idx1] * cosValues[idx2];
|
|
|
|
|
double result = product + d;
|
|
|
|
|
|
|
|
|
|
return new TrigExpression(questionText, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private char getRandomOperation(String operations) {
|
|
|
|
|
return operations.charAt(random.nextInt(operations.length()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String buildSimpleExpression(List<Integer> operands, List<Character> operators) {
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
|
for (int i = 0; i < operands.size(); i++) {
|
|
|
|
|
sb.append(operands.get(i));
|
|
|
|
|
if (i < operands.size() - 1) {
|
|
|
|
|
sb.append(" ").append(operators.get(i)).append(" ");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return sb.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String buildParenthesesExpression(List<Integer> operands, List<Character> operators, int parenPos) {
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
|
for (int i = 0; i < operands.size(); i++) {
|
|
|
|
|
if (i == parenPos) sb.append("(");
|
|
|
|
|
sb.append(operands.get(i));
|
|
|
|
|
if (i == parenPos + 1) sb.append(")");
|
|
|
|
|
if (i < operands.size() - 1) {
|
|
|
|
|
sb.append(" ").append(operators.get(i)).append(" ");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return sb.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int evaluateSequential(List<Integer> operands, List<Character> operators) {
|
|
|
|
|
int result = operands.get(0);
|
|
|
|
|
for (int i = 0; i < operators.size(); i++) {
|
|
|
|
|
result = calculate(result, operands.get(i + 1), operators.get(i));
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int evaluateWithParentheses(List<Integer> operands, List<Character> operators, int parenPos) {
|
|
|
|
|
int parenResult = calculate(operands.get(parenPos), operands.get(parenPos + 1), operators.get(parenPos));
|
|
|
|
|
List<Integer> newOperands = new ArrayList<>();
|
|
|
|
|
List<Character> newOperators = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < operands.size(); i++) {
|
|
|
|
|
if (i == parenPos) {
|
|
|
|
|
newOperands.add(parenResult);
|
|
|
|
|
} else if (i != parenPos + 1) {
|
|
|
|
|
newOperands.add(operands.get(i));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < operators.size(); i++) {
|
|
|
|
|
if (i != parenPos) {
|
|
|
|
|
newOperators.add(operators.get(i));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return evaluateSequential(newOperands, newOperators);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int calculate(int a, int b, char op) {
|
|
|
|
|
switch (op) {
|
|
|
|
|
case '+': return a + b;
|
|
|
|
|
case '-': return Math.max(a - b, 0);
|
|
|
|
|
case '*': return a * b;
|
|
|
|
|
case '/': return (b == 0) ? a : a / b;
|
|
|
|
|
default: return a + b;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int findPerfectSquare(int max) {
|
|
|
|
|
List<Integer> squares = new ArrayList<>();
|
|
|
|
|
for (int i = 1; i * i <= max; i++) {
|
|
|
|
|
squares.add(i * i);
|
|
|
|
|
}
|
|
|
|
|
return squares.get(random.nextInt(squares.size()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int findDivisor(int number) {
|
|
|
|
|
List<Integer> divisors = new ArrayList<>();
|
|
|
|
|
for (int i = 2; i <= Math.min(20, number); i++) {
|
|
|
|
|
if (number % i == 0) {
|
|
|
|
|
divisors.add(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return divisors.isEmpty() ? 1 : divisors.get(random.nextInt(divisors.size()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Question generateIntOptions(String questionText, int answer, String level) {
|
|
|
|
|
String[] options = new String[4];
|
|
|
|
|
Set<Integer> usedValues = new HashSet<>();
|
|
|
|
|
|
|
|
|
|
String correctAnswer = String.valueOf(answer);
|
|
|
|
|
options[0] = correctAnswer;
|
|
|
|
|
usedValues.add(answer);
|
|
|
|
|
|
|
|
|
|
for (int i = 1; i < 4; i++) {
|
|
|
|
|
int wrongAnswer;
|
|
|
|
|
int attempts = 0;
|
|
|
|
|
do {
|
|
|
|
|
int range = Math.max(3, Math.abs(answer) / 5 + 1);
|
|
|
|
|
int offset = random.nextInt(range * 2 + 1) - range;
|
|
|
|
|
wrongAnswer = answer + offset;
|
|
|
|
|
wrongAnswer = Math.max(wrongAnswer, 0); // 确保错误答案也不为负
|
|
|
|
|
attempts++;
|
|
|
|
|
if (attempts > 20) {
|
|
|
|
|
wrongAnswer = answer + (i + 1) * 10 + 5;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} while (wrongAnswer == answer || usedValues.contains(wrongAnswer));
|
|
|
|
|
|
|
|
|
|
options[i] = String.valueOf(wrongAnswer);
|
|
|
|
|
usedValues.add(wrongAnswer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
shuffleArray(options);
|
|
|
|
|
int correctIndex = findCorrectIndex(options, correctAnswer);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText, options, correctIndex, level);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Question generateDoubleOptions(String questionText, double answer, String level) {
|
|
|
|
|
String[] options = new String[4];
|
|
|
|
|
Set<String> usedValues = new HashSet<>();
|
|
|
|
|
|
|
|
|
|
String correctAnswer = formatDouble(answer);
|
|
|
|
|
options[0] = correctAnswer;
|
|
|
|
|
usedValues.add(correctAnswer);
|
|
|
|
|
|
|
|
|
|
for (int i = 1; i < 4; i++) {
|
|
|
|
|
String wrongAnswer;
|
|
|
|
|
int attempts = 0;
|
|
|
|
|
do {
|
|
|
|
|
double offset = (random.nextDouble() - 0.5) * Math.max(1, Math.abs(answer) * 0.3);
|
|
|
|
|
double wrongValue = answer + offset;
|
|
|
|
|
wrongAnswer = formatDouble(Math.max(wrongValue, 0)); // 确保错误答案不为负
|
|
|
|
|
attempts++;
|
|
|
|
|
if (attempts > 20) {
|
|
|
|
|
wrongAnswer = formatDouble(answer + (i + 1) * 2.5);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} while (usedValues.contains(wrongAnswer) || wrongAnswer.equals(correctAnswer));
|
|
|
|
|
|
|
|
|
|
options[i] = wrongAnswer;
|
|
|
|
|
usedValues.add(wrongAnswer);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
shuffleArray(options);
|
|
|
|
|
int correctIndex = findCorrectIndex(options, correctAnswer);
|
|
|
|
|
|
|
|
|
|
return new Question(questionText, options, correctIndex, level);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String formatDouble(double value) {
|
|
|
|
|
if (Double.isInfinite(value)) return "∞";
|
|
|
|
|
if (Double.isNaN(value)) return "无解";
|
|
|
|
|
if (Math.abs(value) < 0.001) return "0";
|
|
|
|
|
return String.format("%.2f", value).replaceAll("0*$", "").replaceAll("\\.$", "");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int findCorrectIndex(String[] options, String correctAnswer) {
|
|
|
|
|
for (int i = 0; i < options.length; i++) {
|
|
|
|
|
if (options[i].equals(correctAnswer)) return i;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void shuffleArray(String[] array) {
|
|
|
|
|
for (int i = array.length - 1; i > 0; i--) {
|
|
|
|
|
int index = random.nextInt(i + 1);
|
|
|
|
|
String temp = array[index];
|
|
|
|
|
array[index] = array[i];
|
|
|
|
|
array[i] = temp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 辅助类来存储题目和答案
|
|
|
|
|
private static class MathExpression {
|
|
|
|
|
String questionText;
|
|
|
|
|
int result;
|
|
|
|
|
|
|
|
|
|
MathExpression() {}
|
|
|
|
|
|
|
|
|
|
MathExpression(String questionText, int result) {
|
|
|
|
|
this.questionText = questionText;
|
|
|
|
|
this.result = result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static class TrigExpression {
|
|
|
|
|
String questionText;
|
|
|
|
|
double result;
|
|
|
|
|
|
|
|
|
|
TrigExpression() {}
|
|
|
|
|
|
|
|
|
|
TrigExpression(String questionText, double result) {
|
|
|
|
|
this.questionText = questionText;
|
|
|
|
|
this.result = result;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
public interface QuestionGenerator {
|
|
|
|
|
List<Question> generateQuestions(String level, int count);
|
|
|
|
|
}
|