今回は、「C言語/for文とwhile文で繰り返し処理をする方法」についての説明です。
1.初めに
ここまで、printf関数・int関数・double関数・if文など、色々な関数の使い方について解説してきましたが、これらのプログラムは順次処理(記述した順番通りに実行する)か分岐処理(条件次第で処理の順序が変わる)の何れかでした。
プログラムの処理要素は大きく分ける3つに分類され、順次処理・分岐処理ともう1つが存在します。
その残る1つの処理とは、繰り返し処理です。
順次処理と分岐処理はその名称から意味は推測できますが、繰り返し処理と言われると疑問符を浮かべる方も多いのではないでしょうかね?
繰り返し処理は、指定回数(無限でも可)だけ何らかの処理を行います。
言葉で説明してもわかりづらいので、事例を見ていきましょう。
2.for文の使い方
分岐処理を実現するのにif文とswitch文があったように、繰り返し処理にも実現できる関数が複数種類存在します。
まずは、最も一般的なfor文を使って繰り返し処理を行ってみます。
#include<stdio.h>
void main() {
int a;
for (a = 1; a <= 5; a++) {
printf(“%d\n”, a);
}
}
どんな関数なのか説明する前に、このプログラムがどのように表示されるのか見てみましょう。
このように1~5までの数字が表示されます。
これを見た時点で何となくfor文の処理ルールがわかる方もいそうですね。
まず、4行目で変数aを定義しています。
次に、for文の中身ですが、以下のような構成になっています。
for (① ; ② ; ③) {④}
① 変数の初期化をする。
② ここに入力した条件を満たしている限り、④を繰り返す。
③ 繰り返し処理を行う際に実行する処理を入力する。【a++】というのは【a = a + 1】のこと。【++a】でも同じ意味になる。また、【a- -】なら【a = a -1】になる。
④ 実行する内容を入力する。
上記の構成を眺めながら、順番に考えていきましょう。
最初に、①で変数aを1に初期化しています。
②では【a <= 5】の時という条件を付けているので、この時点では条件を満たします。
なので、④が実行されてa(1)が出力されて改行されます。
5行目にブレークポイントを設けてデバッグ処理をしてみると、プログラムの動きがわかりやすいです。
デバッグを起動し、7行目までステップオーバーをした時の状態は以下のようになります。
6行目の処理が行われ、「1」だけ出力されていますね。
この状態でもう一度ステップオーバーすると、8行目に到着した直後に5行目に戻ります。
そして、今度は③を実行した時に②を満たすかどうかを判定します。
つまり、aは「2」になり、未だ②の条件である【a <= 5】範囲内であることがわかります。
それで②の条件を満たしているなら④を実行し、また5行目に戻り、③を実行した時に②を満たすかどうかを判定し…と繰り返し同じ処理を実行するというわけです。
だから“繰り返し処理”です。
最終的に、aが「5」になるまでprintfで出力して5行目に戻った際に初めて②の条件を満たさなくなる(aが「6」になる)ので、そこで繰り返し処理が終わります。
仮に③を【a = a + 2】にすれば【1 3 5】が表示され、②を【a < 5】にすれば【1 2 3 4】が表示されます。
自分なりに値を変更して動きを確認してみると良いかと思いますよ?
for文の中にfor文を使用する
過去のif文の解説の時に、if文の中にif文を使用する入れ子(ネスト)について解説しました。
for文も、同じように入れ子にすることが可能です。
以下のようにプログラムを書いてみます。
#include<stdio.h>
void main() {
int a , b;
for (a = 1; a <= 3; a++) {
for (b = 1; b <= 3; b++) {
printf(“%d + %d = %d “, a, b, a + b);
}
printf(“\n”);
}
}
このプログラムを実行すると、以下のようになります。
まず、5行目でaが「1」に初期化されます。
aが「1」なら【a <= 3】の条件を満たしているので、6行目に進みます。
次は6行目でbが「1」に初期化されます。
bが「1」なら【b <= 3】の条件を満たしているので、7行目に進みます。
7行目で【printf(“%d + %d = %d “, a, b, a + b);】を出力したら8行目に進み、6行目に戻ります。
5行目ではありません。
6行目のfor文の繰り返し処理が行われます。
そうして【1 + 1 = 2】・【1 + 2 = 3】・【1 + 3 = 4】を出力し終えたらやっと6行目のfor文の処理を終えるので、9行目に進むことができます。
なので、ここで改行されます。
ここまでやってやっと10行目にたどり着きますので、ここで5行目に戻ります。
後は5~10行目を繰り返し処理して終了です。
どのタイミングでどこを繰り返すことになるのかをしっかり意識しましょうね。
ちなみに、二重・三重・四重といくらでもfor文でループさせることが可能です。
ただ、見てわかる通り二重の時点で若干わかりにくくなってくるので、あまり入れ子にし過ぎるのはよろしくないです。
3.while文の使い方
次はwhile文について説明します。
while文もfor文と同じ動作をさせることができるので、図1で解説したプログラムをwhile文で記述してみます。
#include<stdio.h>
void main() {
int a = 1;
while(a <= 5) {
printf(“%d\n”,a);
a++;
}
}
while文の構成は、以下のような構成になっています。
while (①) {② ; ③ ;}
①ここに入力した条件を満たしている限り、③を繰り返す。
② 実行する内容を入力する。
③ 繰り返し処理を行う際に実行する処理を入力する。【a++】というのは【a = a + 1】のこと。
for文における初期化処理がwhile文に含まれなくなり、for文における②が①、③が③、④が②の位置に移動しています。
つまり、ちょっと記述方法が変わっただけです。
[while]は[~の間]という意味なので、whileの直後の①を満たしている間は以降の②③の処理を行うという意味に取れます。
なので、個人的にはfor文よりもwhile文の方がしっくりきます。
①で条件を満たしているか判定し、②で処理を実行し、③で繰り返し処理を行った上で①に戻る…というループの順序も自然ですしね。
4.do~while文の使い方
while文で繰り返し処理を行う方法について説明しましたが、これと同じ動作をdo~while文という構成でも実行することができます。
#include<stdio.h>
void main() {
int a = 1;
do {
printf(“%d\n”,a);
a++;
} while(a <= 5);
}
これで、図6で示しプログラムと同じ処理が可能です。
見てわかる通り、元々whileの条件式があった位置にdoと記述され、whileの条件式がdoを閉じた中括弧の後ろに移動し、最後に「;」が付いただけです。
ただ、微妙な違いがあります。
for文やwhile文の場合は、条件式を満たしているか確認した後に処理を実行していました。
それに対してdo~while文は、とりあえず1回実行してから条件式を満たすのかを確認します。
プログラムの記述の順番通りに実行されるわけです。
その為、4行目の【int a = 1;】を条件式を満たさない値である【int a = 100;】にしてプログラムを実行した場合、図6のwhile文では何も表示されませんが、do~while文だと「100」と表示されます。
微妙な使い分けができそうですね。
5.無限ループ
最後に、特定の条件を満たすまで無限にループさせるプログラムについて解説します。
#include<stdio.h>
void main() {
int a;
printf(“負の数を入力するまでループします。\n”);
while (1) {
printf(“整数を入力してください。\n”);
scanf(“%d”, &a);
if (a < 0) {
printf(“あなたは解放されました。\n”);
break;
}
}
}
無限ループの鍵は、6行目です。
whileの条件式が“1”になっています。
これが無限ループを表しています。
そして、無限ループを抜けるための処理が、11行目の【break;】です。
if文の説明でも出てきた【break;】ですが、これは記述したところで処理を終わらせることを意味しています。
順番に中身を見ていきましょう。
まず、4行目で変数aを定義し、5行目で【負の数を入力するまでループします。】と表示するようにしています。
そして、6行目で無限ループに入れ、7行目で【整数を入力してください。】と表示させ、8行目で変数aをキーボード入力で指定するようにしています。
ここまでのプログラムを実行すると、以下のようになるわけですね。
次に、9行目でif文を用いて【a < 0】と条件分岐させていて、【a < 0】の場合に限り10行目と11行目が実行されます。
つまり、キーボード入力した数値が0より小さい時にのみ10行目に従って【あなたは解放されました。】と表示され、11行目に従って無限ループを終わらせます。
while文の条件式を“1”にすると無限ループに入り、【break;】と記述すればそこで処理が強制終了するという点を押さえておきましょう。
以上、「C言語/for文とwhile文で繰り返し処理をする方法」についての説明でした。