1

ユーザーが入力した式を評価するプログラムを作成しようとしています。私は別々の方法が必要であることを知っているので、最初に乗算と除算を評価し、その後に加算と減算を追加します。これは私がこれまでに得たものです。6*6 のように、掛け算や割り算を含むものを試してみると、最初の文字だけが表示されます。この例では、「6」になります。何か案は?

import java.util.Scanner;
class Expressions {
String e;

void setExpressions(String exp) {
    e = exp;
}
String evaluate() {
    String n = "";
    for (int i = 0; i < e.length(); i++)
        if (e.charAt(i) == '*' || e.charAt(i) == '/') {  
            n += e.charAt(i);
        }
        else if (e.charAt(i) == '+' || e.charAt(i) == '/') {
            evaluateMD();
            n = "";
        }
        else 
            n += e.charAt(i);
    return n;
}
int evaluateMD () {
    int r = 1;
    int n = 0;
    char op = '*';

    for (int i = 0; i < evaluate().length(); i++)
        if (evaluate().charAt(i) == '*' || evaluate().charAt(i) == '/') {
            if (op == '*') 
                r *= n;
            else 
                r /= n;   
            n = 0;
            op = evaluate().charAt(i);
        }
        else if (evaluate().charAt(i) == '*' || evaluate().charAt(i) == '/')
            n = 0;
        else //digits
            n = n*10 + (evaluate().charAt(i)-'0');
    if (op == '+') //last operation
        r *= n;
    else 
        r /= n;

    return r;

}
int evaluateAS() {
    //e has +, - only, multiple digit numbers 
    int r = 0;
    int n = 0;
    char op = '+';

    for (int i = 0; i < e.length(); i++)
        if (e.charAt(i) == '+' || e.charAt(i) == '-') {
            if (op == '+') 
                r += n;
            else 
                r -= n;   
            n = 0;
            op = e.charAt(i);
        }
        else if (e.charAt(i) == '*' || e.charAt(i) == '/')
            n = 0;
        else //digits
            n = n*10 + (e.charAt(i)-'0');
    if (op == '+') //last operation
        r += n;
    else 
        r -= n;

    return r;
}
}
 public class hw10 {
 public static void main(String[] args) {
    Scanner in = new Scanner (System.in);
    Expressions myE = new Expressions();

    System.out.print("Enter E:");//E for expression
    String e = in.next();

    myE.setExpressions(e);
    //int r = myE.evaluate1();

    int r = myE.evaluateAS();

    System.out.println(e+" = "+r);



}
}
4

2 に答える 2

1

ラインの変更

if (op == '+') //last operation  

evaluateMD メソッドで

if (op == '*') //last operation  

メソッドの戻り値の型を double に変更し、r と n を double にすると、evaluateMD の結果が向上しますが、実際には、完全な放棄ではないにしても、全体的な手順をオーバーホールする必要があります。

評価メソッドが計算の答えだけを返した方が良いと思います。

最大で 2 つの値を保存する必要があるだけです: (AS 操作がある場合、MD を最初に評価する必要があるため、次の演算子が MD の場合はそれを保存しますが、一度 MD 操作 (これにはさらに多くの値が含まれる可能性があります) 1 つ以上の演算子または同じ演算子の複数のインスタンス、つまり 4*5*6 または 4/3*2) が計算された場合は、「待機中」の AS をすぐに実行できます。MD 操作の場合は、最新の更新を保存するだけです。毎回、evaluateMDメソッドでほとんど作業していたので(これは、一番上に置いた変更でうまくいくと思います。他のいくつかの変更を加えたので、それについて気軽に尋ねてください)。

これはあなたが試みていた方法の改善ですが、私が言ったように、他の回答でまだ言及されている方が良い方法があるかもしれません.

于 2013-11-09T04:39:03.997 に答える