- ベストアンサー
どんな数字を入力しても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; }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
k = daritu(j, 13); scanf("%d", &j); これではdaritu関数を計算した後に値を入力しています。 それとdaritu関数の戻り値を0にしていますから 0.000000が表示されるのは当たり前かも? 計算結果を返すならば関数の戻り値を return average;で戻すべきです。
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
どんな数字を入力してもaverage = 0.000000になる直接の原因は、 printf("average = %f\n", &k); の部分にあります。 %fはdouble型の実引数を期待しているので、&kにあたる部分はfloatまたはdouble型の実引数を渡さなければなりません。ところが実際に渡しているのはfloat*というポインタです。 もっと正確にいうと、float*とdoubleではサイズが異なるので(通常4バイトと8バイトなので)、実際には渡していない実引数をprintf内部で参照しています。本来未定義であるはずの値がたまたま(double型として解釈したときに)非常に小さい値であったため、結果が0になっていると思われます。参考までに、%fではなく%eにしてみれば、非常に小さい値だということが分かると思います。 他にもいろいろおかしなところがあるので、ここだけ直しても期待通りの動作にはなりませんが、とりあえず直接の質問にだけお答えします。
お礼
ありがとうございますm(__)m 助かりました
- TAK_999
- ベストアンサー率43% (42/96)
k=daritu(j,13);で計算を行うのだと思いますが、jの値はこの時点で不定です。 おそらく0が設定されているでしょう。次のscanfと行の入れ替えが必要です。 daritu関数は戻り値を期待されていますが、return 0;となっているので、 たとえ計算が行われても、0しか戻りません。return average;となおすべき でしょう。 ここからはあまり自信がありませんが、int同士の演算結果はintになったように 記憶しています。ですから、daritu関数側のaverage=a/bの結果はintになる のでは無いでしょうか?floatに変換してから計算した方が良いと思います。
お礼
ありがとうございますm(__)m 助かりました
- mocomoco_0001
- ベストアンサー率29% (26/87)
daritu()の戻り値が常に「0」(return 0;しているから)だからです。 daritu()関数内で「average」を戻り値とする必要があります。
お礼
直りました。本当に助かります。(^0^)o ありがとうございました。m(__)m
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; }
お礼
ありがとうございますm(__)m 助かりました
お礼
ありがとうございますm(__)m 助かりました