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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
masa

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

#1

投稿記事 by masa » 10年前

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");
   }
}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 10年前

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;
   }
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

masa

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

#3

投稿記事 by masa » 10年前

回答ありがとうございます。
初心者でよくわからいのですが100.0fにはどういう意味があるのでしょうか?

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

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

#4

投稿記事 by Dixq (管理人) » 10年前

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

masa

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

#5

投稿記事 by masa » 10年前

doubleはfloatにしたほうがいいんでか?
それと100.0fをかけて100.0fで割るのはどうしてですか?(float)をつけることでfloat型にはできないんですか?

masa

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

#6

投稿記事 by masa » 10年前

すみません
二つ目の質問はよく考えたら、わかりました。
1つ目の質問について教えてください

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#7

投稿記事 by みけCAT » 10年前

しまった、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に統一しました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

masa

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

#8

投稿記事 by masa » 10年前

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#9

投稿記事 by みけCAT » 10年前

masa さんが書きました: return s>=0.5f?i+1.0f:i;
の部分がどういう意味なのかよくわかりません。
?や:の部分が特にわからないです。
これは三項演算子です。
s>=0.5fが真ならi+1.0f、偽ならiという意味です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

masa

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

#10

投稿記事 by masa » 10年前

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

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

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

#11

投稿記事 by みけCAT » 10年前

masa さんが書きました:今、実行してみたところ
/tmp/cclypd6i.o: In function `sisyagonyu':
test.c:(.text+0x46): undefined reference to `floor'
collect2: ld はステータス 1 で終了しました
と表示されました。
どうしてでしょうか?
標準でリンクされるライブラリにfloorの実体が無かったからでしょう。
コンパイルオプションに-lmを追加してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

masa

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

#12

投稿記事 by masa » 10年前

言われた通り-lmを入れたらちゃんと実行できました
みけCAT 様、Dixq (管理人)様ありがとうございました


閉鎖

“C言語何でも質問掲示板” へ戻る