1

Yo - Java に戻ろうとしているので、電卓を作成することにしました。

次のように動作するとします。

1) ユーザーから文字列の形式で入力を取得します -> この入力は文字列として格納されます。例: 12+89

2) 演算子の位置に従って文字列を分割し、この操作の前にあるものはすべて整数に変換されて格納されるようにします

3) 文字列が渡されたら、値を計算します

私はこれを実際よりも複雑にしていると確信しています:p これまでのコードは次のとおりです:

// Split String, count digits in string
public static void spitStrg() {
    int numDigits = 0;
    int numOperators = 0;
    for (int i = 0; i < input.length(); i++) {
        if (Character.isDigit(input.charAt(i))) {
            numDigits++;
        }
        else if (input.charAt(i) == '+') {
            System.out.println( "Position of operator: "+i);
            numOperators++;
        }
    }
    System.out.println("Number of Digits: "+numDigits);
    System.out.println("Number of Operators: "+numOperators);
}

// Create a number from cut off point
public static void createNum(int startPoint, int operatorPosition) {
    String tempNum = "";

    for (int j = startPoint; j < operatorPosition; j++) {
        tempNum = tempNum + input.charAt(startPoint);
    }
}

これを処理する方法について他に何か提案はありますか? つまり、一度に 1 つの数値を要求してから演算子を求めるか、すべてをベクトルに格納して、桁数と演算子の増加を反映しますか?

4

5 に答える 5

1

これで問題ないかどうかわかりません。(またはチート?)

ユーザーに式全体を文字列として入力させるだけです。23+33-34*2^2

次に、次のことができます。

try {
        final ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
        final Object result = engine.eval("23+33-34*2^2");
        System.out.println(result);
    } catch (final ScriptException e) {

        e.printStackTrace();
    }

上記のコードを実行すると、次のようになります。

-10
于 2012-10-04T14:44:48.273 に答える
1

既存の電卓のソースコードを調べてみませんか? おそらく、それらは良いアプローチとは何かについていくつかのアイデアを収集するでしょう.

以前に調べたsourceforgeで見つけた1つの例は次のとおりです。

http://sourceforge.net/projects/jcalcadvance/

于 2012-10-04T14:37:35.147 に答える
1

効果的なJavaのEnumクラスを見て、自分でオペレーターを管理するためにJoshua Blochを予約してください

使用できる操作が限られている場合

String[] readInput = inputString.split("+|-|*|/|%").trim();

次に、演算子は数字の間にあります
- numberOne はゼロから readInput [0] のサイズまでです
- numberTwo の始まりはによって行われますinputString.index(readInput[1]) + readInput[1].length

オペレーターは次の場所にあります inputString.subtring(endOfReadInput[0],indexOfReadInput[1]).trim();

この演習は、分割、部分文字列、およびその他の文字列ツールがどのように強力であるかを知り、新しいEnum.class可能性を理解するのに興味深いものです。その後、他のリンクを読んで、パターン デザインの使用方法を理解できます。

于 2012-10-04T14:50:39.057 に答える
0

数式を解析するためにライブラリを使用したくない場合 (これが最も簡単な方法ですが、私の答えでは、これが不要であると想定しています)、文字列の分割だけでなく、実際の解析が必要です。

始める前に、言語の構文解析の基本、特に基本的な算術構文の構文解析について読むことをお勧めします。まず、このpdfを読むことができます。

于 2012-10-04T14:40:41.410 に答える
0

ユーザーに文字列全体を入力するように強制することはありません。これは悪い経験です。通常の電卓のようにしてみませんか?入力が入るとその場で結果を計算します。したがって、新しい演算子を入力すると、現在の操作が完了します。

したがって、文字ごとに読み取ります-無限ループでこのようなもの。

while(Character.isDigit(input.charAt(0)) {
    operand += digitPosition*input.charAt(0);
    digitPosition*=10;
}

digitPosition = 1;

//broke out of loop - operator received
if (isValidOperator(input.charAt(0))) {
    //store operator and await another operand (if first operation only), compute result, or throw invalid operator exception
}
于 2012-10-04T14:48:52.233 に答える