今日は以下の内容で演習を行います. 前回に引き続き重要な内容なので,集中して取り組んでください.
コンピューターは繰り返し処理が得意です.人間のように飽きてしまうことなく、黙々と処理を繰り返してくれます.
例えば、画面に Hello! を10回表示したい場合、これまでの知識では次のプログラムとなります.
- - - - - - - - - - - - - - - -
#include <stdio.h>
int main()
{
printf("Hello!\n");
printf("Hello!\n");
printf("Hello!\n");
printf("Hello!\n");
printf("Hello!\n");
printf("Hello!\n");
printf("Hello!\n");
printf("Hello!\n");
printf("Hello!\n");
printf("Hello!\n");
}
- - - - - - - - - - - - - - - -
10回程度であれば、これでも良いかも知れませんが、100回表示せよとなるとこれではどうしようもありません(根気が必要です).そこで、繰り返し文が登場します.
繰り返し文には for 文と while 文があります.まずは for 文を使ったプログラムを見て見ましょう.繰り返し文を使うと、先のプログラムは次のようになります.ファイル名を for-1.c として打ち込み、コンパイルし実行してください.
- - - - - - - - - - - - - - - -
#include <stdio.h>
int main()
{
int i;
for (i = 1; i
<= 10; i++)
{
printf("Hello!\n");
}
}
- - - - - - - - - - - - - - - -
上のプログラムで、繰り返し文と呼ばれるのは
for (i = 1; i
<= 10; i++)
{
printf("Hello!\n");
}
の部分です.このように書くことで { } で囲まれたブロック文が10回繰り返され、先のプログラムと同様の結果が得られます.
途中 i++ というものがありますが、これは i = i + 1 と同様であると思ってください.i = i + 1 と書く場合、= が代入をあらわすことを思い出せば、左辺の i に i + 1 の結果を代入すると読め納得できます.(等号だと勘違いすると変なことになります.)
for 文の括弧の中にはセミコロン ; で区切られた3つの式があります.通常、for 文の中にあらわれる変数は整数型です(実数型の場合もあります).
結果、この for (i = 1; i <= 10; i++) は
「はじめに i を 1 とし、i が 10 以下である間ブロック文を繰り返し、繰り返しの度に i を1 ずつふやせ.」
と読むことができます.繰り返しが少ない例について、実際どういう処理が行われているかを下に示します。
例えば、1〜100までの間の数を表示するには次のようなプログラムになります.
- - - - - - - - - - - - - - - -
#include <stdio.h>
int main()
{
int i;
for (i = 1; i
<= 100; i++)
{
printf("%d\n",
i);
}
}
- - - - - - - - - - - - - - - -
また、2〜100までの間の偶数を表示するには次のようなプログラムになります.
- - - - - - - - - - - - - - - -
#include <stdio.h>
int main()
{
int i;
for (i = 2; i
<= 100; i = i + 2)
{
printf("%d\n",
i);
}
}
- - - - - - - - - - - - - - - -
ここでは、初期値を i = 2 とし、毎回の i の増やし方は i = i + 2 と2つずつ増やしています.また、処理は i <= 100 が満たされている間繰り返されますから、2〜100までの間の偶数が表示されます.
プログラムは正しく動作し、正しく停止することが重要ですが、停止しないプログラムを書くのは大変簡単です.停止しないプログラムはたいていの場合、プログラミングミスが原因です.例えば、次のプログラムは停止しません.for-2.c として打ち込み実行してみてください.
- - - - - - - - - - - - - - - -
#include <stdio.h>
int main()
{
int i;
for (i = 1; i
>= 1; i++)
{
printf("Hello!\n");
}
}
- - - - - - - - - - - - - - - -
条件式 i >= 1 が真でありつづけるため停止しないわけです.(後の述べる扱える数値の大きさを超えるとおかしなことになるので、そこで停止する可能性はありますが・・.)
今後、色々なプログラムを作ってもらいますが、何らかのプログラミングミスで停止しないプログラムになっていて、それを実行してしまった場合は、
Ctrl + c (Ctrl キーを押しながら c のキーを押す)
によって強制的に終了させることができます.覚えておいてください.
また、エラーのあるプログラムによっては core というファイル名のファイルを作成してしまう場合があります.このファイルは、当面不要なので、消してしまいましょう(ファイルサイズが大きいので).以前、0 での割り算を行うプログラムを実行した人は、多分この core ファイルができているはずです.
次のサンプルプログラムは1〜5までの和と積を計算し表示します.ファイル名を for-3.c として打ち込み実行してください.
- - - - - - - - - - - - - - - -
#include <stdio.h>
int main()
{
/* 変数の宣言 */
int i, wa, seki;
/* 変数の初期化(下の説明参照) */
wa = 0;
seki = 1;
/* 繰り返し文:i が 1 から 5 になるまで繰り返し */
for (i = 1; i
<= 5; i++)
{
/* wa の計算:(古い)wa に i を加えた値を, wa に代入 */
wa = wa + i;
/* seki の計算:(古い)seki に i 掛けた値を, seki に代入 */
seki = seki * i;
}
/* 結果を表示 */
printf("和=%d\n", wa);
printf("積=%d\n", seki);
}
- - - - - - - - - - - - - - - -
このプログラムは大変短く簡単ですが、実はこのプログラムは数値計算プログラムの基本形と呼べるものです.流れは、
となっています.このプログラムをよく見て、これまでの内容を疑問なく理解できているか確認してください.(よく分からない人は必ず質問すること.)
変数は利用する前に必ず初期化(適切な値の代入)を行って下さい.変数は用意した直後の内容は不定です.つまり、なんらかの値を代入する前にその変数の保持している値が 0 である保証はありません.例えば、先の和と積を求めるプログラムで wa =0, seki = 1 を忘れると思ってもいない結果になる可能性があります.i に関しては for 文の中でまず i = 1 と初期化されるのでこの場合問題ありません.
また,先の i = i++ 同様, wa = wa + i, seki = seki * i と書く場合、= が代入をあらわすことを思い出せば、左辺の wa (seki) に wa + i (seki * i) の結果を代入すると読め納得できます.(等号だと勘違いすると変なことになります.)
for-3.c を改良して, 整数 n を入力すると 1 〜 n までの和と積を表示するプログラムを作成せよ.(注意:あまり大きな n を入力すると、特に積の値がコンピューターで扱える範囲を超えてしまうので、正確な値がでてこなくなります. それほど大きくない n で試してください.)
実数 a, 自然数 n を入力すると an を計算し表示するプログラムを作成せよ. (注意:あまり大きな n を入力すると、特に積の値がコンピューターで扱える範囲を超えてしまうので、正確な値がでてこなくなります. それほど大きくない n で試してください.)
実数 a, 整数 n を入力すると a + a2 + a3 + ... + an を計算し表示するプログラムを作成せよ.
自然数 n を入力すると n 以下の 3 の倍数と 7 の倍数を表示するプログラムを作成せよ.(for 文と if 文を使う. )
自然数 n を入力すると n が素数がどうか判定するプログラムを作成せよ.