You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MyMathQuiz_UI/src/question/PrimaryQuestionGenerator.java

65 lines
2.3 KiB

package question;
import java.util.Random;
public class PrimaryQuestionGenerator implements QuestionGenerator {
private static final Random random = new Random();
@Override
public Question generateQuestion() {
int numOperands = random.nextInt(5) + 1;
StringBuilder sb = new StringBuilder();
int currentValue = random.nextInt(100) + 1;
sb.append(currentValue);
for (int i = 1; i < numOperands; i++) {
String[] ops = {"+", "-", "*", "/"};
String op;
int nextVal;
do {
op = ops[random.nextInt(ops.length)];
nextVal = random.nextInt(100) + 1;
} while ((op.equals("-") && currentValue < nextVal) ||
(op.equals("/") && (nextVal == 0 || currentValue % nextVal != 0)));
sb.append(" ").append(op).append(" ").append(nextVal);
switch (op) {
case "+": currentValue += nextVal; break;
case "-": currentValue -= nextVal; break;
case "*": currentValue *= nextVal; break;
case "/": currentValue /= nextVal; break;
}
}
String expr = addParentheses(sb.toString());
return new Question(expr, evaluate(expr));
}
private String addParentheses(String expr) {
String[] tokens = expr.split(" ");
if (tokens.length < 3) return expr;
int start = random.nextInt(tokens.length / 2) * 2;
int end = start + 2 + random.nextInt((tokens.length - start) / 2) * 2;
end = Math.min(end, tokens.length - 1);
StringBuilder newExpr = new StringBuilder();
for (int i = 0; i < tokens.length; i++) {
if (i == start) newExpr.append("(");
newExpr.append(tokens[i]);
if (i == end) newExpr.append(")");
if (i != tokens.length - 1) newExpr.append(" ");
}
return newExpr.toString();
}
private String evaluate(String expr) {
try {
javax.script.ScriptEngineManager mgr = new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine = mgr.getEngineByName("JavaScript");
return String.valueOf(engine.eval(expr));
} catch (Exception e) {
return "?";
}
}
}