アプリ開発初心者の暇つぶしAndroid体験記

アプリ開発初心者がAndroidアプリ開発始めました。日々学んだことをアウトプットしていきます。

電卓を作ろう【計算処理実装編】

今回は計算処理の実装です!
Listやfor文を駆使して実現させます!

やっとここまで来ました!
それではやっていきます。

1. 数字・小数点ボタン処理実装

まずは数字と小数点のボタン処理にコードを追加していきます。
例として"1"が押された時のコードを載せておきます。

// 1が押された場合の処理
case R.id.one:

    viewNum = calc.getText().toString() + "1";
    calc.setText(viewNum);

    tmpCalcNum += "1";

    break;

追加したのは以下の1行です。

tmpCalcNum += "1";

変数tmpCalcNumは文字列型で宣言してあり、直前の演算記号以降に押された数字を保持します。
例えば 「10+5+30」 の場合は、
変数tmpCalcNumには"30"が入っていることになります。

2. 演算記号ボタン処理実装

次に演算記号が押された場合の処理です。
例として"+"が押された場合の処理が以下です。

// +が押された場合の処理
case R.id.plus:

    // calcListに計算する情報を追加する。(数字と演算記号)
    calcList.add(tmpCalcNum);
    calcList.add("+");
    tmpCalcNum = "";

    viewNum = calc.getText().toString() + "+";
    calc.setText(viewNum);

    break;

calcListは文字列型のリストで宣言しています。
このリストにList#addを使い、変数tmpCalcNumと文字列"+"を追加します。
先ほどの例をもう一度使うと、
 「10+5+30」
この状態で"+"を押すと、"30"と"+"がcalcListに追加されるというわけです。
そして演算記号が押されたことによりtmpCalcNumは初期化する必要があるため、空文字を設定します。
残りの"-"、"*"、"/"のボタンも同じように実装します。

3. "="ボタン処理実装

最後は、"="を押した時です。
このタイミングでcalcListに入っている数字と演算記号を順々に読んで計算していきます。

// =が押された場合の処理
case R.id.eq:

    // 直前の数字をcalcListに追加する
    calcList.add(tmpCalcNum);

    for (String calc : calcList) {

        // 演算記号の場合は、計算モードを設定する
        if (calc.equals("+")) {
            calcMode = "pl";
        } else if (calc.equals("-")) {
            calcMode = "mi";
        } else if (calc.equals("*")) {
            calcMode = "mu";
        } else if (calc.equals("/")) {
            calcMode = "di";
        } else {
            // 演算記号以外(数字)の場合は、計算モードを元に計算する
            if (calcMode.equals("pl")) {
                resultNum += Double.parseDouble(calc);
            } else if (calcMode.equals("mi")) {
                resultNum -= Double.parseDouble(calc);
            } else if (calcMode.equals("mu")) {
                resultNum *= Double.parseDouble(calc);
            } else if (calcMode.equals("di")) {
                resultNum /= Double.parseDouble(calc);
            } else {
                // 計算モードがどれでもない場合は、最初の数字なのでresultNumに設定
                resultNum = Double.parseDouble(calc);
            }
        }
    }

    calc.setText(resultNum.toString());

    calcMode = "";
    tmpCalcNum = "";

    calcList.clear();
    tmpCalcNum = resultNum.toString();

    break;

calcListをfor文で回していきます。
要素が演算記号の場合は、計算モードを指定します。
要素が演算記号でない場合(つまり数字の場合)は、計算モードに基づき計算を行います。
順々に計算していき、全要素を読み込んだあとは結果をTextViewに表示します。
結果を使って続けて電卓を打つことがあるので、最後に必要な変数を初期化します。

4. 動作確認

それでは動かしてみます!
f:id:mtnanao:20200222220127p:plain
f:id:mtnanao:20200222220137p:plain

正しく計算されていますね!

(掛け算と割り算を最初に計算するように作られてないのは内緒。笑)
(あと整数しか入れてないのに結果が少数点表記なのは気になる・・・)


本日はここまでです!
お疲れ様でした!!