swiftで電卓を作っています。
iPhoneに備わっている電卓を元に作っているのですが
[=]を押さないで連続で計算[1 + 2 - 6 + 5]をするのが上手くできませんが、何がいけないのでしょうか・・・
イメージでは [1 + 2]で次に[-]演算子を打つと[3]と表示され [+]を打つと[-3]と表示されると思っています
計算式を作って次の演算子を打つと[=]のような動作ができるはずなのですが。。。
ちなみに[=]を押して次に演算子と数字を打ってまた[=]を押すと想定通りの計算ができます
import UIKit class ViewController: UIViewController { enum Operator: String{ //各演算子"+", "-", "×", "÷" case undifind = "" //未定義 case addition = "+" //足し算 case subtraction = "-" //引き算 case multiplication = "*" //掛け算 case division = "/" //割り算 } var firstNumber:Decimal = 0//演算子を押す前の数字 var secondNumber:Decimal = 0//演算子を押した後の数字 var i:Decimal = 0.1 //小数点の計算 var i2:Decimal = 0.1 //小数点の計算 var enzanshi = Operator.undifind // 演算子 var decimalPointFlag:Bool = false //小数点を押したときはtrue @IBOutlet weak var result: UILabel! @IBAction func numbers(_ sender: UIButton) { //数字ボタン let tappedButtonNumber = Decimal(sender.tag-1) if enzanshi == .undifind { if decimalPointFlag == true { //小数点を押した場合の処理 firstNumber = firstNumber + (tappedButtonNumber * i) result.text = "(firstNumber)" i = i * 0.1 } else { firstNumber = (firstNumber * 10) + tappedButtonNumber result.text = "(firstNumber)" } } else { if decimalPointFlag == true { //小数点を押した場合の処理 secondNumber = secondNumber + (tappedButtonNumber * i2) result.text = "(secondNumber)" i2 = i2 * 0.1 } else { secondNumber = (secondNumber * 10) + tappedButtonNumber result.text = "(secondNumber)" } } print(firstNumber, enzanshi, secondNumber) } @IBAction func decimalPointButton(_ sender: UIButton) { //小数点ボタン let point:String = "." decimalPointFlag = true if result.text!.contains("."){ } else { result.text! += point } } @IBAction func calcButton(_ sender: UIButton) { //演算子ボタン switch sender.currentTitle! { case "+": enzanshi = .addition case "-": enzanshi = .subtraction case "×": enzanshi = .multiplication case "÷": enzanshi = .division default: enzanshi = .undifind } //1回目の演算子ボタンを押した時は計算式を作るだけ //2回目以降の演算子ボタンを押した時は、1つ前の計算式が計算されている状態で次の計算式を作る //"="を押した時は"="ボタンの処理が行われる var keisankekka:Decimal = 0 //firstNumber, enzanshi, secondNumber を使って計算式を作る //firstNumber+enzanshi+secondNumber if enzanshi == .addition { keisankekka = firstNumber + secondNumber } else if enzanshi == .subtraction { keisankekka = firstNumber - secondNumber } else if enzanshi == .multiplication { keisankekka = firstNumber * secondNumber } else if enzanshi == .division { keisankekka = firstNumber + secondNumber } else { } firstNumber = keisankekka secondNumber = 0 decimalPointFlag = false } @IBAction func equalbutton(_ sender: UIButton) { //"="ボタン var answer:Decimal = 0 switch enzanshi { case .addition: answer = firstNumber + secondNumber case .subtraction: answer = firstNumber - secondNumber case .multiplication: answer = firstNumber * secondNumber case .division: answer = firstNumber / secondNumber case .undifind: break } print(firstNumber, enzanshi, secondNumber, answer) result.text = "(answer)" firstNumber = answer secondNumber = 0 i2 = 0.1 } @IBAction func clearbutton(_ sender: UIButton) { //Cボタン firstNumber = 0 secondNumber = 0 i = 0.1 i2 = 0.1 enzanshi = .undifind decimalPointFlag = false result.text = "0" } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. result.text = "0" } }
期待した結果と実行した結果はどのように違うのでしょうか。
計算結果が違う、というのはご説明でわかりますが、具体的にどのようになったのか(どのような数値が表示されたのか)まで書いていただいた方が良いかと思います。
> イメージでは [1 + 2]で次に[-]演算子を打つと[3]と表示され [+]を打つと[-3]と表示されると思っています
とありますが、たとえば
[1 + 2] まで打ち込んだときに表示された内容と予想した内容
続いて[-] を打ち込んだときに表示された内容と予想した内容
続いて... みたいな感じです。
コードを読めば間違っている原因は判断できるのですが、お互い齟齬をなくしたいので、よろしくお願いします。
result.text = "\(keisankekka)"を入れると表示はできました。
>[1 + 2] まで打ち込んだときに表示された内容と予想した内容
こちらですが、[1 + 2]と打ったときは電卓の表示上[2]と表示され、次に演算子[-]を打つと[3]と表示されると想定していましたが、結果は[-1]となってしまいます
>続いて[-] を打ち込んだときに表示された内容と予想した内容
こちらについてですが
さらに[6]を打った時には電卓表示上に[6]と出るので想定通りとなりましたが、演算子[-]を打った時は、想定した内容は[-3]と表示されますが、[-7]と結果が出てしまいます・
ざっとしかコードを拝見していませんが、演算の順序にひと工夫必要な感じがしました。
逆ポーランド記法とまで行かなくても良いと思いますが、入力内容を一度スタック(のようなもの)に退避させるといいのではないかという印象を受けています。
つまり、[1 + 2 - 6 + 5] であれば、
[1] -> 数字スタック[1] 演算子スタック[] -> 表示内容 [1]
[+] -> 数字スタック[1] 演算子スタック[+](直前の演算子スタックは空なので演算しない) -> 表示内容 [1]
[2] -> 数字スタック[1, 2] 演算子スタック[+] -> 表示内容 [2]
[-] -> 数字スタック[1 , 2]->[3] 演算子スタック[-](直前の演算子スタックに従い数字スタックを計算・更新) -> 表示内容 [3]
[6] -> 数字スタック[3, 6] 演算子スタック[-]-> 表示内容 [6]
[+] -> 数字スタック[3, 6]->[-3] 演算子スタック [+] (直前の演算子に従い計算)-> 表示内容 [-3]
[5] -> 数字スタック[-3, 5] 演算子スタック[ +] -> 表示内容 [5]
[=] -> 数字スタック[-3, 5] -> [2]演算子スタック[](直前の演算子スタックに従い計算) -> 表示内容 [2]
こんな感じだといかがでしょうか。
すみません。この問題ですが解決いたしました!
お忙しいところ回答していただきありがとうございました!
回答1件
あなたの回答
tips
プレビュー