【初心者がAndroid Studio+kotlinで電卓アプリを作ってみる】第6回:減算、乗算、除算処理追加編

kotlinで電卓アプリ作成

電卓アプリを作ってみるシリーズ一覧はこちらをクリック

今回のポイント

減算(-)、乗算(×)、除算(÷)ボタンを押したときの処理を追加していきます。

減算(-)ボタンの処理を追加

+ボタンが押された時をまるっとコピペしてちょっと変更するだけです。

        // -ボタンが押されたとき
        binding.buttonSubtraction.setOnClickListener {
            if (valueForCalc1st == 0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0
            }
            else if (valueForCalc2nd == 0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0
                valueForResults = valueForCalc1st - valueForCalc2nd
                binding.textViewValuedisplay.text = valueForResults.toString()
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0
                valueForResults = 0
            }
        }

アプリを実行してみます。
3-2-を押した段階で1が表示されます。正解です。
33-22-を押すと 11 が表示されますので二桁の計算も出来る。
=ボタン押下時は+しか実装されていませんので問答無用で足し算をしてしまいます。なので3-2=5になってしまいますので直してきます。
どうしましょう?やっぱりifでプラスボタン押されていた場合マイナスが押されていた場合で分岐するのがいいのでしょうか?ちょっとやってみます。

プラスボタンかマイナスボタンをifで判断するには変数が必要かなと思ってまたgoogle翻訳に頼る。
“一時保存用の記号”を翻訳してみたら”Symbol for temporary storage”らしいです。
長いのでsymbolForTempStorageという変数を追加してみる。

var symbolForTempStorage = "" // 一時保存用の記号
        // 値を格納する変数
        var valueForTempStorage = 0 // 一時保存用の値
        var valueForCalc1st = 0 // 計算用の値1番目
        var valueForCalc2nd = 0 // 計算用の値2番目
        var valueForResults = 0 // 結果用の値
        // 記号を格納する変数
        var symbolForTempStorage = "" // 一時保存用の記号

+ボタンが押された時に以下の処理を追加

            symbolForTempStorage = "+"

-ボタンが押された時に以下の処理を追加

            symbolForTempStorage = "-"

=ボタンが押されたときの処理を変更

symbolForTempStorageを使ってifで分岐していきましょう。

実行して3-2=1と表示されました、よかったです。
次の問題は3-2+1=6になってしまう問題を解決していきます。
正常なら3-2+を押した時点で1が表示されないといかんと思うが、5が表示されてしまう。
なんでだ。ちょっと考えてみる。

+ボタンが押されたときの処理を変更

+ボタンが押されたときに問答無用で+の処理をしているから3-2+がおかしいことに気が付く。
でも+ボタンが押された時に-の処理をすることになるのはやや違和感ですがちょっと変更してみます。
さっきの=ボタンが押された時と同じif文の処理を追加しました。
symbolForTempStorage = “+”は移動しないと絶対に以下の処理に入ってしまうので移動しました。

                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
        // +ボタンが押されたとき
        binding.buttonAddition.setOnClickListener {
            //symbolForTempStorage = "+" // 後で消す
            if (valueForCalc1st == 0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0
            }
            else if (valueForCalc2nd == 0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0
                //valueForResults = valueForCalc1st + valueForCalc2nd // 後で消す
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                binding.textViewValuedisplay.text = valueForResults.toString()
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0
                valueForResults = 0
            }
            symbolForTempStorage = "+"
        }

これで行けるか?
実行して3-2+をおしたら1が表示されたので成功しました。
次に3+2-をおしたら1が表示されてしまう問題ですが、さっきと同じ変更をします。

        // -ボタンが押されたとき
        binding.buttonSubtraction.setOnClickListener {
            //symbolForTempStorage = "-" // 後で消す
            if (valueForCalc1st == 0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0
            }
            else if (valueForCalc2nd == 0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0
                //valueForResults = valueForCalc1st - valueForCalc2nd // 後で消す
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                binding.textViewValuedisplay.text = valueForResults.toString()
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0
                valueForResults = 0
            }
            symbolForTempStorage = "-"  // ここだけ違うから気を付ける
        }

これで3+2-で5がようやく表示されるようになりました。
さらに3+2-1+2-3=3とかの計算が出来るようになりました。

乗算(×)ボタンの処理を追加

次は×ボタン押下時の処理を追加していこうと思います。
-ボタン押下時の処理を追加したときとほとんど同じです。

気を付けることは×は*なのと以下の処理を+ボタン押下時と-ボタン押下時と=ボタン押下時にも追加してみます。

                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }

実行して確認してみたところ掛け算出来るようになりました。
掛け算は簡単でした。
この調子で割り算も出来るようにしていきたいと思います。

除算(÷)ボタンの処理を追加

×ボタン押下時の処理を追加したときと同様にやればサクっと出来ちゃいそうなので、やってみました。
先ほどの×ボタン押下時の処理をまるっとコピペして少し変更します。

先ほどと同様に以下の処理を+ボタン押下時、-ボタン押下時、×ボタン押下時、=ボタン押下時にも追加してみます。

                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }

よし、これで行けると思って実行してみます。
ためしに1÷2=をやってみましたが結果0が表示されました、0.5が正解です。
これは値を格納する変数がInt型だから小数点以下が切り捨てられているのかな?
じゃあ小数点が使えるDouble型にすれば解決するだろうと思ってやってみました。
(kotlinは変数の型を指定しなくても勝手に判断してくれるみたいですね。)
ここから小数点の沼にハマりましたのでその7に移動します。
以下にここまでのactivity_main.xmlのコードを置いておきます。

package com.example.calculatorapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.calculatorapplication.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        // 値を格納する変数
        var valueForTempStorage = 0 // 一時保存用の値
        var valueForCalc1st = 0 // 計算用の値1番目
        var valueForCalc2nd = 0 // 計算用の値2番目
        var valueForResults = 0 // 結果用の値
        // 記号を格納する変数
        var symbolForTempStorage = "" // 一時保存用の記号
        // 1ボタンが押された時
        binding.buttonOne.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 1
            binding.textViewValuedisplay.text = valueForTempStorage.toString()
        }
        // 2ボタンが押された時
        binding.buttonTwo.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 2
            binding.textViewValuedisplay.text = valueForTempStorage.toString()
        }
        // 3ボタンが押された時
        binding.buttonThree.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 3
            binding.textViewValuedisplay.text = valueForTempStorage.toString()
        }
        // +ボタンが押されたとき
        binding.buttonAddition.setOnClickListener {
            if (valueForCalc1st == 0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0
            }
            else if (valueForCalc2nd == 0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }
                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }
                binding.textViewValuedisplay.text = valueForResults.toString()
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0
                valueForResults = 0
            }
            symbolForTempStorage = "+"
        }
        // -ボタンが押されたとき
        binding.buttonSubtraction.setOnClickListener {
            if (valueForCalc1st == 0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0
            }
            else if (valueForCalc2nd == 0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }
                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }
                binding.textViewValuedisplay.text = valueForResults.toString()
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0
                valueForResults = 0
            }
            symbolForTempStorage = "-"
        }
        // ×ボタンが押されたとき
        binding.buttonMultiplication.setOnClickListener {
            if (valueForCalc1st == 0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0
            }
            else if (valueForCalc2nd == 0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }
                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }
                binding.textViewValuedisplay.text = valueForResults.toString()
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0
                valueForResults = 0
            }
            symbolForTempStorage = "*"
        }
        // ÷ボタンが押されたとき
        binding.buttonDivision.setOnClickListener {
            if (valueForCalc1st == 0) {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0
            }
            else if (valueForCalc2nd == 0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }
                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }
                binding.textViewValuedisplay.text = valueForResults.toString()
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0
                valueForResults = 0
            }
            symbolForTempStorage = "/"
        }
        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            valueForCalc2nd = valueForTempStorage
            valueForTempStorage = 0
            if (symbolForTempStorage == "+") {
                valueForResults = valueForCalc1st + valueForCalc2nd
            }
            else if (symbolForTempStorage == "-") {
                valueForResults = valueForCalc1st - valueForCalc2nd
            }
            else if (symbolForTempStorage == "*") {
                valueForResults = valueForCalc1st * valueForCalc2nd
            }
            else if (symbolForTempStorage == "/") {
                valueForResults = valueForCalc1st / valueForCalc2nd
            }
            binding.textViewValuedisplay.text = valueForResults.toString()
            valueForCalc1st = valueForResults
            valueForCalc2nd = 0
            valueForResults = 0
            symbolForTempStorage = ""
        }
        // ACボタンが押されたとき
        binding.buttonAllClear.setOnClickListener {
            valueForTempStorage = 0
            valueForCalc1st = 0
            valueForCalc2nd = 0
            valueForResults = 0
            symbolForTempStorage = ""
            binding.textViewValuedisplay.text = ""
        }
    }
}

コメント