授業/C言語基礎/while文 のバックアップ差分(No.6)


  • 追加された行はこの色です。
  • 削除された行はこの色です。
*for文のおさらい [#k5006dd6]

繰り返しの回数が決まっている繰り返しに用いられる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を作成し、実行結果を確認せよ。



*繰り返し条件の後置判定 [#o50dd1fe]

*回数が決まっていない繰り返し [#yee53b8a]

for文は回数が決まっている繰り返しを行うときによく用いられますが、while文は回数が決まっていない繰り返しを行うときに用いられます。

次のようなプログラムについて考えてみましょう。
 1, 2, 3, 4, ..., nの和が100を超えるのはnがいくつのときか

合計を求める方法についてはfor文のところで勉強しましたが、合計が1,000を超えるまで繰り返すために何回繰り返せばいいのか簡単にはわかりません。

そこで、while文を用いて、繰り返し条件を「合計が1,000以下」とします。
何回繰り返すかはわかりませんが、合計が1,000を超えるまで繰り返しが行われます。

このプログラムは、次のようになります(プログラム3)。
#geshi(c){{
  do {
    処理
  } while (繰り返し条件)
  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;
  do {
  while (i <= 10) {
    if (i == 5) { break; };
    printf("%d\n", i);
    i++;
  } while (i <= 10)
  }
}}

これを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
1
2
3
4
}}

break文と無限ループを組み合わせると、入力チェックが実現できます。

*回数が決まっていない繰り返し [#yee53b8a]
次のプログラムは、正の整数が入力されるまで繰り返し入力してもらいます(プログラム4)。
#geshi(c){{
  int i;
  while (1) {
    printf("正の整数を入力してください: ");
    fflush(stdout);
    scanf("%d", &i);
    if (i > 0) { break; }
  }
}}

このプログラムを実行し、-1, 0, 1の順に入力すると、次のようになります。
#geshi(sh){{
luna% a.out
正の整数を入力してください: -1
正の整数を入力してください: 0
正の整数を入力してください: 1
}}


**演習3 [#b3f7c5dd]
プログラム3とプログラム4を作成し、実行結果を確認せよ。

*break文 [#ode00ed6]





*continue文 [#ad0abf43]

continue文は、繰り返し処理の残りの部分を飛ばします。
continue文は、繰り返し処理の残りの部分を飛ばします(残りの部分を処理しないで次の繰り返し条件の判定まで進みます)。
多くの場合、continue文はif文と組み合わせて使います。

次のプログラムは、iの値が3の倍数のときはcontinue文を実行してその後の処理(printf関数)を飛ばします(プログラム5)。
#geshi(c){{
  int i = 0;
  while (i <= 9) {
    i++
    if (i % 2 > 0) { continue; }
  while (i < 10) {
    i++;
    if (i % 3 == 0) { continue; }
    printf("%d\n", i);
  }
}}
カウント変数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を作成し、実行結果を確認せよ。




*繰り返し条件の後置判定(おまけ) [#o50dd1fe]

繰り返し条件は、繰り返し行う処理の後に置くこともできます。

繰り返し条件を後に置いたフローチャートを描くと、次のようになります。
#ref(./while3.png,50%)

繰り返し条件を後に置いた繰り返し処理は、do-while文を使って書くことができます。

do-while文は、次の形をしています。
#geshi(c){{
  do {
    処理
  } while (繰り返し条件);
}}


#geshi(c){{
  int i = 1;
  do {
    printf("%d\n", i);
    i++;
  } while (i <= 10);
}}

繰り返し条件を後に置くと、do-while文の波括弧 { } の中の処理は、少なくとも1回は実行されることに注意しましょう。

繰り返し条件が前に置に置いてあるwhile文では、波括弧の中の処理を一度も行わないというプログラムも作れますが、繰り返し条件が後に置いてあるdo-while文では、波括弧の中の処理を一度も行わないというプログラムは書けません。

#geshi(c){{
  int i = 1, n = 0;
  while (i <= n) {
    printf("%d\n", i);
    i++;
  }
}}

#geshi(c){{
  int i = 1, n = 0;
  do {
    printf("%d\n", i);
    i++;
  } while (i <= n);
}}

繰り返し条件が後に置いてあるdo-while文は、どのようなものであっても繰り返し条件を工夫することによってwhile文でも書けますが、繰り返し条件が前に置いてあるwhile文の中には、do-while文で書くことができないものがあります。
また、上で説明したように、for文はwhile文でも書けます。

ですから、本当は繰り返し処理はwhile文だけいいのです。
しかし、for文はよく使われますので、実際には、for文とwhile文だけ覚えておけばいいです。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS