ページ 11

割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 17:59
by masa
c言語を大学で始めたばかりです。
割り算の答えをキーボードで入力してもらい正誤判定をしたいんですが、答えは四捨五入して小数点第2位までで入力してもらうつもりです。
a=1,b=8とするとc=0.125になり、c=0.13と入力すると正解にしたいんですが、c=0.125を入力しないと正解になりません。どうしたら正解と表示されますか?よろしくお願いします。
実際は他の機能もあり、プログラムの一部分だけ写したので、不足している部分があるかもしれません

コード:

include <stdio.h>
int main{
float a,b,c,s=0.005;
scanf("%lf %lf",&a,&b);
scanf("%lf",&c);
if((c-a/b<=s)&&(c-a/b>-1*s)){
   printf("\t正解!\n");
   }
else{
   printf("\t残念!\n");
   }
}

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 18:12
by みけCAT
masa さんが書きました:答えは四捨五入して小数点第2位までで入力してもらうつもりです。
a=1,b=8とするとc=0.125になり、c=0.13と入力すると正解にしたいんですが、c=0.125を入力しないと正解になりません。どうしたら正解と表示されますか?よろしくお願いします。
事前に四捨五入した値と比較するといいかもしれません。
浮動小数点数の比較は、誤差の影響を受けにくいように「差が十分小さければ等しい」とみなすといいでしょう。
より厳密には、数値ではなく文字列として処理するといいかもしれません。

コード:

#include <stdio.h>
#include <math.h>
int main(void){
   float a,b,c,s=0.001;
   scanf("%f %f",&a,&b);
   scanf("%f",&c);
   if(fabs(c-round(a/b*100.0f)/100.0f)<s){
      printf("\t正解!\n");
      }
   else{
      printf("\t残念!\n");
      }
   return 0;
   }

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 18:25
by masa
回答ありがとうございます。
初心者でよくわからいのですが100.0fにはどういう意味があるのでしょうか?

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 18:28
by Dixq (管理人)
100.0とだけ書くとdouble型を意味します。
100.0fと書くとfloat型になります。

なお、みけCAT君が書いてる回答の補足です。

round
http://www.c-tipsref.com/reference/math/round.html

fabs
http://www.c-tipsref.com/reference/math/fabs.html

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 18:36
by masa
doubleはfloatにしたほうがいいんでか?
それと100.0fをかけて100.0fで割るのはどうしてですか?(float)をつけることでfloat型にはできないんですか?

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 18:40
by masa
すみません
二つ目の質問はよく考えたら、わかりました。
1つ目の質問について教えてください

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 18:46
by みけCAT
しまった、roundはC99でしたか…
round関数を使わずに書きなおしました。

コード:

#include <stdio.h>
#include <math.h>
float sisyagonyu(float x){
   float i,s;
   if(x<0.0f)return -sisyagonyu(-x);
   i=floor(x);
   s=x-i;
   return s>=0.5f?i+1.0f:i;
   }
int main(void){
   float a,b,c,s=0.001;
   scanf("%f %f",&a,&b);
   scanf("%f",&c);
   if(fabs(c-sisyagonyu(a/b*100.0f)/100.0f)<s){
      printf("\t正解!\n");
      }
   else{
      printf("\t残念!\n");
      }
   return 0;
   }
masa さんが書きました:doubleはfloatにしたほうがいいんでか?
場合によります。
例えば普通の競技プログラミングでメモリが足りなくない時は、精度の高いdoubleやlong doubleを用いたほうがいいでしょう。
DXライブラリを用いるときは、doubleを用いてもfloatの精度で計算されることがあるので互換性を保つためfloatにしたほうがいいと聞いたことがあります。
今回は、最初のコードでfloatが使われていたのでfloatに統一しました。

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 19:01
by masa
みけCAT 様もう一度回答してくれてありがとうございます。
他の部分は理解できたのですが
return s>=0.5f?i+1.0f:i;
の部分がどういう意味なのかよくわかりません。
?や:の部分が特にわからないです。

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 19:07
by みけCAT
masa さんが書きました: return s>=0.5f?i+1.0f:i;
の部分がどういう意味なのかよくわかりません。
?や:の部分が特にわからないです。
これは三項演算子です。
s>=0.5fが真ならi+1.0f、偽ならiという意味です。

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 19:16
by masa
回答ありがとうございます。理解できました。
今、実行してみたところ
/tmp/cclypd6i.o: In function `sisyagonyu':
test.c:(.text+0x46): undefined reference to `floor'
collect2: ld はステータス 1 で終了しました
と表示されました。
どうしてでしょうか?

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 19:29
by みけCAT
masa さんが書きました:今、実行してみたところ
/tmp/cclypd6i.o: In function `sisyagonyu':
test.c:(.text+0x46): undefined reference to `floor'
collect2: ld はステータス 1 で終了しました
と表示されました。
どうしてでしょうか?
標準でリンクされるライブラリにfloorの実体が無かったからでしょう。
コンパイルオプションに-lmを追加してみてください。

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 19:35
by masa
言われた通り-lmを入れたらちゃんと実行できました
みけCAT 様、Dixq (管理人)様ありがとうございました

Re: 割り算の計算結果を正誤判定したい

Posted: 2015年7月25日(土) 19:36
by masa
解決を押し忘れました