質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1765閲覧

swift 電卓 連続の計算

pokoyonoke

総合スコア5

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2020/11/11 03:53

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" } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukubaDepot

2020/11/11 05:06

期待した結果と実行した結果はどのように違うのでしょうか。 計算結果が違う、というのはご説明でわかりますが、具体的にどのようになったのか(どのような数値が表示されたのか)まで書いていただいた方が良いかと思います。 > イメージでは [1 + 2]で次に[-]演算子を打つと[3]と表示され [+]を打つと[-3]と表示されると思っています とありますが、たとえば [1 + 2] まで打ち込んだときに表示された内容と予想した内容 続いて[-] を打ち込んだときに表示された内容と予想した内容 続いて... みたいな感じです。 コードを読めば間違っている原因は判断できるのですが、お互い齟齬をなくしたいので、よろしくお願いします。
pokoyonoke

2020/11/11 05:31 編集

result.text = "\(keisankekka)"を入れると表示はできました。 >[1 + 2] まで打ち込んだときに表示された内容と予想した内容 こちらですが、[1 + 2]と打ったときは電卓の表示上[2]と表示され、次に演算子[-]を打つと[3]と表示されると想定していましたが、結果は[-1]となってしまいます >続いて[-] を打ち込んだときに表示された内容と予想した内容 こちらについてですが さらに[6]を打った時には電卓表示上に[6]と出るので想定通りとなりましたが、演算子[-]を打った時は、想定した内容は[-3]と表示されますが、[-7]と結果が出てしまいます・
TsukubaDepot

2020/11/11 05:57

ざっとしかコードを拝見していませんが、演算の順序にひと工夫必要な感じがしました。 逆ポーランド記法とまで行かなくても良いと思いますが、入力内容を一度スタック(のようなもの)に退避させるといいのではないかという印象を受けています。 つまり、[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] こんな感じだといかがでしょうか。
pokoyonoke

2020/11/11 08:13

すみません。この問題ですが解決いたしました! お忙しいところ回答していただきありがとうございました!
guest

回答1

0

自己解決

処理の流れが間違っていたのが問題でした
解決済みです

投稿2020/11/11 08:14

pokoyonoke

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問