/* 階乗計算と繰り返し命令 1-5.c */ #include <stdio.h> main() { int i; int a; double fac; /* 階乗計算では、直ぐに膨大な数値になるので、変数を doubleで指定しておく */ printf("* 階乗の計算 *\n"); printf("\n例えば\n"); /* 階乗は、前にやった 1から aまでの総和を求める計算と同じ様な事をすれば求まる。 1ずつ増えていく数値を、前の値に順に掛けてやれば良い。そこで for loopを使えば */ fac=1; // 掛け算なので、初期値は 1 for (i=1;i<=5;i++) fac=fac*i; printf("5!=%.lf\n",fac); /* facは小数部分がないdouble変数なので%.lf表示。 */ printf("\n途中経過を示すと\n"); fac=1; // 再初期化 for (i=1;i<=5;i++) { fac=fac*i; printf("%d!=%.lf\n",i,fac); } // for loop は、直後の{ }で囲まれた纏まりを一文として扱う printf("\n n の階乗を求める。forで計算:数を入力="); scanf("%d",&a); // scanf では、変数の前に &を忘れぬ事 fac=1; for (i=a;i>=1;i--) fac=fac*i; // loop を逆に回しても同じ printf("%d!=%.lf\n",a,fac); /* 計算結果が億を超える様な大きな数になると非常に読み辛くなるので、読み易くする為に指数 表示をしてみる。指数表示には%eを使う。1.325000e+05と表示された数は、1.325×10^5であり、 132500である。また、2.376000e-4と表示されれば、2.376×10^-4であり、0.0002376である。 */ printf("指数表示すると\n"); printf("%d!=%e\n",a,fac); /* ところで、繰り返し計算は for loopを使わなくても出来る。for loopは、基本的に「 1から 10まで10回 loopを回る」の様に、回数が分かっている時に良く使われるが、for loop以外にも、 ある条件が成立する間 loop を回す while(〜の間ずっと)という命令がある。 */ printf("\n n の階乗を求める。whileで計算:数を入力="); scanf("%d",&a); // scanf では、変数の前に &を忘れぬ事 fac=1; i=1; // 初期化、iも使う while (i<=a) { fac=fac*i; i++; // i=i+1; と書いても良い } printf("%d!=%.lf\n",a,fac); /* whileの後の( )中にloopを回る条件を書いている。iが入力値 a以下であれば、直後に 書かれた文を一つだけ実行する(whileも直後の{ }に囲まれた区画を一文と解釈する。forの 場合と同じ)。aが 5であれば、iは 1から始まるので条件が成り立ち、facが 1*1=1になる。 そして、iに 1を加えた値を再び iに代入して再判定。iは 2になるので、条件が成り立ち facは 1*2で2になる。以下、繰り返していき iが 5を超える( 6になる)と、loopを抜ける。 */ /* whileと似た命令に do while がある。これは、do { } while (); と書く。while()の後に;が 必要。doの後の一文を実行し(do も直後の{ }に囲まれた区画を一文と解釈)。whileで条件を 判定する。成立すれば、戻ってdo以下の{ }内の命令を実行し、再条件判定。whileとの違いは、 初めに必ず一回は do以下の一文を実行する事にある。 */ printf("\n n の階乗を求める。do whileで計算:数を入力="); scanf("%d",&a); // scanf では、変数の前に &を忘れぬ事 fac=1; i=1; // 初期化 do { fac=fac*i; i++; } while (i<=a); printf("%d!=%.lf\n",a,fac); /* whileや do whileの中で複数の文を実行させる場合、順番に気配りがいる。例えば、上の fac=fac*i; 文と i++; 文が入れ替わると、一つ上の階乗計算結果になる。まあ、理由は直ぐ 分かるが */ printf("\nこれで繰り返し命令を 3種類学んだ。\n"); printf("\nEnd\n"); return 0; }