みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語、円周率の値が0.000000?

いつも大変お世話になりありがとうございます。

下記のコードを実行したところ、円周率の値が0.000000になりました。

どうしてでしょうか?

アドバイスの程宜しくお願い申し上げます。


#include <stdio.h>

int main(void)
{
double pi;

printf("円周率の値はいくつですか?\n");
scanf("%1f", &pi);

printf("円周率の値は%fです。\n", pi);

return 0;
}

C:\MinGW>Sample9
円周率の値はいくつですか?
3.14
円周率の値は0.000000です。

投稿日時 - 2018-03-22 15:06:31

QNo.9480565

困ってます

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

> scanf("%1f", &pi);

ここ↑が間違い

%1f じゃなくて、 %lf

エル・エフです。

投稿日時 - 2018-03-22 15:17:52

お礼

ご回答誠に有難うございます。

C言語の理屈を掴んでないから

このようなミスを犯します。

ゆっくりとじっくりと、学習していきます。

投稿日時 - 2018-03-23 00:05:44

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

直接の内容の回答は他の回答者がされていますので別の視点からの回答をします。

>アドバイスの程宜しくお願い申し上げます。

あなたのコンパイルできないとや実行できないといった質問のほとんどの原因は、あなたのソースコードの書き間違いや手順の間違いです。
ですので質問をする前に書き間違えていないか、手順は間違えていないかをしっかり確認し直してください。

投稿日時 - 2018-03-22 20:17:27

お礼

ご回答誠に有難うございます。

投稿日時 - 2018-03-22 23:57:45

ANo.4

No.3の回答者へ

printfのように、引数の型が不定な関数では、floatはdoubleに変換されてから関数の引数となります。
従って、printfでは、%f も %lf も同じ扱いですので、この質問の場合、scanfだけ直せば良いのですよ。

投稿日時 - 2018-03-22 15:40:07

お礼

ご回答誠に有難うございます。

投稿日時 - 2018-03-23 00:01:09

ANo.3

>どうしてでしょうか?

piが倍精度の変数なのに、scanf、printfに単精度を指定しているから。

//単精度バージョン
#include <stdio.h>
int main(void)
{
float pi;

printf("円周率の値はいくつですか?\n");
scanf("%f", &pi);

printf("円周率の値は%fです。\n", pi);

return 0;
}

//倍精度バージョン
#include <stdio.h>
int main(void)
{
double pi;

printf("円周率の値はいくつですか?\n");
scanf("%lf", &pi);

printf("円周率の値は%lfです。\n", pi);

return 0;
}

それと、scanfに「%1f」と指定すると「1桁しか読み込まない」ので「3.14」と入力しても「3」しか入力しません。

なので「何桁入力するか判らない場合」には「%f」や「%lf」など、フィールド幅を指定してはいけません。

投稿日時 - 2018-03-22 15:29:37

お礼

ご回答誠に有難うございます。

でも色々と難しいです。

投稿日時 - 2018-03-23 00:00:16

ANo.2

scanf("%1f", &pi);

scanf("%lf", &pi);
に書き直してください。

投稿日時 - 2018-03-22 15:18:44

お礼

ご回答誠に有難うございます。

投稿日時 - 2018-03-23 00:02:08