私のプログラムでは、カスタマイズ可能な複雑さを持つ有効な中置式を生成する必要があります。問題は、ゼロ除算、浮動小数点の回答、および否定的な回答を防ぐ方法がわからないことです。
否定的な答えを防ぐために、私は汚いアプローチを取っています。つまり、式を生成し、それを評価し、それが負であることが判明した場合は、再度生成します。知っておくべきことがいくつかあります。
- inToPost()は、生成された中置式を評価のために後置に変換するメソッドです。
- ComplexityLevel <= DIVIDEは、式に括弧を入れないことを意味します。
- 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);
}