2012-03-23 11 views
0

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

否定的な回答を防ぐために、私は汚いアプローチを採用しています。 )

  1. inToPost(はPostfixに生成さ中置式を変換する方法である:それはagain.Hereはあなたが知っておくべきいくつかのものです生成する、それが負であることが判明した場合、それを評価し、式を生成、あります評価。
  2. complexityLevel < = DIVIDEは、式にカッコを入れることを想定していないことを意味します。
  3. complexityLevel == ARITHMETIC_PARENTHESISは、括弧が含まれることを意味します。

どのように私はa)は、ゼロBによる一切の部門ががないことを確認することができます)無部門は浮動小数点(これを行うには汚い方法を考え出し)c)に最終的な結果ではありません結果ここでは、負の は、すでにあなたの条件(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); 
    } 

答えて

0

です。あなたのオペランドは決して0ではないので、(a)の唯一の違反は、追加されたかっこが0の値をラップする場合に発生し、その前の演算子は除算であると推測します。あなたが部分式を取るために、あなたのinToPost()を変更した場合は、そのような場合のためにチェックすることができ:

if(braceOpen > 0 && infix.get(braceOpen) == Operator.DIVISION && 
     evaluate(inToPost(infix.subList(braceOpen, braceOpen + 3))) == 0) { 
    // Put parentheses elsewhere, or cancel 
} 
+0

私はから内部の演算子を変更することができます - そのために+に。ありがとう:) – wirate

+0

for C)私は本当に私が正しい方法でやっていると感じていない。 +答えが出るまで何度も何度も式を生成する – wirate

+0

私はこのような複雑な制約がある状況に遭遇したとき、多くのオプションを生成し、制約を満たすものを除外すると、制約内で生成する。 –

関連する問題