*for文のおさらい [#k5006dd6]
繰り返しの回数が決まっている繰り返しに用いられる[[for文>授業/C言語基礎/for文]]は、次のような形をしていました。
#geshi(c){{
for (初期化; 繰り返し条件; 更新処理) {
処理
}
}}
for文は、次のように実行されるものでした。
+「初期化」を行う
+「繰り返し条件」を評価する
--条件を満たしていれば、波括弧 { } の中の「処理」を行い、最後に「更新処理」を行う
--そうでなければ、for文の次の処理に移る
+2へ戻る
たとえば、1から10までの値を繰り返し出力するプログラムは、次のようになります(プログラム1)。
#geshi(c){{
int i;
for (i = 1; i <= 10; i++) {
printf("%d\n");
}
}}
*繰り返し処理のフローチャート [#wcf7aaa2]
1から10までの値を繰り返し出力するプログラムを、フローチャートで描くと、次のようになります。
#ref(./while1.png,50%)
これをC言語風にすると、次のようになります。
#ref(./while2.png,50%)
if文のところで勉強したように、大小関係を比較する関係演算の結果はint型の値であり、結果が0のときは条件を満たさない、0以外のときは条件を満たすと判定されます。
*while文 [#l6d6c1fa]
while文は、次の形をしています。
#geshi(c){{
while (繰り返し条件) {
処理
}
}}
while文は、次のように実行されます。
+「繰り返し条件」を評価する
--条件を満たしていれば、波括弧 { } の中の「処理」を行う
--そうでなければ、while文の次の処理に移る
+1へ戻る
while文を使って、1から10までの値を繰り返し出力するプログラムを作ると、次のようになります(プログラム2)。
#geshi(c){{
int i = 1;
while (i <= 10) {
printf("%d\n", i);
i++;
}
}}
このプログラムを、上のプログラム1と比べてみましょう。
繰り返し条件は同じで、カウント変数の初期化はwhile文の前に、更新処理はwhile文の波括弧 { } の中の最後にあることがわかります。
つまり、for文をwhile文に直すと、次のようになります。
#geshi(c){{
初期化;
while (繰り返し条件) {
処理
更新処理;
}
}}
**演習1 [#ya13bc4b]
プログラム1とプログラム2を作成し、実行結果を確認せよ。
*回数が決まっていない繰り返し [#yee53b8a]
for文は回数が決まっている繰り返しを行うときによく用いられますが、while文は回数が決まっていない繰り返しを行うときに用いられます。
次のようなプログラムについて考えてみましょう。
> 1, 2, 3, 4, ..., の和を求めて出力する。これを、和が100を超えるまで繰り返す。
合計を求める方法についてはfor文のところで勉強しましたが、合計が100を超えるまで繰り返すために何回繰り返せばいいのか簡単にはわかりません。
そこで、while文を用いて合計を求めるプログラムを作成し、繰り返し条件を「合計が100以下」とします。
こうすると、何回繰り返すかはわかりませんが、合計が100を超えるまで繰り返しが行われます。
while文の繰り返し条件は条件が満たされている間繰り返しますので、「合計が100を超えるまで繰り返す」という条件を「合計が100以下の間繰り返す」にしているところがポイントです。
このプログラムは、次のようになります(プログラム3)。
#geshi(c){{
int i = 1, sum = 0;
while (sum <= 100) {
sum += i;
printf("%d: %d\n", i, sum);
i++;
}
}}
これを実行すると、結果は次のようになります。
#geshi(sh){{
luna% a.out
1: 1
2: 3
3: 6
4: 10
5: 15
6: 21
7: 28
8: 36
9: 45
10: 55
11: 66
12: 78
13: 91
14: 105
}}
**演習2 [#f04f4215]
プログラム3を作成し、実行結果を確認せよ。
*break文 [#ode00ed6]
break文は、繰り返し処理を途中で中断し、while文(またはfor文)の次の処理へと進みます。
多くの場合、break文はif文と組み合わせて使います。
次のプログラムは、iの値が5のときにbreak文が実行され、while文の繰り返しが終了します(プログラム4)。
#geshi(c){{
int i = 1;
while (i <= 10) {
if (i == 5) { break; };
printf("%d\n", i);
i++;
}
}}
これを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
1
2
3
4
}}
break文と無限ループを組み合わせると、入力チェックが実現できます。
次のプログラムは、正の整数が入力されるまで繰り返し入力してもらいます(プログラム4)。
#geshi(c){{
int i;
while (1) {
printf("正の整数を入力してください: \n");
scanf("%d", &i);
if (i > 0) { break; }
}
}}
このプログラムを実行し、-1, 0, 1の順に入力すると、次のようになります。
#geshi(sh){{
luna% a.out
正の整数を入力してください:
-1
正の整数を入力してください:
0
正の整数を入力してください:
1
}}
break文は、for文の中でも同じように使えます。
**演習3 [#b3f7c5dd]
プログラム4を作成し、実行結果を確認せよ。
*continue文 [#ad0abf43]
continue文は、繰り返し処理の残りの部分を飛ばします(残りの部分を処理しないで次の繰り返し条件の判定まで進みます)。
多くの場合、continue文はif文と組み合わせて使います。
次のプログラムは、iの値が3の倍数のときはcontinue文を実行してその後の処理(printf関数)を飛ばします(プログラム5)。
#geshi(c){{
int i = 0;
while (i < 10) {
i++;
if (i % 3 == 0) { continue; }
printf("%d\n", i);
}
}}
カウント変数iの更新処理をcontinue文の後に書くと、更新処理も飛ばされてしまい無限ループになるので注意が必要です。
カウント変数 i の更新処理をcontinue文の後に書くと、更新処理も飛ばされてしまい無限ループになるので注意が必要です。
これを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
1
2
4
5
7
8
10
}}
continue文は、for文の中でも使えます(プログラム6)。
#geshi(c){{
for (i = 1; i <= 10; i++) {
if (i % 3 == 0) { continue; }
printf("%d\n", i);
}
}}
for文の中で使うと、波括弧 { } の中に含まれている処理のうち、continue文より後にある処理は飛ばされますが、繰り返しごとの最後に実行される「更新処理」は飛ばされません。
**演習4 [#ec90f591]
プログラム5とプログラム6を作成し、実行結果を確認せよ。
*正解するまで繰り返し計算ゲーム [#z14780be]
Lesson 04で作成した[[計算ゲーム>授業/C言語基礎/計算ゲーム]]を、繰り返し処理を使って、正解するまで同じ問題を出し続けるようにします。
プログラム4の入力チェックと同じように、break文と無限ループを組み合わせて正解したら繰り返し処理を中断するというプログラムも作ることができますが、ここでは、break文を使わずにwhile文だけで繰り返しを行います。
while文では、最初に繰り返し条件の判定が行われます。
そこで、最初は入力された答えが間違っていたことにして、正しい答えが入力されるまで繰り返し処理を行います(プログラム7)。
#geshi(c){{
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int i, j, a;
srand((unsigned int) time(NULL));
i = rand() % 99 + 1;
j = rand() % 99 + 1;
a = -1;
while (a != i + j) {
printf("%d + %d = \n", i, j);
scanf("%d", &a);
}
printf("正解!\n");
return 0;
}
}}
iとjの値は1から99までの数なので、このwhile文は、最初の繰り返し条件の判定では必ず条件が満たされます。
i と j の値は1から99までの数なので、このwhile文は、最初の繰り返し条件の判定では必ず条件が満たされます。
2回目以後の判定は、キーボードから入力された値によって条件が満たされるかどうかが変わり、正しい答えが入力されると、条件を満たさないのでwhile文の次の処理へと移ります。
**演習5 [#s95d3977]
プログラム7を作成し、実行結果を確認せよ。
----
*まとめ [#kc0a924d]
回数が決まっていない繰り返し処理には''while文''を使います。
while文では、''繰り返し条件''と繰り返し行う処理を指定します。
''break文''は繰り返しを中断するのに使用し、''continue文''は繰り返し行う処理の残りの部分を飛ばすのに使います。
----
*練習問題 [#u4582fa7]
練習問題は[[こちら>授業/C言語基礎/while文/練習問題]]。