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