電卓アプリを作ってみるシリーズ一覧はこちらをクリック
今回のポイント
バグの修正
実行してみたらバグ発見
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 = ""
}
}
}
コメント