ページ 11

久しぶりにCの質問です。

Posted: 2007年3月19日(月) 21:01
by ダッシュ
今日から春休みに入ったのですが、この期間を利用してダイエットでもして友達をあっと言わせようとしているダッシュです。なんとなく作ってみたくなったので、BMI測定器を作ってみたのですが・・・ちょっとおかしい。

取り合えず次の2つのソースを見てください。

一つ目

#include<stdio.h>
void main(){

float a,b,c,d,e;
printf("体重を入力してください。→");
scanf("%f",&a);
b=a/165/165*10000;
c=22-b;
d=22*165*165/10000;
e=d-a;
printf("あなたのBMIは%fです。\n",b);
printf("適正BMIまで後%f。\n",c);
printf("あなたの適正体重は%fkg。適正体重まで後%fkgです。\n\n",d,e);

printf("参考:日本人の適正BMI は22\n");



二つ目

#include<stdio.h>
void main(){

float a,b,c,d,e,f;
printf("体重を入力してください。→");
scanf("%f",&a);
printf("身長を入力してください。→");
scanf("%f",&f);
b=a/f/f*10000;
c=22-b;
d=22*f*f/10000;
e=d-a;
printf("あなたのBMIは%fです。\n",b);
printf("適正BMIまで後%f。\n",c);
printf("あなたの適正体重は%fkg。適正体重まで後%fkgです。\n\n",d,e);

printf("参考:日本人の適正BMI は22\n");
}

一つ目は「自分の体重が最初から入っている」もので、二つ目は「身長と体重が未知数」となっています。
しかし、やってることは同じはずなのに、適正体重と適正体重まで~kgが少しずれてしまいます。

自分で分かってるところというか、あくまで想像なのですが、変数fの小数点以下に適当な数字が入ってしまうのではないだろうか?ということです。

原因ならびに対処方法を宜しくお願いします。

補足:たぶんご存知と思いますが、BMI=体重÷身長(m)÷身長(m)です

Re:久しぶりにCの質問です。

Posted: 2007年3月19日(月) 21:06
by 管理人
まだ最初しか見ていないのですが,
b=a/165/165*10000;
この行,float型とint型の混合による計算がされています。
何か警告がでていませんか?
値が失われている可能性があります・・
のような警告がでてるのじゃないかと思います。
int型というのは,少数を含まない値の事です。
float型というのは少数を含む値のことです。
int型と混合して計算をすると少数が失われてしまいますので
計算結果が違ってきます。
float型の変数と一緒に計算するときは,
165

165.0f
のように書きましょう。

Re:久しぶりにCの質問です。

Posted: 2007年3月19日(月) 21:09
by 管理人
ここの一番下を見てください。

http://www9.plala.or.jp/sgwr-t/c/sec13.html

何も付けずに
165.0
と書けばdouble型の意味になります。

また,実数型変数はfloat型をつかう意味があまりなく,double型をつかう方がいいので,
floatよりdoubleをつかった方がいいように思います。
doubleの方が精度も高く,処理も速いです。

Re:久しぶりにCの質問です。

Posted: 2007年3月19日(月) 21:16
by box
> b=a/165/165*10000;
> この行,float型とint型の混合による計算がされています。
> 何か警告がでていませんか?

警告は出ませんし、正しく計算します。
異なる型どうしの四則演算を行なうと、低い方の型を高い方に格上げし、
演算結果の型は高い方になります。

Re:久しぶりにCの質問です。

Posted: 2007年3月19日(月) 21:18
by box
> 一つ目
>d=22*165*165/10000;

右辺の計算をint型で行ない、結果の小数点以下を切り捨ててからdに代入しています。
そのために誤差が出ているのではないでしょうか。

Re:久しぶりにCの質問です。

Posted: 2007年3月19日(月) 21:32
by Hermit
同じ事を書いていたので、編集しました。

削除は・・・・出来ないのか・・・

Re:久しぶりにCの質問です。

Posted: 2007年3月19日(月) 21:34
by 管理人
そのようですね・・,ずっと低い方の型をわざわざあげて計算していました。
基本的なとこが全然わかってないようです。
すみません・・。

Re:久しぶりにCの質問です。

Posted: 2007年3月19日(月) 22:27
by ダッシュ
ああ、なるほど。intとfloatの違いですか。

intとfloatの違いでそうなることまでは分かったのですが、具体的にどのように直すのかが分かりません。intとfloatでは計算の仕方そのものが違うと言うことなのでしょうか?floatしか宣言してないのになぜintが出てくるのかが疑問です。

Re:久しぶりにCの質問です。

Posted: 2007年3月19日(月) 22:35
by box
> 具体的にどのように直すのかが分かりません。

> d=22*165*165/10000;

この式の右辺にある4つのint型(ここにint型があります。
何も、宣言した変数だけではありません)のうち、1つ以上に
小数点を付けてください。22. とか 22.0 のように。
4つ全部に小数点を付けるのが、形が美しいと思います。

Re:久しぶりにCの質問です。

Posted: 2007年3月19日(月) 22:54
by ダッシュ
やってみました。成功です。

>>宣言した変数だけではありません

やっと意味が分かりました。


助けていただいていつも本当に助かります。ありがとう御座いました。

Re:久しぶりにCの質問です。

Posted: 2007年3月19日(月) 23:23
by Justy
 全然本題ではないですが、

何も付けずに 165.0 と書けばdouble型の意味になります。
 これ意外と気付かずに引っかかるんですよね。
 私も fを付け忘れた為に数十倍速度が遅くなったりして何度痛い目を見たか。
 プロファイルしてはじめて気付いて、全ソース修正したなんてことも。
 くっっ、思い出すだけで涙が・・・。

Re:久しぶりにCの質問です。

Posted: 2007年3月20日(火) 01:16
by 管理人
プロになるとプログラムのチェックにものすごい苦労しそうですね^^;

あ、Justyさん、前に言ってたボムマンですが、一応配布できるような形になりました。
他トピたててありますんで、よければみてください^^