電卓を作ろう【計算処理実装編】
今回は計算処理の実装です!
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. 動作確認
それでは動かしてみます!
正しく計算されていますね!
(掛け算と割り算を最初に計算するように作られてないのは内緒。笑)
(あと整数しか入れてないのに結果が少数点表記なのは気になる・・・)
本日はここまでです!
お疲れ様でした!!