|
|
package mathlearning.service.QuestionGenerator;
|
|
|
|
|
|
import java.util.Random;
|
|
|
|
|
|
public abstract class QuestionGenerator{
|
|
|
protected Random random = new Random();
|
|
|
public abstract String generateQuestion() ;
|
|
|
protected String type;
|
|
|
|
|
|
public String getType() {
|
|
|
return type;
|
|
|
}
|
|
|
|
|
|
QuestionGenerator() {
|
|
|
type = "无";
|
|
|
}
|
|
|
|
|
|
QuestionGenerator(String Type) {
|
|
|
type = Type;
|
|
|
}
|
|
|
|
|
|
protected String preForOper(int[] operands) {
|
|
|
StringBuilder question = new StringBuilder();
|
|
|
String[] operators = {"+", "-", "×", "÷"};
|
|
|
question.append(operands[0]);
|
|
|
|
|
|
for (int i = 1; i < operands.length; i++) {
|
|
|
String op = operators[ random.nextInt (operators.length)];
|
|
|
question.append(" ").append(op).append(" ").append(operands[i]);
|
|
|
}
|
|
|
return question.toString();
|
|
|
|
|
|
}
|
|
|
|
|
|
protected boolean Check_num(String expression) {
|
|
|
if(!(expression.equals("+") || expression.equals("-") || expression.equals("×") || expression.equals("÷"))) {
|
|
|
return true;
|
|
|
}
|
|
|
else{
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
protected String addParen(String expression) {
|
|
|
String[] parts = expression.split(" ");
|
|
|
StringBuilder result = new StringBuilder();
|
|
|
boolean r_paren_needed = false;
|
|
|
|
|
|
for (int i = 0; i < parts.length; i++) {
|
|
|
if(Check_num ( parts [i]) ) {
|
|
|
if( !r_paren_needed ) {
|
|
|
if(i <= parts.length -3 )
|
|
|
{
|
|
|
if( random.nextBoolean() )
|
|
|
{ result.append("(");r_paren_needed = true;}
|
|
|
}
|
|
|
result.append(parts[i]);
|
|
|
} else {
|
|
|
result.append( parts [i]);
|
|
|
if( !random.nextBoolean()) {
|
|
|
result.append(")");r_paren_needed = false;
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
result.append( parts [i] );
|
|
|
}
|
|
|
if( i < parts.length -1 ) {
|
|
|
result.append(" ");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if( r_paren_needed ){
|
|
|
result.append(")");r_paren_needed = false;
|
|
|
}
|
|
|
return result.toString();
|
|
|
}
|
|
|
|
|
|
protected String add_squs(String expression) {
|
|
|
String[] parts = expression.split(" ");
|
|
|
StringBuilder result = new StringBuilder();
|
|
|
boolean has_squs = false;
|
|
|
|
|
|
for (int i = 0; i < parts.length; i++) {
|
|
|
if( Check_num( parts [i] )) {
|
|
|
double Thres = 0.3;
|
|
|
if( !has_squs){
|
|
|
Thres = 0.7;
|
|
|
}
|
|
|
if ( random.nextDouble() < Thres ||(i == parts.length -1 && !has_squs)) {
|
|
|
if ( random.nextBoolean() ) {
|
|
|
result.append(parts[i]);
|
|
|
result.append("²");
|
|
|
has_squs = true;
|
|
|
} else {
|
|
|
result.append("√");
|
|
|
result.append(parts[i]);
|
|
|
has_squs = true;
|
|
|
}
|
|
|
} else {
|
|
|
result.append(parts[i]);
|
|
|
}
|
|
|
} else {
|
|
|
result.append(parts[i]);
|
|
|
}
|
|
|
if( i < parts.length -1 ) {
|
|
|
result.append(" ");
|
|
|
}
|
|
|
}
|
|
|
return result.toString();
|
|
|
}
|
|
|
|
|
|
protected String add_sins(String expression) {
|
|
|
String[] parts = expression.split(" ");
|
|
|
StringBuilder result = new StringBuilder();
|
|
|
String[] functions = {"sin", "cos", "tan"};
|
|
|
boolean has_func = false;
|
|
|
|
|
|
for (int i = 0; i < parts.length; i++) {
|
|
|
double Thres = 0.4;
|
|
|
if(!has_func){Thres = 0.8;}
|
|
|
if(Check_num(parts[i]))
|
|
|
{
|
|
|
if ( random.nextDouble() < Thres ||(i == parts.length-1 && !has_func) ) {
|
|
|
String func = functions[random.nextInt(functions.length)];
|
|
|
result.append(func).append("(").append(parts[i]).append(")");
|
|
|
} else {
|
|
|
result.append(parts[i]);
|
|
|
}
|
|
|
} else {
|
|
|
result.append(parts[i]);
|
|
|
}
|
|
|
if( i < parts.length-1 ) {
|
|
|
result.append(" ");
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return result.toString();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|