0

私のプログラムでは、カスタマイズ可能な複雑さを持つ有効な中置式を生成する必要があります。問題は、ゼロ除算、浮動小数点の回答、および否定的な回答を防ぐ方法がわからないことです。

否定的な答えを防ぐために、私は汚いアプローチを取っています。つまり、式を生成し、それを評価し、それが負であることが判明した場合は、再度生成します。知っておくべきことがいくつかあります。

  1. inToPost()は、生成された中置式を評価のために後置に変換するメソッドです。
  2. ComplexityLevel <= DIVIDEは、式に括弧を入れないことを意味します。
  3. ComplexityLevel == ARITHMETIC_PARENTHESISは、括弧が含まれていることを意味します。

a )ゼロによる除算がないことを確認するにはどうすればよいですかb)除算が浮動小数点になることはありません(これを行うための汚い方法を考え出しました)c)最終結果が負ではないコードは次のとおりです

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);
    }
4

1 に答える 1

0

すでに条件(b)と(c)に対処しているようです。オペランドが0になることはないので、(a)に違反する可能性があるのは、追加された括弧がたまたまゼロ値をラップし、その前の演算子が除算である場合だけだと思います。inToPost()部分式を取るようにを変更した場合は、そのケースを確認できます。

if(braceOpen > 0 && infix.get(braceOpen) == Operator.DIVISION && 
        evaluate(inToPost(infix.subList(braceOpen, braceOpen + 3))) == 0) {
    // Put parentheses elsewhere, or cancel
}
于 2012-03-23T17:34:27.420 に答える