修正日: 07/06/20
練習問題3
解答編
解答、というかサンプルです。繰り返しますが、唯一の答えというものはありません。あくまで「私のやり方」です。
アクションをつないだり、アウトレットをつないだりというのは今までのものと同じなので説明はしません。で、以下が計算のためのメソッド。
- (IBAction)calc:(id)sender
{
int number=[numberField intValue];
int price=[priceField intValue];
int result=price/number; //a
if(price%number!=0) //b
result+=1;
[resultField setIntValue:result];
}
aで一人当たりの金額を計算しています。単純な割り算です。お金の計算なので小数点以下はありません。floatではなくintを使いましょう。
bは計算結果の補正です。割り切れない場合、aでは小数点以下は切り捨てになりますので、お金を集めても何円か足りなくなってしまいます。なので%で余りを計算して、余りが出るようであれば(つまり余りが「0ではない」場合)、計算結果に1円足しています。これで足りなくなる心配は無いですね。
でもこれだけでは少し物足りないので、もう少し改良してみましょう。割り勘でお金を集めるとき、普通はいちいち一円単位まで計算しないで、大体百円単位で計算しますよね。なので計算結果が百円単位になるように修正してみてください。ただしあくまでも足りなくならないように注意。
・・・
・・・
・・・
以下に二つ、修正案を紹介します。
案A
- (IBAction)calc:(id)sender
{
int number=[numberField intValue];
int price=[priceField intValue];
int result=price/number;
if(price%number!=0)
result+=1;
if( result%100!=0 ) //a
{
result = result/100; //b
result = (result+1)*100;
}
[resultField setIntValue:result];
}
まずaですが、100で割った余りをチェックしています。割り切れたら何もする必要は無いですから。
割り切れなかったときの処理がbです。どういうことか少し考えてください。
わかりましたか?
まず100で割ります。小数点以下は切り捨てられますので、もう一度100を掛けて元に戻してあげれば100円以下の端数は切り捨てできます。ただしこれではお金が足りなくなってしまいますので、100掛けて戻す前に1足してあげます。これで100円以下切り上げの結果になりますね。
案B
こちらは、「100に足らない分を計算して計算結果に足してあげる」という考え方です。- (IBAction)calc:(id)sender
{
int number=[numberField intValue];
int price=[priceField intValue];
int result=price/number;
int fraction; //a
if(price%number!=0)
result+=1;
if( result%100!=0 )
{
fraction = result%100; //b
result += 100-fraction;
}
[resultField setIntValue:result];
}
aで一つ変数を定義しています。fractionとは「端数」の意味です。関数名や変数名に日本語を使えないので、英語を調べるのに結構苦労したりします。「amari」でも良いですけどちょっと格好悪いです。
そしてbでまず計算結果の100以下の端数を計算しています。そして100から端数を引いて足りない分を計算して、それを計算結果に追加してあげます。これでOK!
コードを見ているだけでは実際にどうなるのかわかりにくいので、実際の数値を頭に思い浮かべて、コードに沿って計算してみてください。