/* 計算と表示桁数など 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;
}