【初心者がAndroid Studio+kotlinで電卓アプリを作ってみる】第3回:1+2+3=6編

kotlinで電卓アプリ作成

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

今回のポイント

前回作成したアプリで出来なかった事を一つずつ出来るように改良していきたいと思います。
1+2+2=5など+ボタンが2回以上押された場合
1+2=3+1=4などの=を押した後でさらに計算をしたい場合

解りやすいように3ボタン作ろう

3ボタンがあれば1+2+3=6で解りやすそうなので3ボタンを作っちゃいましょう
ボタンの作り方を忘れた人は-その1-を見て下さい。

activity_main.xmlでボタンを作成

MainActivity.ktに以下を追加する

        // 3ボタンが押された時
        binding.buttonThree.setOnClickListener {
            valueForTempStorage = 3
            binding.textViewValuedisplay.text = "3"
        }

これで1+3=4、2+3=5などの計算は出来るようになった。

1+2+3=6が出来ない理由を考えてみた

エミュレーターか実機でテストしてみた結果
1+2+3=5
3+2+1=3
2+1+3=4
最初の数字(上から最初に押された数字1、3,2)を無視して、1+2+3が2+3の結果”5″になってしまってます。
同様に3+2+1は2+1の結果”3″が表示
同様に2+1+3は1+3の結果”4″が表示

MainActivity.ktで1+2+3=5になってしまう処理

1+2+の時点で(上の画像④)の時点で1の数字が上書きされて無くなっちゃってますね。
こうなったら1+2+の時点(上の画像④のタイミング)で計算して3を表示しちゃおうと思います。
電卓ってそんな仕様ですよね。

1+2+の時点で計算してみる

計算をするので=ボタンが押された時の処理をそのまま使えるはず。
ってことで=ボタンが押された時の処理をコピペ

        // +ボタンが押されたとき
        binding.buttonAddition.setOnClickListener {
            valueForCalc1st = valueForTempStorage
            valueForTempStorage = 0
            valueForCalc2nd = valueForTempStorage
            valueForTempStorage = 0
            valueForResults = valueForCalc1st + valueForCalc2nd
            binding.textViewValuedisplay.text = valueForResults.toString()
        }
        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            valueForCalc2nd = valueForTempStorage
            valueForTempStorage = 0
            valueForResults = valueForCalc1st + valueForCalc2nd
            binding.textViewValuedisplay.text = valueForResults.toString()
        }

ifで分岐する

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

if (valueForCalc1st == 0) {
もし(if)[計算用の値1番目の値]が0だったら(==)
valueForCalc1st = valueForTempStorage
[計算用の値1番目]に[一時保存用の値]を入れてね。
valueForTempStorage = 0
[一時保存用の値]は別のところに入れたから消してもいいよね、初期化しよ。
}
else if (valueForCalc2nd == 0) {
そうじゃなくてもしも(else if)[計算用の値2番目]の値が0だったら(==)
valueForCalc2nd = valueForTempStorage
[計算用の値2番目]に[一時保存用の値]を入れてね。
valueForTempStorage = 0
[一時保存用の値]は別のところに入れたから消してもいいよね、初期化しよ。
valueForResults = valueForCalc1st + valueForCalc2nd
そんで足し算して結果を[結果用の値]に入れてね。
binding.textViewValuedisplay.text = valueForResults.toString()
[結果用の値]を表示してね。
}
です。

実行してみた結果

1+2+3までは順調ですね。解りにくければ3+2+1も試してください。
では1+2+3まで押して=ボタンクリックしたら表示が4!!なんでだ。
結果を見てみます。
1+2+3=4
3+2+1=4
2+1+3=5
今度は最初の数字と最後の数字しか計算してないです。
原因はすぐに解りました、valueForCalc1stがずっと同じ数字だ。
なのでvalueForCalc1stの値を計算したら上書きするようにします。

MainActivity.ktに処理を追加

これで1+2+3=6などの計算が可能になりましたが、あと一つ問題があって1+2+3+1は出来ないですね、なぜならならvalueForCalc2ndがこのままだと0になるタイミングが無いですので
else if (valueForCalc2nd == 0)の処理に入らない。
じゃあvalueForCalc2ndを0にします。

// +ボタンが押されたとき
        binding.buttonAddition.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
            }
        }
        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            valueForCalc2nd = valueForTempStorage
            valueForTempStorage = 0
            valueForResults = valueForCalc1st + valueForCalc2nd
            binding.textViewValuedisplay.text = valueForResults.toString()
            valueForCalc1st = valueForResults
            valueForCalc2nd = 0 // 追加
            valueForResults = 0
        }

これで出来るかな?出来たー!!
次回は二桁以上の足し算を出来るようにしたいです。

こんな感じになりました

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 // 結果用の値
        // 1ボタンが押された時
        binding.buttonOne.setOnClickListener {
            valueForTempStorage = 1
            binding.textViewValuedisplay.text = "1"
        }
        // 2ボタンが押された時
        binding.buttonTwo.setOnClickListener {
            valueForTempStorage = 2
            binding.textViewValuedisplay.text = "2"
        }
        // 3ボタンが押された時
        binding.buttonThree.setOnClickListener {
            valueForTempStorage = 3
            binding.textViewValuedisplay.text = "3"
        }
        // +ボタンが押されたとき
        binding.buttonAddition.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
            }
        }
        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            valueForCalc2nd = valueForTempStorage
            valueForTempStorage = 0
            valueForResults = valueForCalc1st + valueForCalc2nd
            binding.textViewValuedisplay.text = valueForResults.toString()
            valueForCalc1st = valueForResults
            valueForCalc2nd = 0
            valueForResults = 0
        }
        // ACボタンが押されたとき
        binding.buttonAllClear.setOnClickListener {
            valueForTempStorage = 0
            valueForCalc1st = 0
            valueForCalc2nd = 0
            valueForResults = 0
            binding.textViewValuedisplay.text = ""
        }
    }
}

コメント