Для моей программы мне нужно генерировать правильные выражения инфикса с настраиваемой сложностью. Проблема в том, что я не могу найти способ предотвратить деление на ноль, ответы с плавающей запятой и отрицательные ответы.
Чтобы избежать отрицательных ответов, я использую грязный подход. То есть сгенерируйте выражение, оцените его, если оно окажется отрицательным, сгенерируйте снова. Вот некоторые вещи, которые вы должны знать:
- inToPost () - это метод, который преобразует сгенерированное выражение инфикса в постфикс для оценки.
- complexLevel <= DIVIDE подразумевает, что мы не должны ставить скобки в выражении. </li>
- complexLevel == ARITHMETIC_PARENTHESIS означает, что скобки включены.
Как я могу убедиться, что a) нет делений на ноль b) нет делений, приводящих к плавающей запятой (понял грязный способ сделать это) в) конечный результат не отрицательный
Вот код
public void generateRandom(int operandLimit, int operatorCount, int complexityLevel) {
Random rand = new Random();
infix.clear();
int i = 0;
infix.add( rand.nextInt(operandLimit) + 1 );
while(i < operatorCount) {
int operator;
if(complexityLevel <= DIVIDE)
operator = rand.nextInt(complexityLevel - 1)*1000 + 1000;
else
operator = rand.nextInt(complexityLevel - 3)*1000 + 1000;
int operand = rand.nextInt(operandLimit) + 1;
if( operator == Operator.DIVIDE ) {
int lastNum = infix.get(infix.size() - 1);
if( lastNum < operand) {
int temp = operand;
operand = lastNum;
lastNum = temp;
}
lastNum -= lastNum % operand;
infix.set(infix.size() - 1, lastNum);
}
infix.add( operator );
infix.add( operand );
++i;
}
if(complexityLevel == ARITMETIC_PARENTHESIS) {
int braceOpen = rand.nextInt( operatorCount ) * 2;
infix.add(braceOpen, Operator.BR_OPEN );
infix.add(braceOpen + 4, Operator.BR_CLOSE);
}
inToPost();
if(evaluate() < 0)
generateRandom(operandLimit, operatorCount, complexityLevel);
}