変数型をdoubleにするとプログラムがうまく実行されない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NKN
記事: 3
登録日時: 10年前

変数型をdoubleにするとプログラムがうまく実行されない

#1

投稿記事 by NKN » 10年前

初めまして。
私は最近趣味でプログラミングを学んでいるものです。
つい昨日「苦しんで覚えるc言語」(以下苦cと略します)というc言語入門向けのサイトを利用してc言語の勉強を始めました。
変数型についてわからないことがあるので皆様のお力をお借りしたくここで質問させていただきます。
OSはwindows8.1です。
コンパイラはBorland C++で確認しております。

苦cの中の10章「入力チェック」という節で、円の半径を入力して円の面積を求めさせるプログラム

コード:

#include <stdio.h>

int main(void)
{

	int r;
	double s;

	do {
		printf("半径?:");
		scanf("%d",&r);
	} while (r < 0);
	
	s = r * r * 3.14;
	printf("面積は %f です。\n",s);
	
	return 0;
}

が紹介されています。

上のプログラムの中で、rは整数型となっています。しかし、円の半径は整数とは限りません。そこで、このプログラムを改良するべく、

コード:

#include <stdio.h>
#define pi	(3.14159)

int main(void)
{
	double r = 0, s;
 	/*rの初期値を0としたのは、後のdo-while文で警告メッセージ表示および再入力をさせるためです*/
	
 	/*input data*/
	do {
		if (r != 0) printf("半径は非負の実数\n");
		printf("半径=");
		scanf("%f",&r);
	} while (r < 0);
	
	/*calculation*/
	s = r * r * pi;
	
	/*output data*/
	printf("半径 %f の円の面積は %f \n", r, s);
	return 0;
}

としてみました。しかし、EasyIDEC上でコンパイルして実行およびBorland C++でコンパイルし実行した結果、
正負にかかわらず半径としてどのような値を入力しても、どうやら「rに0という数値が記憶されたことになってしまっている」ようでして、
r、sの両方の値として0.000000が出力されてしまいます。
これは問題です。

しかし、ここで試しにr、sの変数型をdoubleからfloatに変更したところ、意図したとおりにプログラムが動作するようになりました。
このことを踏まえて質問をさせていただきます。

上に書いたような問題を引き起こした、または解決したと考えられる、変数型doubleとfloatの違い、
もしくはプログラムの根本的な間違いについてご教授ください。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 変数型をdoubleにするとプログラムがうまく実行されない

#2

投稿記事 by みけCAT » 10年前

NKN さんが書きました:上に書いたような問題を引き起こした、または解決したと考えられる、変数型doubleとfloatの違い
メモリ上のデータのサイズや、数の表現方法が違います。
NKN さんが書きました:もしくはプログラムの根本的な間違いについてご教授ください。
scanfでdouble型のデータを読み込むときは、%fではなく%lfを使わないといけません。
ただし、printfではfloat型のデータもdouble型のデータも%fで出力できます。
単語と記号
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

NKN
記事: 3
登録日時: 10年前

Re: 変数型をdoubleにするとプログラムがうまく実行されない

#3

投稿記事 by NKN » 10年前

みけCAT 様

迅速なご回答感謝します。
あなたのおっしゃる通りで、%fを%lfに変更したところすべてがうまくいきました。
読み込む数値の型の区別がそこで行われているのですね。
また、doubleとfloatでは扱える桁数などが異なるようですね。
理解できておりませんでした。お恥ずかしい限りです。
このような質問にお答えいただきありがとうございました。

NKN
記事: 3
登録日時: 10年前

Re: 変数型をdoubleにするとプログラムがうまく実行されない

#4

投稿記事 by NKN » 10年前

度々すみません
解決!をつけ忘れましたのでここでつけさせていただきます
以後気を付けます

閉鎖

“C言語何でも質問掲示板” へ戻る