【初心者がAndroid Studio+kotlinで電卓アプリを作ってみる】第8回:関数を使う編

kotlinで電卓アプリ作成

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

今回のポイント

同じコードが何度も出てきてずいぶん長くなってしまったコードを関数を使って短く出来たらいいなと思っています。

+ボタンが押された時と-ボタンが押された時を見比べてみる

下から2行目の
symbolForTempStorage = “+”
symbolForTempStorage = “-“
×ボタン÷ボタンも同様に
symbolForTempStorage = “*”
symbolForTempStorage = “/”
だけの違いなので関数を使ってまとめてしまいたいです。

        // +ボタンが押されたとき
        binding.buttonAddition.setOnClickListener {
            if (valueForCalc1st == 0.0) {
                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
                }
                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
            }
            symbolForTempStorage = "+"
        }
        // -ボタンが押されたとき
        binding.buttonSubtraction.setOnClickListener {
            if (valueForCalc1st == 0.0) {
                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
                }
                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
            }
            symbolForTempStorage = "-"
        }

関数を作ってみる

関数の名前はどうしようかと思いgoogle翻訳で調べてみました。
演算子(operator)
タップした(Tapped)
関数(function)
だったのでoperatorTappedFunctionという名前の関数を作ってみようと思います。

        // 演算子(operator)タップした(Tapped)関数(function)
        fun operatorTappedFunction () {}

関数出来た。考えたら関数を作るときにfunを付けないといけないのでoperatorTappedFunctionのFunctionいらないですね。なので名前をoperatorTappedに変えます。
funって関数(Function)の略だったのか。

        // 演算子(operator)タップした(Tapped)
        fun operatorTapped () {}


ちょっと気になったので変数を作った時のvarは何の略か調べてみました。
var=variable(変数)直球でした。

関数に処理を書いていこう

+、-、*、/、ボタンの被っている処理を関数にまとめれば短くなりそうなのでやってみよう。
コピペしてみました。

        // 演算子(operator)タップした(Tapped)
        fun operatorTapped() {
            if (valueForCalc1st == 0.0) {
                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
                }
                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
            }
        }

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

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

+ボタンが押されたときにさっきのoperatorTapped ()関数に処理をお願いします。
なんと2行になりました。
つづけて-、*、/、ボタン押下時もやってみます。
operatorTapped ()をコピーしてif (valueForCalc1st == 0.0) {から
symbolForTempStorage = “-“の上まで選択してペースト

すっきりしたー。
=ボタンってちょっと違うけどやってしまえ。

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

実行してみた結果、多分大丈夫かな。

関数を使わない時と使った時を見比べてみる

すごく短くなった。

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 // 小数チェック用のフラグ
        // 1ボタンが押された時
        binding.buttonOne.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 1
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // 2ボタンが押された時
        binding.buttonTwo.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 2
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // 3ボタンが押された時
        binding.buttonThree.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 3
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // +ボタンが押されたとき
        binding.buttonAddition.setOnClickListener {
            if (valueForCalc1st == 0.0) {
                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
                }
                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
            }
            symbolForTempStorage = "+"
        }
        // -ボタンが押されたとき
        binding.buttonSubtraction.setOnClickListener {
            if (valueForCalc1st == 0.0) {
                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
                }
                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
            }
            symbolForTempStorage = "-"
        }
        // ×ボタンが押されたとき
        binding.buttonMultiplication.setOnClickListener {
            if (valueForCalc1st == 0.0) {
                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
                }
                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
            }
            symbolForTempStorage = "*"
        }
        // ÷ボタンが押されたとき
        binding.buttonDivision.setOnClickListener {
            if (valueForCalc1st == 0.0) {
                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
                }
                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
            }
            symbolForTempStorage = "/"
        }
        // =ボタンが押されたとき
        binding.buttonEqual.setOnClickListener {
            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
            }
            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
            symbolForTempStorage = ""
        }
        // ACボタンが押されたとき
        binding.buttonAllClear.setOnClickListener {
            valueForTempStorage = 0.0
            valueForCalc1st = 0.0
            valueForCalc2nd = 0.0
            valueForResults = 0.0
            flagForDecimal = false
            symbolForTempStorage = ""
            binding.textViewValuedisplay.text = ""
        }
    }
}
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 // 小数チェック用のフラグ
        // 演算子(operator)タップした(Tapped)
        fun operatorTapped() {
            if (valueForCalc1st == 0.0) {
                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
                }
                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
            }
        }
        // 1ボタンが押された時
        binding.buttonOne.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 1
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // 2ボタンが押された時
        binding.buttonTwo.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 2
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // 3ボタンが押された時
        binding.buttonThree.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 3
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // +ボタンが押されたとき
        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 = ""
        }
    }
}

今回のまとめ

関数って参考書とかインターネットで勉強するときにいきなり出てきて困惑していましたが、関数を使う事でこういうメリットがあったのが解りました。
これならその7でやったInt型の0をDouble型の0.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.0 // 一時保存用の値
        var valueForCalc1st = 0.0 // 計算用の値1番目
        var valueForCalc2nd = 0.0 // 計算用の値2番目
        var valueForResults = 0.0 // 結果用の値
        // 記号を格納する変数
        var symbolForTempStorage = "" // 一時保存用の記号
        // 小数チェック用の変数
        var stringForPointZeroCheck = "" // .0チェック用の文字列
        var flagForDecimal = false // 小数チェック用のフラグ
        // 演算子(operator)タップした(Tapped)
        fun operatorTapped() {
            if (valueForCalc1st == 0.0) {
                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
                }
                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
            }
        }
        // 1ボタンが押された時
        binding.buttonOne.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 1
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // 2ボタンが押された時
        binding.buttonTwo.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 2
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // 3ボタンが押された時
        binding.buttonThree.setOnClickListener {
            valueForTempStorage = valueForTempStorage * 10 + 3
            binding.textViewValuedisplay.text = valueForTempStorage.toInt().toString()
        }
        // +ボタンが押されたとき
        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 = ""
        }
    }
}

コメント