プロが教える店舗&オフィスのセキュリティ対策術

どこがおかしくて計算結果がおかしくなるのか、具体的に指摘して頂けると幸いです。

#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;
}

A 回答 (5件)

k = daritu(j, 13);


scanf("%d", &j);

これではdaritu関数を計算した後に値を入力しています。
それとdaritu関数の戻り値を0にしていますから
0.000000が表示されるのは当たり前かも?
計算結果を返すならば関数の戻り値を
return average;で戻すべきです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/11 16:05

どんな数字を入力してもaverage = 0.000000になる直接の原因は、



printf("average = %f\n", &k);

の部分にあります。
%fはdouble型の実引数を期待しているので、&kにあたる部分はfloatまたはdouble型の実引数を渡さなければなりません。ところが実際に渡しているのはfloat*というポインタです。
もっと正確にいうと、float*とdoubleではサイズが異なるので(通常4バイトと8バイトなので)、実際には渡していない実引数をprintf内部で参照しています。本来未定義であるはずの値がたまたま(double型として解釈したときに)非常に小さい値であったため、結果が0になっていると思われます。参考までに、%fではなく%eにしてみれば、非常に小さい値だということが分かると思います。

他にもいろいろおかしなところがあるので、ここだけ直しても期待通りの動作にはなりませんが、とりあえず直接の質問にだけお答えします。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/11 16:04

k=daritu(j,13);で計算を行うのだと思いますが、jの値はこの時点で不定です。


おそらく0が設定されているでしょう。次のscanfと行の入れ替えが必要です。

daritu関数は戻り値を期待されていますが、return 0;となっているので、
たとえ計算が行われても、0しか戻りません。return average;となおすべき
でしょう。

ここからはあまり自信がありませんが、int同士の演算結果はintになったように
記憶しています。ですから、daritu関数側のaverage=a/bの結果はintになる
のでは無いでしょうか?floatに変換してから計算した方が良いと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/11 16:05

daritu()の戻り値が常に「0」(return 0;しているから)だからです。


daritu()関数内で「average」を戻り値とする必要があります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/11 16:00

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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/11 16:06

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