• 締切済み

C言語 質問です。

以下のソースで半径、円周、面積を求めるものです。 #include <stdio.h> int main(void) { double radius; double pi = 3.1415926; double circumference; double area; printf("円の半径を入力してください。\n"); scanf("%f", &radius); circumference = radius * 2 * pi; area = radius * pi; printf("半径 = %f\n", radius); printf("円周 = %f\n", circumference); printf("面積 = %f\n", area); printf("\n\n"); return 0; } 半径(radius)をint型で、scanf("%d", radius); printf("半径 = %d\n", radius); では、うまく計算出来るのですが、double型ではだめなようです。 scanfを使用しなうで、 double radius = 10;とすると%fでも計算してくれるのですが、なぜでしょうか? C言語初心者です。よろしくお願いいたします。

みんなの回答

回答No.3

scanf の書式指定文字の誤りです。 float型は %f double型は %lf なので、正しくは下のようになります。 scanf("%lf", &radius); なお、 printf の書式指定文字は float 型、 double 型ともに %f です。 C言語にはこのような数々の奇妙な仕様がありますのでお気を付け下さい。 浮動小数点型が演算されるときは通常 double 型に拡張されて処理されます。このため、 printf の引数に float 型を指定すると double 型に拡張されから呼び出されます。この仕様によって printf の書式指定文字は float 型、 double 型ともに %f と共通になります。これに対して、 scanf では、保存先の変数が float 型であれば %f を double 型であれば %lf と呼び出し側で指定する必要があります。 float 型を使うと使用するメモリサイズを節約することができますが、現在ではメモリが豊富なのであまり意味はありません。また、精度もあまり良くはありません(用途によっては十分な精度であることも多いでしょうが・・・)。

qzy00216
質問者

お礼

早速のご回答ありがとうございました。 参考書になかったような気がします。見落としているだけかもしれませんが、 大変参考になりました。 全くの初心者なんで、今後もよろしくお願いいたします。

回答No.2

scanfにdouble型を指定する場合は%lfを使う。 float f; double d; int i; scanf("%f",&f); /*double型でなくfloat型である事に注意*/ scanf("%lf",&d); /*%fでなく%lfである事に注意*/ scanf("%d",&i);

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

scanf について調べてください. まあ「C の初心者」以前の問題もあるけどとりあえず無視.

関連するQ&A