【初心者がAndroid Studio+kotlinで電卓アプリを作ってみる】第10回:バグ修正編

kotlinで電卓アプリ作成

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

今回のポイント

バグの修正

実行してみたらバグ発見

1、+、2、=、(ここまではOK、3が表示される)そのあとさらに計算したい時があるとして+、を押すと0が表示されてしまうのが問題です。
原因を探す。
1、+、2、=、+、の時点で+ボタンを押したのにsymbolForTempStorageは””空なのがダメなのでしょう

じゃあ計算する前に記号をいれとけばいいんだろ??

試しに実行してみたところ1+2=+3=で6が表示されたので成功した!
// -ボタンが押された時、×ボタン、÷ボタン、=ボタンも修正です。
(以下のコードは間違いだったことが判明)

        // +ボタンが押されたとき
        binding.buttonAddition.setOnClickListener {
            symbolForTempStorage = "+"
            operatorTapped ()
        }
        // -ボタンが押されたとき
        binding.buttonSubtraction.setOnClickListener {
            symbolForTempStorage = "-"
            operatorTapped ()
        }
        // ×ボタンが押されたとき
        binding.buttonMultiplication.setOnClickListener {
            symbolForTempStorage = "*"
            operatorTapped ()
        }
        // ÷ボタンが押されたとき
        binding.buttonDivision.setOnClickListener {
            symbolForTempStorage = "/"
            operatorTapped ()
        }
        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            symbolForTempStorage = ""
            operatorTapped ()
        }

これで大丈夫か?ダメだった。
今度は1+2-の時点で3が表示されなければいけないのに-1が表示されてしまう。
のでやっぱり元に戻す。

        // +ボタンが押されたとき
        binding.buttonAddition.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "+"
        }
        // -ボタンが押されたとき
        binding.buttonSubtraction.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "-"
        }
        // ×ボタンが押されたとき
        binding.buttonMultiplication.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "*"
        }
        // ÷ボタンが押されたとき
        binding.buttonDivision.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "/"
        }
        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = ""
        }

つぎにsymbolForTempStorage = “”をsymbolForTempStorage = “=”
に変更する。=ボタンが押されたら計算終了だろうと思っていたので、””空にしていましたが、ちゃんと”=”を入れとくことにします。

        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "="
        }

fun operatorTapped() {も変更します。
以下を追加してみる。
(symbolForTempStorageが=の場合は結果表示画面は何もしないでね)です。

                else if (symbolForTempStorage == "=") {
                    return
                }

頼むからこれで正常に動いてくれと思いながら実行してみました
実行結果を書いていきます。

カッコ内はボタンを押した時点で表示画面id:textViewValuedisplayに表示される数字
1(1)+(1)2(2)+(3)3(3)=(6)  足し算OK
1(1)+(1)2(2)-(3)3(3)=(0)  足し算と引き算の混合OK
1(1)/(1)2(2)+(0.5)3(3)=(3.5)  足し算と割り算の混合かつ小数OK
1(1)+(1)2(2)=(3)+(3)4(4)=(7)  =の後さらに計算を続けた場合OK
0(0)-(0)1(1)=(1) 0の計算NG!!!!

本当は0-1=-1にならないといけないのに。心が折れそうですが原因を探す。
0-1=の時ここに入ってはダメだと思う。
ここに来たら計算すらしないです、ここに来ていいときは初期状態の時だけ来てほしいのに。
そこで一時間ぐらい考えてみました………

これだ!

        // 関数(fun)演算子(operator)タップした(Tapped)
        fun operatorTapped() {
            if (valueForCalc1st == 0.0 && symbolForTempStorage == "") {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0.0
            }
0(0)-(0)1(1)=(1) 0の計算OK

今回のまとめ

思い通りに動かないことがたくさんありましたが、何とか修正出来ました。

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.0 // 一時保存用の値
        var valueForCalc1st = 0.0 // 計算用の値1番目
        var valueForCalc2nd = 0.0 // 計算用の値2番目
        var valueForResults = 0.0 // 結果用の値
        // 記号を格納する変数
        var symbolForTempStorage = "" // 一時保存用の記号
        // 小数チェック用の変数
        var stringForPointZeroCheck = "" // .0チェック用の文字列
        var flagForDecimal = false // 小数チェック用のフラグ
        // 関数(fun)数字(numbers)タップした(Tapped)
        fun numbersTapped(nambers : Int) {
            valueForTempStorage = valueForTempStorage * 10 + nambers
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // 関数(fun)演算子(operator)タップした(Tapped)
        fun operatorTapped() {
            if (valueForCalc1st == 0.0 && symbolForTempStorage == "") {
                valueForCalc1st = valueForTempStorage
                valueForTempStorage = 0.0
            }
            else if (valueForCalc2nd == 0.0) {
                valueForCalc2nd = valueForTempStorage
                valueForTempStorage = 0.0
                if (symbolForTempStorage == "+") {
                    valueForResults = valueForCalc1st + valueForCalc2nd
                }
                else if (symbolForTempStorage == "-") {
                    valueForResults = valueForCalc1st - valueForCalc2nd
                }
                else if (symbolForTempStorage == "*") {
                    valueForResults = valueForCalc1st * valueForCalc2nd
                }
                else if (symbolForTempStorage == "/") {
                    valueForResults = valueForCalc1st / valueForCalc2nd
                }
                else if (symbolForTempStorage == "=") {
                    return
                }
                stringForPointZeroCheck = valueForResults.toString()
                stringForPointZeroCheck = stringForPointZeroCheck.indexOf(".0").toString()
                if (stringForPointZeroCheck == "-1") {
                    flagForDecimal = true
                }
                if (flagForDecimal) {
                    binding.textViewValuedisplay.text = valueForResults.toString()
                }
                else {
                    binding.textViewValuedisplay.text = valueForResults.toInt().toString()
                }
                valueForCalc1st = valueForResults
                valueForCalc2nd = 0.0
                valueForResults = 0.0
                flagForDecimal = false
            }
        }
        // 0ボタンが押された時
        binding.buttonZero.setOnClickListener {
            numbersTapped(0)
        }
        // 1ボタンが押された時
        binding.buttonOne.setOnClickListener {
            numbersTapped(1)
        }
        // 2ボタンが押された時
        binding.buttonTwo.setOnClickListener {
            numbersTapped(2)
        }
        // 3ボタンが押された時
        binding.buttonThree.setOnClickListener {
            numbersTapped(3)
        }
        // 4ボタンが押された時
        binding.buttonFour.setOnClickListener {
            numbersTapped(4)
        }
        // 5ボタンが押された時
        binding.buttonFive.setOnClickListener {
            numbersTapped(5)
        }
        // 6ボタンが押された時
        binding.buttonSix.setOnClickListener {
            numbersTapped(6)
        }
        // 7ボタンが押された時
        binding.buttonSeven.setOnClickListener {
            numbersTapped(7)
        }
        // 8ボタンが押された時
        binding.buttonEight.setOnClickListener {
            numbersTapped(8)
        }
        // 9ボタンが押された時
        binding.buttonNine.setOnClickListener {
            numbersTapped(9)
        }
        // +ボタンが押されたとき
        binding.buttonAddition.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "+"
        }
        // -ボタンが押されたとき
        binding.buttonSubtraction.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "-"
        }
        // ×ボタンが押されたとき
        binding.buttonMultiplication.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "*"
        }
        // ÷ボタンが押されたとき
        binding.buttonDivision.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "/"
        }
        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            operatorTapped ()
            symbolForTempStorage = "="
        }
        // ACボタンが押されたとき
        binding.buttonAllClear.setOnClickListener {
            valueForTempStorage = 0.0
            valueForCalc1st = 0.0
            valueForCalc2nd = 0.0
            valueForResults = 0.0
            flagForDecimal = false
            symbolForTempStorage = ""
            binding.textViewValuedisplay.text = ""
        }
    }
}

コメント