電卓アプリを作っています。
今困っているのは
1.割り算で小数点以下の計算ができない。
2.3つ以上の計算が(2×3×4のような)足し算しかできない。
3.間違えて数値を入力した場合に使うバックスペース的なボタンの作り方。
です。
どれか一つでもいいのでアドバイスいただけたらありがたいです。
#import "myViewController.h"
@implementation myViewController
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
/*
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization.
}
return self;
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
startInput = YES;
currentValue = 0;
}
-(IBAction)numberButtonPressed:(id)sender
{
UIButton *b = (UIButton *)sender;
if( startInput ){
// 最初の1桁目が0なら表示しない
if( b.tag == 0 ) return;
// 新しく表示する文字列を作成
label.text = [NSString stringWithFormat:@"%d", b.tag];
startInput = NO;
} else {
// すでに表示されている文字列に連結
label.text = [NSString stringWithFormat:@"%@%d", label.text, b.tag];
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[audio play];
}
-(IBAction)equalButtonPressed:(id)sender
{
currentValue = sum;
sum = sum-sum;
// 直前に押された演算子で場合分け
if( operation == 0 ){
currentValue += [label.text intValue];
} else if( operation == 1 ){
currentValue -= [label.text intValue];
} else if( operation ==2){
currentValue *= [label.text intValue];
} else if (operation ==3){
currentValue /= [label.text intValue];
}
// 表示の更新
label.text = [NSString stringWithFormat:@"%d", currentValue];
startInput = YES;
label2.text =@"=";
NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[audio play];
}
-(IBAction)opButtonPressed:(id)sender
{ UIButton *b = (UIButton *)sender;
// 現在値の保存
if( operation == 0 ){
currentValue= [label.text intValue];
sum +=currentValue;
label.text =[NSString stringWithFormat:@"%d", sum];
}
// 演算の保存
operation = b.tag;
startInput = YES;
if( operation == 0 ){
label2.text =@"+";
}
if( operation == 1 ){
label2.text =@"-";
}
if( operation == 2 ){
label2.text =@"×";
}
if( operation == 3 ){
label2.text =@"÷";
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[audio play];
}
-(IBAction)clearButtonPressed:(id)sender
{
label.text = @"0";
startInput = YES;
label2.text =@"";
NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[audio play];
}
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations.
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc. that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
質問1に対してですが、数値を整数(int)で計算している以上、小数点以下は切り捨てられます。
小数点以下を計算するなら、浮動小数点数(float、double)で計算しなければなりません。質問2、3に対しては、それ以前にプログラム全体の見直しと、再設計が必要なため、現時点で考えても意味がないことだと思います。
まず、数値を整数でなく、浮動小数点数で処理すると決まった時点で、いくつもの処理すべき項目が出てきます。画面に表示する最大桁数と、内部で計算する際の有効桁数をどうするか?具体的に説明すると、「10÷3=3.333333……」の計算をする場合、小数点何位まで表示し、有効桁数をどうするか、ということです。有効桁数を適切に決めないと、「10÷3×3」と計算した場合に、答えが「10」にならず、「9.9999999」などとなることがあります。その場合、それでもかまわないのか、10にならなければならないのか、プログラム設計の指針を、決めておかなければなりません。
有効桁数の問題に対処するために、計算過程を記憶しておくプログラムが必要でしょう。先の例でいえば、「10÷3×3」を、「10×3÷3」と計算すれば、有効桁数に起因する誤差を、最小限に抑えることができます。計算過程を記憶するということは、質問3のUndo機能を持たせることにも通じるでしょう。
単純な計算機を作るだけでも、一筋縄ではいかないことがわかると思います。
※本題と関係なく、気になったこと:
AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
[audio play];
ボタンを押すたびに「audio」インスタンスを生成していますが、それを開放するコードが見受けられません。インスタンスは再利用されるのではなく、そのつど新しいインスタンスが生成されます。ボタンはひんぱんに押されるわけですから、「audio」インスタンスが、そのうちメモリを食いつぶしてしまうかもしれません。
iOSでは、ガベージコレクションが無効なので、インスタンス(オブジェクト)のライフ期間をつねに意識しておく必要があります。
NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
上のコードでは、「path」、「[NSBundle mainBundle]」、「url」と、3つのインスタンスを生成していますが、いずれもautoreleaseが暗黙にセットされているので、適宜開放されます。が、「init~」で始まる初期化メソッドでインスタンスを生成すると、「暗黙のautorelease」はきかないので、「release」か「autorelease」を呼ばないと、開放されません。
今回のプログラムでは、インターフェイス部に、インスタンス変数として、すべての音声のインスタンスを宣言しておき、「viewDidLoad」メソッド内で、すべての音声のインスタンスを生成し、「dealloc」メソッド内で開放してやるのが、適切であろうと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
インスタンス参照でアクセスで...
-
SQLを連続発行する時の正しい(?...
-
private static という変数の修飾
-
C# インスタンスの破棄
-
VB.NET getとsetの概念がわかり...
-
C# クラスの代入について
-
Form1上にあるTextBox1を Modul...
-
生成したインスタンスを削除す...
-
抽象クラスのインスタンス生成...
-
C#において、同じインスタンス...
-
非staticフィールドを参照でき...
-
ASPX(C#)で別ファイルで自分で...
-
インスタンスを同じ名前で作成...
-
文字列を日付に変換でParseExce...
-
VB.NET Form1からForm2を開い...
-
Systemクラスはインスタンスが...
-
整数の引数に列挙を使ったとき
-
フォームの存在をチェックする方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
SQLを連続発行する時の正しい(?...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
VB6.0で、DLLを動的に参照したい
-
String a = "a"; と String b =...
-
C#「オブジェクト参照が必要で...
-
newしないインスタンス?実体化...
-
「インスタンス」の意味をわか...
-
SetWindowsHookExで質問
-
フィールドでのnewとコンストラ...
おすすめ情報