いい加減このシリーズやめてくれないかなという声も聞こえてきそうなくらいですけど、ブログ主がアプリを作るための基礎作りをしているということで許してください(;´Д`)w
計算機編も5話目となり、そろそろ佳境です。
XcodeでiPhoneアプリを作る基礎を学ぶ まとめフラグ
ハイ来ました。
フラグ処理。
死亡フラグとか言われてるアレですアレ。
=ボタンを押したときに、前に押した四則演算ボタンが+ボタンとかーボタンとかを覚えておけるようにフラグ処理を行う。
この辺の記述が正しいのか、プログラミングど素人の自分にはさっぱりわからない。
うーむ。不安だ。
四則演算に数字を割り当て
足し算、引き算、かけ算、割り算に数字を割り当てることにした。
まず、calcFlugというプロパティ(インスタンス変数)を作る。
+ボタンを押したら変数calcFlugに1を代入。
ーボタンは2、×ボタンは3、÷ボタンは4を代入する。
calcFlugの数字によって足し算や引き算を行うようにすればいいんじゃないか?と考えた。
0〜3でもいいのかなと思ったけど、変数には最初は0が入っているので、0は何もボタンを押していませんよ、ということにした。
0に足し算を割り当てると、何も押してない状態が足し算になっちゃって変だし。
とりあえずコードを書いてみた。
– (IBAction)additionButton:(id)sender {
self.subtotal += self.countNumber;
self.countNumber = 0;
self.calcFlug = 1;
}
+ボタンが押されたら、calcフラグに1を代入する。
これで=ボタンが押されたとき、この数字によってどの四則演算をするか判断させることに。
他の四則演算ボタンも作成。
以下のようになる。
/* 足し算 */
– (IBAction)additionButton:(id)sender {
self.subtotal += self.countNumber;
self.countNumber = 0;
self.calcFlug = 1;
}
/* 引き算 */
– (IBAction)subtractionButton:(id)sender {
self.subtotal -= self.countNumber;
self.countNumber = 0;
self.calcFlug = 2;
}
/* かけ算 */
– (IBAction)multiplicationButton:(id)sender {
self.subtotal *= self.countNumber;
self.countNumber = 0;
self.calcFlug = 3;
}
/* 割り算 */
– (IBAction)divisionButton:(id)sender {
self.subtotal /= self.countNumber;
self.countNumber = 0;
self.calcFlug = 4;
}
これで各四則演算ボタンに各機能が割り当てられた。
=ボタン
四則演算に1〜4までの数値が割り当てられたので、=ボタン1つでも四則演算が処理が可能になる。
=ボタンを押したとき、calcFlugの中に格納されている数字を確認してどの四則演算を行えば良いか判断する。
さて、このときに書くコードなんだけども、if文を使って書くと
『calcFlugの中が1の場合、足し算を行い、そうじゃなかったら、もしclucFlugの中が2の場合、引き算を行い・・・』
という面倒くさい書き方をしなければならなくなる。
それでも動くけど、100個くらいFlugの数値があったらその文を書くのが非常に面倒くさいしバグの温床にもなる。
switch
そういう時に使うのがswitch文。
中の数字が4の場合、その処理を行う、というような書き方が出来る。
文章では説明しにくいから実際見てみよう。
switch (calcFlug) {
case 1: //足し算
self.subtotal += self.countNumber;
break;
case 2: //引き算
self.subtotal -= self.countNumber;
break;
case 3: //かけ算
self.subtotal *= self.countNumber;
break;
case 4: //割り算
self.subtotal /= self.countNumber;
break;
default:
break;
}
calcFlugの数字が2(case 2:)の場合は引き算を行い、処理を抜ける(break;)。
というように、該当するものだけを処理してさっさと処理を抜ける便利なシロモノ。
breakがないとそのまま下に記述されている処理が流れるので忘れずに記述しよう。
コードはなるべく共有する
前回も書いたけど、似たような処理を行う場合、なるべくコードを共有した方がバグ取りなどの管理も楽。
よくよく見たら、四則演算ボタンを押したときの四則演算処理と、=ボタンを押したときの四則演算処理が似ているのでまとめてしまう。
/* 四則演算ボタン */
– (IBAction)additionButton:(id)sender {
[self calc];
self.calcFlug = 1;
}
– (IBAction)subtractionButton:(id)sender {
[self calc];
self.calcFlug = 2;
}
– (IBAction)multiplicationButton:(id)sender {
[self calc];
self.calcFlug = 3;
}
– (IBAction)divisionButton:(id)sender {
[self calc];
self.calcFlug = 4;
}
/* イコールボタン */
– (IBAction)answerButton:(id)sender {
[self calc];
self.calcFlug = 0;
self.subtotal = 0;
}
/* 計算処理 */
– (void)calc{
switch (calcFlug) {
case 1: //足し算
self.subtotal += self.countNumber;
break;
case 2: //引き算
self.subtotal -= self.countNumber;
break;
case 3: //かけ算
self.subtotal *= self.countNumber;
break;
case 4: //割り算
self.subtotal /= self.countNumber;
break;
default:
break;
}
self.countNumber = self.subtotal;
[self labelOutput];
self.countNumber = 0;
}
計算処理は別にcalcという処理を作り、ボタンが押されたときにそれを呼び出すというように変更。(赤文字の部分)
1+4ー2という計算を行った場合、1+4を押したときまでは何も計算されないが、+ボタンを押したときにcalcFlugに1(足し算用フラグ)が代入される。
ーボタンを押したときにcalcFlugを確認し、足し算フラグの1が入っているのを確認して1+4が計算される。
そしてsubtotalに1+4の計算結果5が代入され、calcFlugに2(引き算用フラグ)が代入される。
計算小計がラベルに表示された後、countNumberの中身はクリアされる。
というように処理を行うようにコードを書いてみたが、ド素人プログラマにはこれがいいソースコードかどうかは不明。
とりあえずちゃんと動いてる。
クリアボタンを作成
クリアボタンを押すと計算結果がすべてクリアされるCボタンを作成。
– (IBAction)clearButton:(id)sender {
self.subtotal =0;
self.countNumber = 0;
self.calcFlug =0;
self.buttonNumber = 0;
[self labelOutput];
}
80%ほど完成
テストしてみたら、四則演算は問題なくできた。
だけど、小数点表示やマイナス表示が出来ない。
う、うーん。
変数の型がおかしいんだろうか。
ちょいと調べてみよう。
もしかしたら最初のほうのが原因かもしれません。
>NSInteger num1 = 1;
引用ですがIntegerは英語の整数の意味。
プログラミングの勉強をした時も
整数はint型だったけど、小数は型が違ったような気がします。
もし違ったらごめんなさい(T_T)
変数の型が小数点扱えない型なんですよね。
floatを使えばいけると思うんですけど、
変数の型がNSIntegerとintって何が違うのかようわからなくて(;´Д`)
不可思議ですw
俺もあんまり詳しくはわかりませんが、小数のNSIntegerにあたるのが
CGFloatだと、本に書いてますよw
時間があったらダメ元でお試しを(^_^;)
CGFloatとfloatの違いってなんなのかがよく解らなくて(;´Д`)
とりあえず動けばいいやって感じでやってみますw
https://developer.apple.com/library/ios/#documentation/GraphicsImaging/Reference/CGGeometry/Reference/reference.html#//apple_ref/doc/uid/TP30000955-CH2g-CJBBHACB
32bitだとfloatで64bitだとdoubleとして扱います。
今のiOSで使用しているARMアーキテクチャは32bitなので
floatと同じということになります。
参考までに。
おおお、ありがとうございますヽ(´ー`)ノ
勝手に判断してくれるなら便利ですね。
ちょっと実験してみます。
管理人さん
こんにちわ。
このブログのおかげでとっかかりのiPhone電卓が
とりあえず動かせるようになりました。
とても参考になりました!
それはそれは。
お役に立てて何よりです。
この記事を書いた当時はプログラミング自体ほとんど理解してない状態だったので、
今読むと恥ずかしい限りです。