平均を求めるプログラムで答えが0.000000としか出ない原因は?

このQ&Aのポイント
  • 質問者は、平均を求めるプログラムを作成しましたが、答えが0.000000としか出ない問題に直面しています。
  • プログラムは正しくコンパイルされ、実行もできますが、出力は常に0.000000となっています。
  • 原因を特定するために、コードを確認したり、入力値や計算式に問題がないかを調べたりする方法を教えてほしいとしています。
回答を見る
  • ベストアンサー

平均を求めるプログラムを作ったのですが答えが0.0

としか出ません。 #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という答えが出ることがあります。原因を教えていただけませんでしょうか。 

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.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コンパイラの種類,バージョン)を明らかにする

ghcd1952
質問者

お礼

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

その他の回答 (4)

  • chie65535
  • ベストアンサー率43% (8521/19370)
回答No.4

>printf("%8.6lf",c); これはC99仕様のCででしか許されません。 http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html 特に、long doubleをサポートする処理系では「%Lf」で「引数はlong doubleである」と認識するので「%8.6lf」の指定で「引数はlong doubleである」として処理する可能性があります。 もし、long doubleと勘違いされた場合、何が表示されるかは未定義ですが、多くの場合、cがどんな値になっても「0.000000」しか出ないでしょう。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「調和平均」ってやつですね>#2. どういうコンパイラでどんな入力をしたときに「出てくる答えは0.000000」となるんでしょうか? # 「main の返り値を void としてるのが気に入らない」とか... はないよなぁ, いくらなんでも.

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> 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/printf-format-for-double.html

回答No.1

cを求める前に printf("a=%lf b=%lf\n", a, b); してみて。入力値が入ってますか?

ghcd1952
質問者

お礼

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

関連するQ&A

  • 書いたプログラムの間違いを教えてください

    こんにちは。 C言語を学習し始めた者です。 「三角形の3辺を入力し、その面積を出す」という課題で、下のように書き、実行しました。 しかし、面積がいつも-0.00になってしまいます。 どの部分が間違っているか教えてください。 #include <stdio.h> #include <math.h> main() { double a,b,c,s,S; s=(a+b+c)/2; S=sqrt(s*(s-a)*(s-b)*(s-c)); printf("三角形の長さを入力:"); scanf("%lf %lf %lf",&a,&b,&c); if(s>0){ printf("面積は%.2lfです。\n",S); } else{ printf("これは三角形ではありません。\n"); } }

  • プログラミング 実数 合計

    3つの実数を読み込んで合計を表示するというプログラムなんですが、プログラムをコンパイルして3つの実数を入力してくださいと表示させて実数1に1.5、実数2に0.8、実数3に1.0, 合計は3.3です表示させたいのですが #include <stdio.h> int main(void) { double n1,n2,n3; puts("3つの実数を入力してください。"); printf("実数:"); scanf("%lf", &n1); printf("実数:"); scanf("%lf", &n2); printf("実数:"); scanf("%lf", &n3); printf("合計は%5.lfです。\n",(double)(n1 + n2 + n3)); return (0); } でコンパイルしようとすると1つしか実数を入力する所が出てこなくて 数字を入れると合計は.lfですと出てきて実行できないのですが、上のソースのどこか間違ってる所があったら教えてくれませんか?

  • プログラミング 実数 合計値

    プログラミング 実数 合計値 3つの実数を読み込んで合計を表示するというプログラムのソースについてなんですが #include <stdio.h> int main(void) { double na, nb, nc; puts("3つの実数を入力してください。"); printf("実数:"); scanf("%5.lf", &na); printf("実数:"); scanf("%5.lf", &nb); printf("実数:"); scanf("%5.lf", &nc); printf("合計は%5.lfです。\n", (double)(na + nb + nc); return (0); } でコンパイルしてみたんですが、構文エラーでreturnの前の行で')'が';'の前にありません というのが出てきてコンパイルできないのですが、これはどこが間違ってるんでしょうか?

  • このプログラムみてもらえますか?

    課題は標準入力から正整数aを読み込み、aが素数であるか否か判定するプログラムを作れ、です。 #include <stdio.h> int main(void) { int a,b,c; for(;;){ printf("正整数を入力して下さい。\n"); scanf("%d",&a); c=a%b; for(b=2;b=a-1;b=b+1){ if(c==0) printf("素数でない。\n"); break; } printf("素数です。\n"); break; return(0); } } コンパイルはできますが、実行すると9が「素数です」と表示されます^^; よろしくおねがいします。

  • グローバル変数の定義について質問です。

    下記は私が作成した簡易サンプルプログラムです。 #include <stdio.h> #include <stdlib.h> #include <math.h> double a=1; double b=2; double c=3; double f(){ double y; scanf("%lf",&y) ; return y; } double g(){ double y; y=f()*a; return y; } void main(){ double y; y=g()*b*c; printf("y = \n",y) ; } このプログラムでは実行しても答えが出ません。 グローバル変数でscanfを使用して入力した値を上記double g()で使用することは不可能なのでしょうか。 また、もし可能な方法があるのでしたら教えていただければ幸いです。 よろしくお願いします。

  • ax^2+bx+c=0の解を求めたいのですが・・(初歩的です)

    タイトル通り、a、b、cを入力させて、ax^2+bx+c=0の解xを求めたいのですが、結果をどう求めればいいのか、実解・虚数解・重解の場合をどうしたらいいのか、の2点がよくわかりません。 #include<math.h> #include<stdio.h> double sqrt(double a,double b,double c) { return (b*b-4*a*c); } main(void) { double a,b,c,sqrt,ans; do{ printf("ax^2 + bx +c = 0 の解 x を求めます。\n a,b,cを入力してください。\n"); printf("a : "); scanf("%lf",&a); printf("\nb : "); scanf("%lf",&b); printf("\nc : "); scanf("%lf",&c); if(a = 0){ printf("a は0以外を入力してください。\n"); } }while(a = 0); ans = (-b+dist(a,b,c))/(2*a); printf("%lf", ans); printf("\n"); return(0); } 他にも多々ダメな部分があると思いますがご指摘・アドバイス等いただけたらと思います。よろしくお願いします。

  • 二分法のプログラムについて

    下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #define MAX 10 int n , count; double c[MAX+1]; double a,b,e; void nyuuryoku(void) { int i; printf("nの入力>"); scanf("%d",&n); if(n>MAX){printf("最大次数を超えている");exit(1);} else if(n<0){printf("nが負");exit(2);} else{for(i=0;i<=n;i++){printf("係数の値>");scanf("%lf",&c[i]);} }} double f(double x) {double y; int i; y = c[0]; for(i=1;i<=n;i++){ y=y*x+c[i];} return y; } void hani(void){ printf("aの値>");scanf("%lf",&a); printf("bの値>");scanf("%lf",&b); printf("eの値>");scanf("%lf",&e); if(e<=0){printf("eが0または負"); exit(3);} if(f(a)==0){printf("%f",f(a)); exit(4);} if(f(b)==0){printf("%f",f(b)); exit(5);} if(f(a)*f(b)>0){printf("初期値異常"); exit(6);}} double nibun(void) {double c; if(b>a){ while(b-a>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(a)*f(c)<0){b=c;} if(f(b)*f(c)<0){a=c;} } return a;} if(a>b){ while(a-b>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(b)*f(c)<0){a=c;} if(f(a)*f(c)<0){b=c;} } return a;} } void syutsuryoku(double x){ printf("x=%lf\n",x); printf("f(x)=%lf\n",f(x)); printf("繰り返し回数=%d\n",count); } int main(void){ double ans; count=0; nyuuryoku(); hani(); ans = nibun(); syutsuryoku(ans); }

  • Cプログラミング 初歩

    #include <stdio.h> int main (void){ double num; printf("実数を入力して下さい:"); scanf("%lf",&num); printf("あなたは%fと入力しましたね\n",num); return(0); } のプログラミングがコンパイル出来ません↓ printf("あなたは%fと入力しましたね\n",num); をprintf("%f\n",num);のようにすると上手くいくのですが、 どうしたらコンパイルできるか分かる人はいますか?

  • ヘロンの公式を作ったプルグラムなのですが、プログラムの間違いを教えてください。

    プログラムの間違いを教えてください ヘロンの公式を作ったプログラムなんですが・・・ #include <stdio.h> #include <math.h> void main(void) { float a,b,c,s,x; printf("三角形の三辺の長さを入れてください\n"); printf("a="); scanf("%f",&a); printf("b="); scanf("%f",&b); printf("c="); scanf("%f",&c); s=(a+b+c)/2; x= sqrt(s*(s-a)*(s-b)*(s-c)); printf("\n%f",x); }

  • プログラムがうまくいきません。教えてください。

    プログラムがうまくいきません。教えてください。 #include <stdio.h> int main(void){ int a, b, c, d, f; printf("国語="); scanf("%d", &a); printf("算数="); scanf("%d", &b); printf("理科="); scanf("%d", &c); printf("社会="); scanf("%d", &d); f = ((a>90)?1:0)+((b>90)?1:0)+((c>90)?1:0)+((d>90)?1:0); printf("\n合計[%d],平均[%.2f]\n",(a+b+c+d),((double)(a+b+c+d)/4.0)); printf("国語[%d],[%.3f%%],[%d]\n",a,((double)a/1.5),((a>90)?1:0)); printf("算数[%d],[%.3f%%],[%d]\n",b,((double)b/1.5),((b>90)?1:0)); printf("理科[%d],[%.3f%%],[%d]\n",c,((double)c/1.5),((c>90)?1:0)); printf("社会[%d],[%.3f%%],[%d]\n",d,((double)d/1.5),((d>90)?1:0)); printf("総合判定[%d],\n", ((f>=3)?1:0)); return (0); } と入力したのですが、実行結果の国語から社会までの[]部分を上下揃えたいのですが揃いません。このプログラムにどのようなことを追加すれば揃えることができますか?教えてください!

専門家に質問してみよう