プロが教えるわが家の防犯対策術!

としか出ません。
#include<stdio.h>
void main (void)
{
  double a;
double b;
  double c;
printf("Aを入力する");
scanf("%lf",&a);
printf("Bを入力する");
scanf("%lf",&b);

c=(2*a*b)/(a+b);

printf("平均値は");
printf("%8.6lf",c);
}

というプログラムを作ったのですが、プログラムはコンパイルするのですが出てくる答えは0.000000しか出ません。ほかにもよく0.0000という答えが出ることがあります。原因を教えていただけませんでしょうか。 

A 回答 (5件)

# 素で知りませんでした < 調和平均



修正するときのコツは、問題を切りわけることです。

考えられるのは
・表示だけが正しくない
・a,bが正しくない
・c=(2*a*b)/(a+b);が正しくない
・(これに書いていないところで) cの値が変わっている
くらいでしょうか?

%fは固定小数点表示で、指定した値より小さな分は表示できません。
例えば、 10の-20乗なども 0.000000 と表示されてしまいます。
→ %e(指数表示)や%g(値の大小によって、固定小数点表示と指数表示を切り替える)を使って、c==0なのか、c!=0なのかを確認する。

a,bについても同様に
printf("a=%g b=%g\n", a, b);
として、入力した値と同じか確かめる。気になるなら
printf("2*a*b=%g a+b=%g\n", 2*a*b, a+b);
とでもやって、途中経過も確認する。



あとは、次のことがあれば、こちらでも検証しやすいです。
・実際にa,bとしてどんな値を入力したのかを補足あたりに書いて、回答者側でも確認できるようにする。
・あなたの使っている環境(OS,Cコンパイラの種類,バージョン)を明らかにする
    • good
    • 0
この回答へのお礼

どうもありがとうございました。初心者でなかなか前に進みませんが、頑張ってみます。

お礼日時:2012/07/21 12:04

>printf("%8.6lf",c);



これはC99仕様のCででしか許されません。
http://www.kijineko.co.jp/tech/superstitions/pri …

特に、long doubleをサポートする処理系では「%Lf」で「引数はlong doubleである」と認識するので「%8.6lf」の指定で「引数はlong doubleである」として処理する可能性があります。

もし、long doubleと勘違いされた場合、何が表示されるかは未定義ですが、多くの場合、cがどんな値になっても「0.000000」しか出ないでしょう。
    • good
    • 0

「調和平均」ってやつですね>#2.



どういうコンパイラでどんな入力をしたときに「出てくる答えは0.000000」となるんでしょうか?

# 「main の返り値を void としてるのが気に入らない」とか... はないよなぁ, いくらなんでも.
    • good
    • 0

> c=(2*a*b)/(a+b);



aとbの平均の計算式をよく考えてください。
0しか出ない、ということは無いですが、平均になってません。
現在は、aかbのどちらか一方が0の時、c=0になります。

> printf("%8.6lf",c);

コンパイラによっては、何が起こるかわかりません。
http://www.kijineko.co.jp/tech/superstitions/pri …
    • good
    • 0

cを求める前に printf("a=%lf b=%lf\n", a, b); してみて。

入力値が入ってますか?
    • good
    • 0
この回答へのお礼

朝の忙しい時間にありがとうございます。
 a及びbはちゃんと読み取っており、表示しました。

お礼日時:2012/07/20 07:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!