2

同じメソッドを通過するループメソッドを作成しようとしています。ループする回数は、ユーザーが入力した文字列の長さによって決まります。たとえば、文字列が 1+2-3/4*3+2 の場合。プログラムは、最初の 3 つの数値と最初の 2 つの演算子を格納することになっています。次に、操作の順序を実行します。この場合、1 + 2-3 = 3-3 になります。次に、文字列から次の演算子と次の番号を取得することになっていました。これは私がこれまでに持っているループであり、文字列全体をループして新しい番号と演算子で更新することはありません

public static double solveExpresion(String e) {
    double answer = 0;

    for (int i = 0; i < e.length(); i++) {
        String operand1;
        String operand2;
        String operand3;

        operand1 = getOperand(e);
        o1 = Double.parseDouble(operand1);

        operator1 = getOperator(expression);

        operand2 = getOperand(expression);
        o2 = Double.parseDouble(operand2);

        operator2 = getOperator(expression);

        operand3 = getOperand(expression);
        o3 = Double.parseDouble(operand3);

        answer = orderOfOperation(operator1, operator2);

    /*  operator2 = getOperator(expression);

        operand3 = getOperand(expression);
        o3 = Double.parseDouble(operand3);

        answer = orderOfOperation(operator1, operator2);*/
    }

    return (answer);
}

注: 配列の使用は許可されていません。

これらは私の getOperand と getOperator メソッドです

public static String getOperand(String s) {
    s = s.trim();
    String num = "";

    while (s.length() > 0 && s.charAt(0) >= '0' && s.charAt(0) <= '9') {

        num = num + s.charAt(0);
        s = s.substring(1);

    }
    expression = s;

    return (num);
}

public static char getOperator(String s) {

    char r = 0;

    if (s.length() > 0) {

        r = s.charAt(0);
        s = s.substring(1);

    }

    expression = s;
    return (r);
}
4

1 に答える 1

3

あなたの論理は完全ではありません。これが私があなたの問題をどのように行うかについての(擬似コードでの)概要です:

double answer = getOperand(e);
while (not at end) {
    String operator = getOperator(e);
    double operand2 = getOperand(e);
    answer = orderOfOperation(answer, operator, operand2);
}
return answer;

answerこれは、次の演算子/オペランドで継続的に更新されます。これを実行する理由は、式の一部(たとえば、「1 + 2」)を評価した後、文字列内の次のもの(存在する場合)は演算子と次のオペランドであるためです。読み取るべき左オペランドはありません。代わりに、これまでの答えを使用する必要があります。

ループが正しく機能するためには、最初のオペランドがすでに消費されている(そしてに割り当てられているanswer)必要があることにも注意してください。

の現在のテストで(not at end)は、すべての演算子とオペランドが正確に1文字の長さであると想定していることに注意してください。オペランドの1つが9より大きい場合、これはうまく機能しません。

于 2012-11-05T21:08:45.007 に答える