「C言語練習」 1-4.c   ・前へ   ・次へ
/* 計算と表示桁数など   1-4.c */
#include <stdio.h>

main()
{
	int i,sum;	// 整数型 iとsumの宣言。
	int a,b;
	float radius=6378.140;	//地球赤道半径(Km), 1mまで入れる
	float  pi1=3.141593;
	double pi2=3.1415926535898;

/* 計算練習と表示桁数の意味について。*/
	printf("* 地球外周 * (赤道半径 6378.140 Km として)\n");

/* 円周の長さは、2πrで求まるので、*/
		printf(" π=%f で4m のずれ\n",pi1);
	printf("%lf Km\n",2*pi1*radius);
	printf("%lf Km\n",2*pi2*radius);
	printf("これでmmまで表示した事になる。ん?\n\n");
/* 外周は
40075.040551 Km
40075.036394 Km	と表示される。
 πの値に小数点以下6桁と13桁の違いがあっても、地球外周にして4mしか違いが出ない
(40000Kmに対しての4mだから、非常に小さい事が分かる)。物理量を数として扱う場合には
有効数字、有効桁を考える。無闇に細かな値を入れても意味が無い。そもそも pi1 はfloat
変数なので、これを用いて計算した結果を 6桁以上細かく表示する事には意味が無い。
試しに、%.10lf で表示すると
*/
		printf(" π=%f で%%.10lf表示\n",pi1); // 書式中に%%と重ねて書くと%を文字として表示可能
	printf("%.10lf Km\n",2*pi1*radius);
	printf("%.10lf Km\n",2*pi2*radius);
	printf("一番下の桁は、0.1μmに相当する。なんの意味があろうか。\n\n");

/* こんな値が幾ら出ても意味がない。今度は、piをもっと粗くして見る。
小数点以下4桁までにして */
	pi1=3.1416;
		printf(" π=%.4f にすると90m 強のずれ\n",pi1);
	printf("%.4f Km\n",2*pi1*radius);
	printf("%.4f Km\n",2*pi2*radius);
	printf("小数点以下の表示は 2桁で良いのだが、一応 4桁まで(10cmの桁)表示しておく。\n\n");

/* こうすると
40075.1287 Km
40075.0364 Km	となり、92m(40000Kmに対して)の差が出る(それだけしか出ない)。
1/500,000 程度の誤差だという事。πの値は floatで扱える桁数にすれば十分な事が分かる。*/

	pi1=3.14;
		printf(" π=3.14 にすると20Km程ずれる\n");
	printf("%.4f Km\n",2*pi1*radius);
	printf("%.4f Km\n\n",2*pi2*radius);

	pi1=3;
		printf(" π=3 だと\n");
	printf("%.4f Km\n",2*pi1*radius);
	printf("%.4f Km ",2*pi2*radius);

	printf("\t小学校で円周率 3.14を教えないのは問題だ\n\n"); // \tでtabの出力

/* 次は、前にやった aから bまでの総和を求める計算。今度は for loopを回っている間の
途中経過も表示させる。先ず、数値を入力する。 */

	printf("[aからbまでの総和を求める] ");
	printf("a とb を入力:");
		scanf("%d %d",&a,&b);

/* 一つのscanfで変数を幾つも取り込める。aの値を入力後 spaceで間を空け、次に bを入力する。
取り込む変数名の前に &を付けるのを忘れない事 */

/* for loop は、条件が成り立つ場合に、その後にある一つの文を実行する。
計算と表示、その他の事もやりたい等、複数の命令をこなすには、させたい命令の集まりを一文
として扱う必要がある。そこで、for (i=a;i<=b;i++) {sum+=i;printf("sum=%d\n",sum);}
の様に、loopを回る間にさせたい命令群を{ }で囲んで纏めてしまう。この{ }で囲まれた範囲を
ブロック(=block, 区画)という。
 for loop は、直後の{ }で囲まれた一区画(ひと纏まり)を一文と解釈する。

 for() 後の{sum+=i;printf("sum=%d",sum);}は、実際のprogramでは下の様に書かれる事が多い。
それは、命令の数が多い時や、中に書かれる文が長くなると、どこまでが for loopの仕事か
分かり難くなるからである。一行に書いた方が分かり易ければ、そうする。
*/
		sum=0;	// 初期化
	for (i=a;i<=b;i++) {
		sum+=i;
		printf("%d: sum=%d\n",i,sum);
	}

	printf("\n");	// 改行

	printf("* 次に、一寸変則表示 * ");
	printf("数値を文字として表示すると\n");

/* 文字型変数も memory の中では数値として納まっていたので(A=65を確認済み)、
逆に数値が文字になる筈。printf();の中で数値を%c(文字の表示に用いる)を使って表示させると
 */

	for (i=65;i<91;i++) printf("%d:%c, ",i,i);

/* 文字だけでなくcontrol codeも数値なので、文字以外に使われている数値を%cで文字表示
すると妙な事になる。逆に文字を数値表示(%d)するのは安全であり、構わない。*/

printf("\nEnd\n");
return 0;
}


(前に戻る)   ・次へ