0

ここで「100-50-40」をテストすると、何らかの理由で「10」ではなく「60」が表示されます。「10+20」や「40-20」など、他のすべての組み合わせが機能します。この問題は、複数の数値を続けて減算しようとすると発生します。何か案は?

public double add(String exp){
        String left = "";
        String right = "";
        double leftValue = 0;
        double rightValue = 0;
        double answer = 0;

    for(int i=0;i<exp.length();i++)
    {
        if(exp.charAt(i)=='+')
        {
            right = exp.substring(i+1, exp.length());
            leftValue = subtract(left);
            rightValue = add(right);
            answer = leftValue + rightValue;
            return answer;
        }   
        else
        {
            left = left + exp.substring(i,(i+1));

        }
    } // End for loop
    answer = subtract(exp);
    return answer;

} // End add method

//guaranteed there are no addition operators in exp 
public double subtract(String exp){
    String left = "";
    String right = "";
    double leftValue = 0;
    double rightValue = 0;
    double answer = 0;

    for(int i=0;i<exp.length();i++)
    {
        if(exp.charAt(i)=='-')
        {
            right = exp.substring(i+1, exp.length());
            leftValue = Double.parseDouble(left);
            rightValue = subtract(right);
            answer = leftValue - rightValue;
            return answer;
        }   
        else
        {
            left = left + exp.substring(i,(i+1));
        }
    } // End for loop
    answer = Double.parseDouble(exp);
    return answer;
}
4

1 に答える 1

6

100 から結果を引く前に 50-40 を評価するため、90 を得ています。

このコードでは、最初のマイナスで式を分割しています。

        right = exp.substring(i+1, exp.length());
        leftValue = Double.parseDouble(left);
        rightValue = subtract(right);
        answer = leftValue - rightValue;

rightValue は「50-40」で、leftValue は 100 です。

最後のマイナスを見つけることで、この特定のケースに対処できます。

そうは言っても、最終的に他の演算子やグループ化を使用してより複雑な式を処理したい場合は、手書きの再帰降下パーサーまたはパーサージェネレーターの使用について詳しく読むと役立つ場合があります。パーサー ジェネレーターを使用して、必要な文法を指定すると、ツールがそれを解析するコードを構築します。私自身のお気に入りの Java パーサー ジェネレーターはAntlrです。

于 2013-05-23T23:27:38.043 に答える