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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2369閲覧

swiftで電卓 改良したい

earnest_gay

総合スコア615

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2016/09/16 18:04

長くなってしまいますが、電卓作りました。
ただ、現状だと、2*2のように一回の計算しかできず、いちいち=してそれから*とかしないといけない仕様になっています。

2*2*3+3のように複数回計算ができる仕様に変更したいと思い
改良したのが下記ですがどうもうまく動作しません。

とりあえず4回までは計算できるようにしたいです。
そこがクリアできればあとはなんとかなるかと、、、

変更点としては、number3とnumber4の変数を用意しました。
どうロジックを組んだら良いでしょうか?
動作も近い数字は出ているので後一押しなんです、、、
よろしくお願いします。

swift

1// 2// ViewController.swift 3// Sample003_WinePiano 4// 5// Created by MasayaGoto on 2016/09/13. 6// Copyright © 2016年 Jwebgate. All rights reserved. 7 8import UIKit 9 10class ViewController: UIViewController { 11 var resultLabel = UILabel() //計算結果表示エリアのラベル 12 let xButtonCount = 4 //1行に配置するボタンの数 13 let yButtonCount = 4 //1列に配置するボタンの数 14 15 var number1:NSDecimalNumber = 0.0 // 計算前の変数 16 var number2:NSDecimalNumber = 0.0 // 1回目の数値追加用の変数 17 var number3:NSDecimalNumber = 0.0 // 2回目の数値追加用の変数 18 var number4:NSDecimalNumber = 0.0 // 3回目の数値追加用の変数 19 var result:NSDecimalNumber = 0.0 // 計算結果の変数 20 var operatorId:String = "" // 演算子の変数 21 22 override func viewDidLoad() { 23 super.viewDidLoad() 24 25 //画面の横幅 26 let screenWidth:Double = Double(UIScreen.mainScreen().bounds.size.width) 27 //画面の縦幅 28 let screenHeight:Double = Double(UIScreen.mainScreen().bounds.size.height) 29 //ボタン間の余白(縦) & (横) 30 let buttonMargin = 10.0 31 // 計算結果表示エリアの縦幅 32 var resultArea = 0.0 33 34 // 画面全体の縦幅に応じて計算結果表示エリアの縦幅を決定 35 switch screenHeight { 36 case 480: // 画面全体の縦幅が480なら 37 resultArea = 200.0 // 計算結果表示エリアの縦幅は200 38 39 case 568: // 画面全体の縦幅が480なら 40 resultArea = 250.0 // 計算結果表示エリアの縦幅は200 41 42 case 667: // 画面全体の縦幅が480なら 43 resultArea = 300.0 // 計算結果表示エリアの縦幅は200 44 45 case 736: // 画面全体の縦幅が480なら 46 resultArea = 350.0 // 計算結果表示エリアの縦幅は200 47 48 default: 49 resultArea = 0.0 50 } 51 52 53 //計算結果ラベルのフレームを設定。 54 //左から10px,上から30pxに配置 全体の横幅から20px引いた数値が幅,計算結果フレームから30px引いた数値が縦幅 55 resultLabel.frame = CGRect(x: 10, y: 30, width: screenWidth - 20, height: resultArea - 30) 56 57 58 //計算結果ラベルの背景色を灰色にする 59 resultLabel.backgroundColor = UIColor.grayColor() 60 //計算結果ラベルのフォントと文字サイズを設定 61 resultLabel.font = UIFont(name: "Arial", size: 50) 62 //計算結果ラベルのアラインメントを右揃えに設定 63 resultLabel.textAlignment = NSTextAlignment.Right 64 //計算結果ラベルの表示行数を4行に設定 65 resultLabel.numberOfLines = 4 66 //計算結果ラベルの初期値を"0"に設定 67 resultLabel.text = "0" 68 //計算結果ラベルをViewControllerクラスのviewに設置 69 self.view.addSubview(resultLabel) 70 71 // ボタンのラベルタイトルを配列で用意 72 let buttonLabels = [ 73 "7","8","9","×", 74 "4","5","6","-", 75 "1","2","3","+", 76 "0","C","÷","=" 77 ] 78 79 //二次元配列で16個のボタンを並べる 80 //[0][0] = 7 81 //[0][1] = 8 82 //[0][2] = 9 83 //[0][3] = × 84 //[1][0] = 4 85 //[1][1] = 5 86 //[1][2] = 6 87 //[1][3] = - 88 //[2][0] = 1 89 //[2][1] = 2 90 //[2][2] = 3 91 //[2][3] = + 92 //[3][0] = 0 93 //[3][1] = C 94 //[3][2] = ÷ 95 //[3][3] = = 96 for var y = 0; y < yButtonCount; y++ { 97 for var x = 0; x < xButtonCount; x++ { 98 99 //計算機のボタンを作成 100 let button = UIButton() 101 102 // ボタンの横幅サイズ作成 103 let buttonWidth = (screenWidth - (buttonMargin * (Double(xButtonCount)+1))) / Double(xButtonCount) 104 //ボタンの縦幅サイズ作成 105 let buttonHeight = (screenHeight - resultArea - ((buttonMargin*Double(yButtonCount)+1))) / Double(yButtonCount) 106 107 //ボタンのX座標 108 let buttonPositionX = (screenWidth - buttonMargin) / Double(xButtonCount) * Double(x) + buttonMargin 109 //ボタンのY座標 110 let buttonPositionY = 111 ( screenHeight - resultArea - buttonMargin ) / Double(yButtonCount) * Double(y) + buttonMargin + resultArea 112 113 // ボタンの縦幅サイズ作成 114 button.frame = CGRect(x:buttonPositionX,y: buttonPositionY, width:buttonWidth,height:buttonHeight) 115 // ボタン背景色設定 116 button.backgroundColor = UIColor.greenColor() 117 118 //ボタンのラベルタイトルを取り出すインデックス番号 119 //1回目の内ループで0掛け後のプラスがミソ 120 let buttonNumber = y * xButtonCount + x 121 122 //ボタンのラベルタイトルを設定 123 button.setTitle(buttonLabels[buttonNumber], forState: UIControlState.Normal) 124 // ボタンタップ時のアクション設定 125 button.addTarget(self, action: "buttonTapped:", forControlEvents: UIControlEvents.TouchUpInside) 126 127 // ボタン配置 128 self.view.addSubview(button) 129 } 130 } 131 //デバッグ 132 print("縦画面サイズ\(screenHeight) 横画面サイズ\(screenWidth)") 133 } 134 135 136 137 138 //ここから裏処理 139 // ボタンがタップされた時のメソッド 140 func buttonTapped(sender:UIButton){ 141 let tappedButtonTitle:String = sender.currentTitle! 142 print("\(tappedButtonTitle)ボタンが押されました!") 143 // ボタンのタイトルで条件分岐 144 switch tappedButtonTitle { 145 146 //数字ボタンタップ時 147 case "0","1","2","3","4","5","6","7","8","9": 148 numberButtonTapped(tappedButtonTitle) 149 150 //演算子ボタンタップ時 151 case "×","-","+","÷": 152 operatorButtonTapped(tappedButtonTitle) 153 154 //結果ボタンタップ時 155 case "=": 156 equalButtonTapped(tappedButtonTitle) 157 158 //クリアボタンタップ時 159 default: 160 clearButtonTapped(tappedButtonTitle) 161 } 162 } 163 164 //数字ボタンタップ時 165 func numberButtonTapped(tappedButtonTitle:String) { 166 print("数字ボタンタップ:\(tappedButtonTitle)") 167 168 let tappedButtonNum:NSDecimalNumber = NSDecimalNumber(string: tappedButtonTitle) 169 // 入力されていた値を10倍にして1桁大きくして、その変換した数値を加算 170 number1 = number1.decimalNumberByMultiplyingBy (NSDecimalNumber(string: "10")).decimalNumberByAdding(tappedButtonNum) 171 172 //タップしたボタン(数字)を表示 173 resultLabel.text = number1.stringValue 174 } 175 176 //演算子ボタンタップ時 177 func operatorButtonTapped(tappedButtonTitle:String) { 178 print("演算子ボタンタップ:\(tappedButtonTitle)") 179 180 //ここでは押された演算子を変数に格納 181 operatorId = tappedButtonTitle 182 183 //これも同じように1回目にタップした数字を変数に格納 184 185 186 187 188 189 number2 = number1 190 191 if number2 != 0 { 192 number3 = number2 193 } 194 195 if number3 != 0 { 196 number4 = number3 197 } 198 199 //次の数字をタップする用に0に戻す 200 number1 = 0 201 } 202 203 //結果ボタンタップ時 204 func equalButtonTapped(tappedButtonTitle:String) { 205 print("等号ボタンタップ:\(tappedButtonTitle)") 206 207 //押された演算子が何だったのかによってSwitchする 208 switch operatorId { 209 210 //押された演算子が+なら足し算 211 case "+": 212 213 result = number2.decimalNumberByAdding(number1) 214 215 if number3 != 0 { 216 result = result.decimalNumberByAdding(number3) 217 } 218 219 if number4 != 0 { 220 result = result.decimalNumberByAdding(number4) 221 } 222 223 224 //押された演算子が-なら引き算 225 case "-": 226 result = number2.decimalNumberBySubtracting(number1) 227 228 //押された演算子が×なら掛け算 229 case "×": 230 result = number2.decimalNumberByMultiplyingBy(number1) 231 232 //押された演算子が÷なら割り算 233 case "÷": 234 if(number1.isEqualToNumber(0)){ 235 number1 = 0 236 resultLabel.text = "無限大" 237 return 238 } else { 239 result = number2.decimalNumberByDividingBy(number1) 240 } 241 default: 242 print("その他") 243 } 244 245 //まだ計算を続ける場合を想定してnumber1に代入 246 //次に押すボタンが演算子だとして、number1はnumber2にすぐ代入される 247 //この3つのメソッドの連動性を考えるのが重要 248 number1 = result 249 resultLabel.text = String("\(result)") 250 } 251 252 //クリアボタンタップ時 253 func clearButtonTapped(tappedButtonTitle:String) { 254 print("クリアボタンタップ:\(tappedButtonTitle)") 255 256 //全部初期化 257 number1 = 0 258 number2 = 0 259 number3 = 0 260 number4 = 0 261 result = 0 262 operatorId = "" 263 resultLabel.text = "0" 264 } 265 266 override func didReceiveMemoryWarning() { 267 super.didReceiveMemoryWarning() 268 // Dispose of any resources that can be recreated. 269 } 270 271 272}

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードは一切読んでいませんが、とりあえず仕様をまとめるところから始めてはいかがでしょうか。
実際の電卓の操作と内部構造を順番に記載して、それをコードにするだけだと思います。

投稿2016/09/21 04:59

YasuhiroMiyake

総合スコア1336

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

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

earnest_gay

2016/09/22 11:02

ロジカルな思考ができない部分ですので質問しているのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問