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

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

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

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

Swift

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

Q&A

解決済

2回答

391閲覧

計算処理について(電卓ライクなアプリ)

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

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

Swift

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

0グッド

0クリップ

投稿2018/09/12 15:28

編集2018/09/14 14:45

git

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 @IBOutlet weak var CalcProc: UITextField! //process 6 @IBOutlet weak var CalcRslt: UILabel! //result 7 var numberOnScrren:Double = 0; 8 var previousNumber:Double = 0; 9 var performingMath = false 10 var operation = 0; 11 12 //tag 0~10 11は00入れたらあるが現状はない 13 @IBAction func tapNumber(_ sender: Any) { 14 15 // 16 CalcRslt.text! = "" 17 18 if performingMath == true 19 { 20 CalcRslt.text = String((sender as AnyObject).tag + 0) 21 numberOnScrren = Double(CalcRslt.text!)! 22 performingMath = false 23 }else 24 { 25 CalcRslt.text = CalcRslt.text! + String((sender as AnyObject).tag + 0) 26 numberOnScrren = Double(CalcRslt.text!)! 27 } 28 29 } 30 31 //tag 12~15 32 @IBAction func calcBtr(_ sender: Any) { 33 if CalcRslt.text != "" && (sender as AnyObject).tag != 11 && (sender as AnyObject).tag != 15{ 34 previousNumber = Double(CalcRslt.text!)! 35 36 if (sender as AnyObject).tag == 12 //Plus 37 { 38 CalcRslt.text = "+"; 39 } 40 if (sender as AnyObject).tag == 13 //Minus 41 { 42 CalcRslt.text = "-"; 43 } 44 if (sender as AnyObject).tag == 14 // Multiply 45 { 46 CalcRslt.text = "×"; 47 } 48 if (sender as AnyObject).tag == 15 //Divide 49 { 50 CalcRslt.text = "÷"; 51 } 52 53 operation = (sender as AnyObject).tag 54 performingMath = true 55 } 56 else if (sender as AnyObject).tag == 17 57 { 58 if operation == 12 59 { 60 CalcRslt.text = String(previousNumber + numberOnScrren) 61 } 62 else if operation == 13 63 { 64 CalcRslt.text = String(previousNumber - numberOnScrren) 65 } 66 else if operation == 14 67 { 68 CalcRslt.text = String(previousNumber * numberOnScrren) 69 } 70 else if operation == 15 71 { 72 CalcRslt.text = String(previousNumber / numberOnScrren) 73 } 74 } 75 } 76 77 //tag 16,17 78 @IBAction func deleteBtr(_ sender: Any) { 79 if (sender as AnyObject).tag == 16 80 { 81 CalcRslt.text = "0" 82 previousNumber = 0; 83 numberOnScrren = 0; 84 operation = 0; 85 86 } 87 if (sender as AnyObject).tag == 16 88 { 89 /*一文字ずつ消す 90 ex)1234の時123になる*/ 91 } 92 } 93 94 //18~21 95 @IBAction func toolBtr(_ sender: Any) { 96 } 97 98 //22,23 99 @IBAction func otherBtr(_ sender: Any) { 100 } 101 102 override func viewDidLoad() { 103 super.viewDidLoad() 104 // Do any additional setup after loading the view, typically from a nib. 105 } 106 107 override func didReceiveMemoryWarning() { 108 super.didReceiveMemoryWarning() 109 // Dispose of any resources that can be recreated. 110 } 111 112 113}

出来たところ

勉強で電卓ライクなアプリを勉強で作っています。
基本的な四則演算や計算後のクリア処理まででは出来ました。

やりたいこと

テキストフィールドで途中式を表示し、labelで合計を表示させたい。
=を使わずに合計を表示させたい。
(入力された数字を都度に計算しlabelに表示させる)

//最新コード

swift

1// 2// ViewController.swift 3// calcuator 4// 5// Created by ... on 2018/09/10. 6// Copyright © 2018年 ... All rights reserved. 7// 8 9import UIKit 10 11class ViewController: UIViewController { 12 13 @IBOutlet weak var CalcProc: UITextField! //process 14 @IBOutlet weak var CalcRslt: UILabel! //result 15 var numberOnScrren:Double = 0; 16 var previousNumber:Double = 0; 17 var performingMath = false 18 var operation = 0; 19 var isFirst = true // 最初の処理かどうか 20 21 //tag 0~10 11は00入れたらあるが現状はない 22 @IBAction func tapNumber(_ sender: Any) { 23 24 if isFirst { 25 isFirst = false 26 CalcRslt.text! = "" 27 // 一度だけ実行したい処理 28 } 29 30 if performingMath == true 31 { 32 CalcRslt.text = String((sender as AnyObject).tag + 0) 33 numberOnScrren = Double(CalcRslt.text!)! 34 // 35 CalcProc.text = String((sender as AnyObject).tag + 0) 36 numberOnScrren = Double(CalcProc.text!)! 37 performingMath = false 38 }else 39 { 40 CalcRslt.text = CalcRslt.text! + String((sender as AnyObject).tag + 0) 41 numberOnScrren = Double(CalcRslt.text!)! 42 43 CalcProc.text = CalcRslt.text! + String((sender as AnyObject).tag + 0) 44 numberOnScrren = Double(CalcProc.text!)! 45 } 46 47 } 48 49 //tag 12~15 50 @IBAction func calcBtr(_ sender: Any) { 51 if CalcRslt.text != "" && (sender as AnyObject).tag != 11 && (sender as AnyObject).tag != 17{ 52 previousNumber = Double(CalcRslt.text!)! 53 54 if (sender as AnyObject).tag == 12 //Plus 55 { 56 CalcProc.text = String(numberOnScrren) + "+"; 57 } 58 if (sender as AnyObject).tag == 13 //Minus 59 { 60 CalcProc.text = String(numberOnScrren) + "-"; 61 } 62 if (sender as AnyObject).tag == 14 // Multiply 63 { 64 CalcProc.text = String(numberOnScrren) + "×"; 65 } 66 if (sender as AnyObject).tag == 15 //Divide 67 { 68 CalcProc.text = String(numberOnScrren) + "÷"; 69 } 70 71 operation = (sender as AnyObject).tag 72 performingMath = true 73 } 74 else if (sender as AnyObject).tag != 0 || (sender as AnyObject).tag != 9 //ここで計算する処理 75 { 76 if operation == 12 77 { 78 CalcRslt.text = String(previousNumber + numberOnScrren) 79 CalcProc.text = String(previousNumber + numberOnScrren) 80 } 81 else if operation == 13 82 { 83 CalcRslt.text = String(previousNumber - numberOnScrren) 84 CalcProc.text = String(previousNumber - numberOnScrren) 85 } 86 else if operation == 14 87 { 88 CalcRslt.text = String(previousNumber * numberOnScrren) 89 CalcProc.text = String(previousNumber * numberOnScrren) 90 } 91 else if operation == 15 92 { 93 CalcRslt.text = String(previousNumber / numberOnScrren) 94 CalcProc.text = String(previousNumber / numberOnScrren) 95 } 96 } 97 } 98 99 //tag 16,17 100 @IBAction func deleteBtr(_ sender: Any) { 101 if (sender as AnyObject).tag == 17 102 { 103 CalcRslt.text = "0" 104 CalcProc.text = "0" 105 previousNumber = 0; 106 numberOnScrren = 0; 107 operation = 0; 108 109 } 110 if (sender as AnyObject).tag == 17 111 { 112 /*一文字ずつ消す 113 ex)1234の時123になる*/ 114 } 115 } 116 117 //18~21 118 @IBAction func toolBtr(_ sender: Any) { 119 } 120 121 //22,23 122 @IBAction func otherBtr(_ sender: Any) { 123 } 124 125 126 override func viewDidLoad() { 127 super.viewDidLoad() 128 // Do any additional setup after loading the view, typically from a nib. 129 } 130 131 override func didReceiveMemoryWarning() { 132 super.didReceiveMemoryWarning() 133 // Dispose of any resources that can be recreated. 134 } 135 136 137}

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

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

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

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

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

guest

回答2

0

ベストアンサー

計算式を表示する領域として ClacProc を用意しているものと想像します。
単純にタップされたら、タップした文字を append していけば表示できます。

CalcProc.text?.append(CalcRslt.text!)

イコールを使わずにリアルタイムで入力した数字を計算し、表示させたい。

何をもって計算させるかですが、
例えば、タップ後を常に計算のトリガーにするとして、
5 + 5 と入力したタイミングで計算結果に 10 と表示し、続けて、 0 を入力し、 5 + 50 と入力されたら、 55 と表示するイメージでしょうか?
おそらく、こういった具体的なイメージができていないので、どうすれば良いかわからないのだと思います。

具体的にイメージして、そこからルールを抽出し、それに従って実装すれば良いと思います。

やろうとしていることは、コンパイラや字句解析に近いと思うのでその辺りの基礎知識を学んでみて下さい。

投稿2018/09/13 06:35

編集2018/09/14 14:59
ykws

総合スコア1236

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

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

退会済みユーザー

退会済みユーザー

2018/09/14 14:54

そうですね。テキストフィールドは式全体を表示し、ラベル欄で計算結果を表示させることをイメージしています。 今回の質問の場合、 else if (sender as AnyObject).tag != 0 || (sender as AnyObject).tag != 9 //ここで計算する処理 でイコールを使わずに計算できるようにしたのですが結果として計算できませんでした。 それと途中式を表示させる部分では記号を挟むと数字が消えてしまうのが課題でして、何回入力するか事前に分かれば変数を新しく作ることにより、式全体を表示させることはできるのですがで電卓の場合、計算内容によって入力回数が変わってしまうのでそうした時にどのようにすればいいか分からないです。
ykws

2018/09/14 15:01

やろうとしていることの関連分野を追記してみました。根本的に基礎知識が不足しており、見当違いな方針になっていると感じています。
退会済みユーザー

退会済みユーザー

2018/09/14 15:09

ありがとうございます。 恐らく、私の現状の理解力では難しいので断念します。 @ykwsさん教えて頂いた分野を勉強し、また機会があれば作ってみます。
guest

0

現状の設計では式が表示されない設計になっているのですがそれを式が表示できるようにしたい。

labelなりtextFieldなり配置してそこに入力された数値を表示するだけです。

イコールを使わずにリアルタイムで入力した数字を計算し、表示させたい。

ちょっと何を言っているのかよく分かりません。

どちらの質問に関しても純正アプリの電卓のUIや挙動を観察するのが近道かと。もちろんportrait限定で。ほんと良くできていますよ。

投稿2018/09/13 04:28

xAxis

総合スコア1349

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問