Генерация действительного инфиксного арифметического выражения случайным образом - PullRequest
0 голосов
/ 23 марта 2012

Для моей программы мне нужно генерировать правильные выражения инфикса с настраиваемой сложностью. Проблема в том, что я не могу найти способ предотвратить деление на ноль, ответы с плавающей запятой и отрицательные ответы.

Чтобы избежать отрицательных ответов, я использую грязный подход. То есть сгенерируйте выражение, оцените его, если оно окажется отрицательным, сгенерируйте снова. Вот некоторые вещи, которые вы должны знать:

  1. inToPost () - это метод, который преобразует сгенерированное выражение инфикса в постфикс для оценки.
  2. complexLevel <= DIVIDE подразумевает, что мы не должны ставить скобки в выражении. </li>
  3. 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);
    }

1 Ответ

0 голосов
/ 23 марта 2012

Похоже, вы уже справились со своими условиями (b) и (c).Так как ваши операнды никогда не равны 0, я бы предположил, что единственное возможное нарушение (а) - это если в добавленных скобках обернуто нулевое значение, а оператор перед этим является делением.Вы можете проверить для этого случая, если вы изменили свой inToPost(), чтобы принимать подвыражения:

if(braceOpen > 0 && infix.get(braceOpen) == Operator.DIVISION && 
        evaluate(inToPost(infix.subList(braceOpen, braceOpen + 3))) == 0) {
    // Put parentheses elsewhere, or cancel
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...