質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

2810閲覧

C言語での円面積を求める計算結果が違うのでどこが違うのか教えてほしい

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/06/06 11:22

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
質問させていただきます。
C言語の練習で自分で半径を入力して円面積を求めるプログラムを作りたいです。

発生している問題・エラーメッセージ

計算結果が間違って出てしまいます。 例 半径を5.2と入力    結果:円面積は26914882383655780166371598001622524200892349219827507197748515283314282573677855629794056961097483154940535027676180450902016.000000です と出てしまいます。 一応このソースコードは 問題は見つかりませんでした とでて入力画面までは表示されました。

該当のソースコード

C言語

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { double r, s, pi = 3.14159; printf("半径を入力してください:"); scanf("%1f", &r); s = pi * r * r; printf("円面積は%fです\n", s); return 0; }

試したこと

式が違うのかと思い半径に0を入れても円面積は26914875184016273951273581733934265722636000718392629061689252907985372049791848107121281283216742128545398449148669751984128.000000です
となり掛け算しか使ってないのに0ではない答えが出ました。

補足情報(FW/ツールのバージョンなど)

visual studio expressを使っています。
scanfが非推奨となっていたので一番上に#define _CRT_SECURE_NO_WARNINGSを定義して使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/06/06 11:30

結果と一緒にrの値も出してみよう
YT0014

2020/06/06 17:11

C#タグは不要ではないでしょうか?
guest

回答3

0

ベストアンサー

よく間違えるのですがscanf関数ではdouble型のフォーマットに%fではなく%lf(パーセント・エル・エフ)を指定します。

[ご指摘を受けての修正]
printf関数ではdouble型のフォーマットは%fが正しいです(%lfでもたいていの環境では動作します)。

※詳細についてはprintf, scanfのmanページをご覧ください。ターミナルでman printfと入力する他にも「printf man」とサイト検索することでも参照できますし、日本語版もあります。

投稿2020/06/06 11:38

編集2020/06/07 02:51
anndonut

総合スコア667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/06 11:58

ありがとうございます。教科書には1fと書いてあったんですがlfなんですね 無事動きました。
PingHermit

2020/06/06 12:01

二つとも lf にした方がいいとか書いている馬鹿がいますが、 scanf の方は、書き込み領域の大きさが違うので、 "%lf" と "%f" を書き分ける必要がありますが printf の方は、浮動小数点数を引数に渡すときは、 double に拡張して渡すので、"%f" でかまいません。 ただ、同じような仕様を読まないバカが多いので、 printf で浮動小数点の表示を "%lf でも表示できるように、 仕様が変更されたので、最近は "%f" でも "%lf" でも 表示できるようになりました。 もともと、C言語とか、C++言語とか、そんな馬鹿が扱うような言語ではないので、 この辺り間違って回答するようなバカな人は、C言語から去ってほしいものです。 初心者を、惑わすだけです。
anndonut

2020/06/06 12:10

ごめんなさい。私はprintfとscanfのフォーマットが違うということを知りませんでした。むしろそういうことを知っている人はあまりいないのではないですか?あまり致命的な誤りでもない限りバカと罵るのはよろしくないと思いますよ。私も一応回答するときは調べて、テストコードも書いて回答しています。
anndonut

2020/06/06 23:28

PingHermitさんの主張は正しいですし、C/C++ユーザーの中には仕様を隅から隅まで読んでいる人達も一定数いるのですが、そういう人達のことをLanguage Lawyer(プログラム言語法律家)と言って嫌煙している人達もいます。Cの迷信集というサイトがあるのでご参考までにお読みいただければと思いますが、どうでもいい内容なのですぐ忘れると思います。そういうのを忘れないということは国名と都道府県などの地理が得意で人からされたことをずっと覚えているようなタイプなのでしょうね(邪推)。printfのmanにも%lfがdoubleの書式とは書いてなかったのでそこは猛省しなければと思います。 http://www.kijineko.co.jp/tech/superstitions
pepperleaf

2020/06/07 00:45

> 教科書には1fと書いて もしかして、それは見た目の問題では? 小文字の"l"は紛らわしいです。(大文字の "I"もですが、、)
Zuishin

2020/06/07 01:44

嫌煙というのはよくわかりませんが、C は自分で隅々まで気を付けてプログラミングする必要があるので、未定義動作についてはことさら細かい知識が必要になることがあります。printf で %lf が使われた場合、C99 に対応していないコンパイラではプログラマーをバカと罵っても許されるほどです。つまり、嫌煙している方が間違っています。
anndonut

2020/06/07 01:50

Zuishinさんの言いたいことは分からなくはないですけど2020年ですよ?もうC90でコンパイルしている人間は5%いないですよ。gccで--std=c89にしても正しく動作しますし。
Zuishin

2020/06/07 02:06 編集

未定義動作は、正しく(プログラマーの考えをエスパーして)動作しても問題ないし、プログラマーの鼻から悪魔を出しても問題ありません。質問のコードは C90 よりもっと古い書き方に見えます。%f と書いているのをわざわざ %lf に書き直させるメリットも感じられません。 Visual Studio が C99 に対応したのは 2013 からで、教育現場ではコンパイラのバージョンアップが進んでいないこともよくあります。
raccy

2020/06/07 02:00

> 教科書には1fと書いてあった 正直なところ、1とlとIが区別できないようなフォントを採用しているプログラミング関係の本は総じて、レベルが低い、一部が間違っている、注意すべき事が未記載、という傾向があります。その本を捨てることをお勧めします。
anndonut

2020/06/07 02:22

教育現場では古い環境が…それは多分にあり得ますね。初学者を露頭に迷わせるわけにはいかない…回答を修正させて頂きます。
anndonut

2020/06/07 02:44

PingHermitさん、Zuishinさん、ご指摘ありがとうございます。
guest

0

普通、double を読み込むときは、
"%lf" です、"%1f" だと、float の領域にしかデーターを格納しません。

投稿2020/06/06 11:27

PingHermit

総合スコア478

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/06 11:59

ありがとうございます。 無事動きました。
guest

0

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

scanf("%lf", &r);

では?

こういう場合は、入力値の確認を行うと確実です。

投稿2020/06/06 11:28

pepperleaf

総合スコア6385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/06/06 11:59

ありがとうございます。 無事動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問