• ベストアンサー

どんな数字を入力してもaverage = 0.000000になるのは何故ですか? (プログラム初心者)

どこがおかしくて計算結果がおかしくなるのか、具体的に指摘して頂けると幸いです。 #include<stdio.h> #include<stdlib.h> #include<math.h> float daritu(int a, int b){ float average; average = a / b; return 0; } main() { float k; int j; k = daritu(j, 13); scanf("%d", &j); printf("average = %f\n", &k); return 0; }

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

  • ベストアンサー
  • sccbe
  • ベストアンサー率40% (10/25)
回答No.4

k = daritu(j, 13); scanf("%d", &j); これではdaritu関数を計算した後に値を入力しています。 それとdaritu関数の戻り値を0にしていますから 0.000000が表示されるのは当たり前かも? 計算結果を返すならば関数の戻り値を return average;で戻すべきです。

noname#244609
質問者

お礼

ありがとうございますm(__)m 助かりました

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

どんな数字を入力してもaverage = 0.000000になる直接の原因は、 printf("average = %f\n", &k); の部分にあります。 %fはdouble型の実引数を期待しているので、&kにあたる部分はfloatまたはdouble型の実引数を渡さなければなりません。ところが実際に渡しているのはfloat*というポインタです。 もっと正確にいうと、float*とdoubleではサイズが異なるので(通常4バイトと8バイトなので)、実際には渡していない実引数をprintf内部で参照しています。本来未定義であるはずの値がたまたま(double型として解釈したときに)非常に小さい値であったため、結果が0になっていると思われます。参考までに、%fではなく%eにしてみれば、非常に小さい値だということが分かると思います。 他にもいろいろおかしなところがあるので、ここだけ直しても期待通りの動作にはなりませんが、とりあえず直接の質問にだけお答えします。

noname#244609
質問者

お礼

ありがとうございますm(__)m 助かりました

  • TAK_999
  • ベストアンサー率43% (42/96)
回答No.3

k=daritu(j,13);で計算を行うのだと思いますが、jの値はこの時点で不定です。 おそらく0が設定されているでしょう。次のscanfと行の入れ替えが必要です。 daritu関数は戻り値を期待されていますが、return 0;となっているので、 たとえ計算が行われても、0しか戻りません。return average;となおすべき でしょう。 ここからはあまり自信がありませんが、int同士の演算結果はintになったように 記憶しています。ですから、daritu関数側のaverage=a/bの結果はintになる のでは無いでしょうか?floatに変換してから計算した方が良いと思います。

noname#244609
質問者

お礼

ありがとうございますm(__)m 助かりました

回答No.2

daritu()の戻り値が常に「0」(return 0;しているから)だからです。 daritu()関数内で「average」を戻り値とする必要があります。

noname#244609
質問者

お礼

直りました。本当に助かります。(^0^)o ありがとうございました。m(__)m

noname#12273
noname#12273
回答No.1

main関数でscanfでjの値を取得する前に関数darituを呼んでるからでは。それとprintfの中身がおかしいです。多分。 main() { float k; int j; scanf("%d", &j);   //jに値を代入 k = daritu(j, 13);  //jをdaritu()に渡す printf("average = %f\n", k); return 0; }

noname#244609
質問者

お礼

ありがとうございますm(__)m 助かりました

関連するQ&A

専門家に質問してみよう