== 配列 変数に添字を付けたもの 繰り返し while と for の二種類がある for の方が多少まとまっているかんじがする。 # 繰り返し回数が固定の場合は、同じ文を、回数文 Copy してもよい # 繰り返し回数が不定の場合が、本質的な繰り返しを利用する理由 == [例題] 10 個のデータを入力し、逆順に出力するプログラム [方針] 入力した値を一旦、配列に納め、その配列を使って結果を出力する。 -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- #include #define ASIZE 10 /* 配列のサイズ */ main() { int x[ASIZE]; /* 入力 */ for ( i = 0; i < ASIZE; i++ ) { scanf ( "%d", &x[i] ); } /* 出力 */ for ( i = ASIZE - 1; i >= 0; i = i - 1 ) { printf ( "%d ", x[i] ); } } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- [考察] 入力順に、出力するだけならば、入力して、直ぐ、出力する という方法もある。この場合は、配列は不要。 cf. -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- int x; /* 入力 & 出力 */ for ( i = 0; i < ASIZE; i++ ) { scanf ( "%d", &x ); printf ( "%d ", x ); } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- このプログラムを実行する場合には、データ ( 整数値 ) を 10 個、入力する 必要があるが、その場合、入力データの間には、空白を挟む必要がある。 for 文 for ( 初期設定; 継続条件部; 後処理部 ) { 実行本体 } N 回 +-------------------+ v | --> 初期設定 -> 継続条件部 -> 本体 -> 後処理部 +--> v | +----------------------------+ <------------ for 文 ----------------> [注] N 回繰り返す場合 初期設定 1 継続条件部 N + 1 本体 N 後処理部 N # N = 0 の場合もありうる。その場合でも、初期設定と、継続条件部は 1 度実行される。 # 初期設定は、必ず、一回実行され、それも、最初に実行される。 # 継続条件部は、本体より、一度多く実行される。 # 継続条件部は、本体より先に実行される。 # 後処理部は、本体の後に実行される。 # 後処理部の実行回数は、本体の実行回数に等しい # [考察] # 逆順に出力というのは、 # for ( i = 0; i < ASIZE; i++ ) { # printf ( "%d", x[ASIZE-(i+1)] ); # } # というアプローチもある。 == [例題] フィボナッチ数の計算 [方針] 配列にフィボナッチ数の計算を行い、それを出力する。 計算に一度、出力に、一度それぞれ for を利用する。 -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- #include #define FSIZE 10 /* 幾つ計算するか */ main() { double fib[ FSIZE ]; fib[0] = 1.0; fib[1] = 1.0; /* 計算 */ for ( i = 2; i < ASIZE; i++ ) { fib [ i ] = fib [ i - 1 ] + fib [ i - 2 ]; } /* 出力 */ for ( i = 0; i < FSIZE; i++ ) { printf ( "fib[%d] = %f\n", i, fib[i] ); } } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- == [例題] cos の値を、5 度ずつ表示する。 [方針] 度数を 0 から、5 ずつ増やしながら cos の値を出力する ( for を使う )。 cos 値の計算は、C 言語の 数学ライブラリを利用するので、 #include が必要になる。 C 言語の cos 関数は、ラジアンに変換する。 出力の時に、表の表示がずれるのがいやならば、printf で工夫する。 -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- #include #include /* 数学関数 ( cos ) を利用する場合に追加する */ /* 常に、追加でも構わないが、紛らわしいのも事実 必要な時に、必要な部分だけを include しよう */ #define STEP 5 /* 何度ずつ表示するか ? */ #define ALL 360 /* 全ての角度 */ main() { int dgree; /* 角度 (度数) */ double radian; /* 角度 (ラジアン) */ for ( dgree = 0; dgree < ALL; dgree += 5 ) { radian = dgree * ( PI / 180 ); printf ( "%3d %f\n", dgree, cos ( radian ) ); } } -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< --