第2章19 while文で繰り返し処理を作る@イチからゲーム作りで覚えるC言語

While ループでリンゴとチーズ食べ続け

While ループでリンゴとチーズ食べ続け

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章20 do~while文で繰り返し処理を作る
NEXT : 2章20 do~while文で繰り返し処理を作る
2章18 明示的な型変換(型キャスト)を知る : PREV

この記事でやること

前回はプロジェクト「0145_cast」を新しく作り、型キャストについてお話ししました。
今回は、新しくプロジェクト「0150_while」を作り、繰り返し処理を行うwhile文についてお話します。この書き方を知っていることで、特定の処理をループ(繰り返し)させることで同じ処理を何度も書く必要がなくなります。

なお、繰り返し処理はC言語で幾つかあります。下の順番でお話ししたいと思います。

  1. while ( 繰り返す条件 ) {… 繰り返す内容 …} ←ココのお話
  2. do { … 繰り返す内容 … } while ( 繰り返す条件 )
  3. for ( 最初の処理 ; 繰り返し条件 ; 繰り返し終了の処理 ) {…繰り返す内容… }
  4. 繰り返し処理の多重構造と break、continue などのジャンプ文
この記事はゆる~くC言語でコンソールゲームを作りながらプログラミングを学ぶための連載記事です。シリーズものですので記事の一覧はこちらを参照してくださいね。

繰り返し処理を行うプログラム

繰り返し処理をくみこんだソースコードを実際にプログラムを動かして結果を見てみましょう。

#include <stdio.h>
int main() {
 int manpuku = 10;
 char namae[] = "ぷらんく";
 char food1[] = "リンゴ";
 char food2[] = "チーズ";
 printf("%s の満腹感は %d です。\n", namae , manpuku);
 while( manpuku < 100 ) {
   manpuku = manpuku + 15;
   printf("もぐもぐ… %s は %s を食べて満腹感が %d になった。\n", namae, food1, manpuku);
   manpuku = manpuku + 20;
   printf("もぐもぐ… %s は %s を食べて満腹感が %d になった。\n", namae, food2, manpuku);
 }
 printf("%s はおなかいっぱいです。\n", namae );
}

このコードを実行してみるとこんな結果になったかと思います。

ぷらんく の満腹感は 10 です。
もぐもぐ… ぷらんく は リンゴ を食べて満腹感が 25 になった。
もぐもぐ… ぷらんく は チーズ を食べて満腹感が 45 になった。
もぐもぐ… ぷらんく は リンゴ を食べて満腹感が 60 になった。
もぐもぐ… ぷらんく は チーズ を食べて満腹感が 80 になった。
もぐもぐ… ぷらんく は リンゴ を食べて満腹感が 95 になった。
もぐもぐ… ぷらんく は チーズ を食べて満腹感が 115 になった。
ぷらんく はおなかいっぱいです。

ひたすらリンゴとチーズを食べ、満腹度が100を超えたら繰り返し処理を終了しています。もぐもぐ…

繰り返し文とは

C言語ではプログラムの処理を繰り返すための文が用意されています。書き方は下のような形です。

while ( 繰り返す条件 ) {… 繰り返す内容 …}

「繰り返す条件」の部分が 0 以外だったとき、「繰り返す内容」の中身を延々と繰り返します。繰り返し文はとても便利ですが、使い方によっては無限ループになってしまうこともあるので、注意が必要です。流れは下のようなイメージです。

while 文の繰り返し処理の流れ

while 文の繰り返し処理の流れ

ソースコードの処理を追ってみる

今回のソースコードの中身を確認してみましょう。
6行目までは変数の宣言と初期化をしているだけですね。

 printf("%s の満腹感は %d です。\n", namae , manpuku);

7行目で一部の変数を使ってプレイヤーのステータスを表示しています。
この時点では、変数はこんな内容になっています。

  • int 型変数の manpuku には 整数 10 が入っている
  • char型配列の変数 namae には “ぷらんく” という文字列が入っている
  • char型配列の変数 food1 には “リンゴ” という文字列が入っている
  • char型配列の変数 food2 には “チーズ” という文字列が入っている

8行目からが while文 (繰り返し文)となっています。まずは「繰り返し条件」の中身チェックからはじまります。

 while( manpuku < 100 ) {

繰り返し条件は「 manpuku < 100 」となっています。
つまり、変数 manpuku の中身が 100 未満なら、繰り返し処理(すぐ後ろの{ ~ }内)を実行する、ということになります。
もしここで変数 manpuku の中身が 100 以上なら、繰り返し処理{ ~ }は一度も実行されずにスキップされます。

最初に8行目にたどり着いたときは変数 manpuku の中身は 10 なので、繰り返し条件を満たしており、繰り返し処理が実行されます。繰り返しの処理は下のハイライト部分です。

#include <stdio.h>
int main() {
 int manpuku = 10;
 char namae[] = "ぷらんく";
 char food1[] = "リンゴ";
 char food2[] = "チーズ";
 printf("%s の満腹感は %d です。\n", namae , manpuku);
 while( manpuku < 100 ) {
   manpuku = manpuku + 15;
   printf("もぐもぐ… %s は %s を食べて満腹感が %d になった。\n", namae, food1, manpuku);
   manpuku = manpuku + 20;
   printf("もぐもぐ… %s は %s を食べて満腹感が %d になった。\n", namae, food2, manpuku);
 }
 printf("%s はおなかいっぱいです。\n", namae );
}

9行目では変数 manpuku の中身を 15 増やしています。ここで、manpuku の中身は 10 から 25 に上がっています。

10行目で増えた満腹感をコンソールに表示しています。

11行目では変数 manpuku の中身を 20 増やしています。ここで manpuku の中身は 25 から 45 に挙がっています。

12行目で増えた満腹感をコンソールに表示しています。ここで、 while文の繰り返し{…}のカッコが閉じています。このときまた、while の繰り返し条件(8行目)に戻ります。

2回目以降の繰り返し条件チェック

 while( manpuku < 100 ) {

1度、9~12行目を実行した後、while 文の繰り返し処理でまた8行目に戻ってきました。

この時、manpuku には整数 45 が入っているので、 45 < 100 は正しい(真)で、また繰り返し処理の中が実行されることになります。

また9~12行目が実行された後、8 行目の while 文の 繰り返し条件チェックに戻ってきます。この時は manpuku は 80 となっていますね。

さらに9~12行目が実行された後、8 行目の while 文の 繰り返し条件チェックに戻ってきます。この時は manpuku は 115 となり、100以上となりました。 115 < 100 で、繰り返し条件チェックでは正しくない(0、偽、false)となるため、 { … 繰り返し処理 … } は実行されず、次の行から処理が続きます。

繰り返し処理終了

無事に while 処理が終わり、おなかがいっぱいの報告をしてプログラムはおしまいとなります。

 printf("%s はおなかいっぱいです。\n", namae );

繰り返し処理内でのジャンプ処理

繰り返し処理{…}の中では、特定の場所にジャンプするためのジャンプ文があります。

繰り返し処理から抜け出す break文 について

switch 文のときにも「switch文を終了する文」として登場した break文ですが、while 文や後ほど紹介する for 文の中でも使うことができます。

while 文の中で使うと、その場で、while(繰り返し条件){…繰り返し処理…}の直後にジャンプすることができます。下のように使います。
※11行目に break 文を追加してみました。

#include <stdio.h>
int main() {
 int manpuku = 10;
 char namae[] = "ぷらんく";
 char food1[] = "リンゴ";
 char food2[] = "チーズ";
 printf("%s の満腹感は %d です。\n", namae , manpuku);
 while( manpuku < 100 ) {
   manpuku = manpuku + 15;
   printf("もぐもぐ… %s は %s を食べて満腹感が %d になった。\n", namae, food1, manpuku);
   break;
   manpuku = manpuku + 20;
   printf("もぐもぐ… %s は %s を食べて満腹感が %d になった。\n", namae, food2, manpuku);
 }
 printf("%s はおなかいっぱいです。\n", namae );
}

これを動かすと、下のような結果になったと思います。

ぷらんく の満腹感は 10 です。
もぐもぐ… ぷらんく は リンゴ を食べて満腹感が 25 になった。
ぷらんく はおなかいっぱいです。

while 文の処理が11行目で中断されて、 while 文の直後から処理が再開されています。リンゴ一つでおなか一杯になったことになっちゃってますね。

while 文の中で if 文を使って特定の条件があった場合にループを抜け出すときに使ったりします。ジャンプは下のようなイメージです。

while 文で break 文を使用したときの流れ

while 文で break 文を使用したときの流れ

繰り返し条件に戻る continue 文 について

while 文の繰り返し条件に戻る continue文 を使うことができます。
continue には直訳で「続く」という意味があります。
while 文の中で使うと、その場で、while(繰り返し条件){…繰り返し処理…}の繰り返し条件部分にジャンプすることができます。下のように使います。
※11行目に continue文を追加してみました。

#include <stdio.h>
int main() {
 int manpuku = 10;
 char namae[] = "ぷらんく";
 char food1[] = "リンゴ";
 char food2[] = "チーズ";
 printf("%s の満腹感は %d です。\n", namae , manpuku);
 while( manpuku < 100 ) {
   manpuku = manpuku + 15;
   printf("もぐもぐ… %s は %s を食べて満腹感が %d になった。\n", namae, food1, manpuku);
   continue;
   manpuku = manpuku + 20;
   printf("もぐもぐ… %s は %s を食べて満腹感が %d になった。\n", namae, food2, manpuku);
 }
 printf("%s はおなかいっぱいです。\n", namae );
}

これを動かすと下のような結果になります。

ぷらんく の満腹感は 10 です。
もぐもぐ… ぷらんく は リンゴ を食べて満腹感が 25 になった。
もぐもぐ… ぷらんく は リンゴ を食べて満腹感が 40 になった。
もぐもぐ… ぷらんく は リンゴ を食べて満腹感が 55 になった。
もぐもぐ… ぷらんく は リンゴ を食べて満腹感が 70 になった。
もぐもぐ… ぷらんく は リンゴ を食べて満腹感が 85 になった。
もぐもぐ… ぷらんく は リンゴ を食べて満腹感が 100 になった。
ぷらんく はおなかいっぱいです。

continue 文が実行されたとき、強制的に 8 行目の while 文の先頭まで戻ってしまっています。ですので、一切チーズを食べるところまですすまず、ひたすらリンゴを食べる処理を繰り返し、100になった時、while文が終了しています。

ジャンプは下のようなイメージです。

while 文で continue 文を使った時の処理の流れ

while 文で continue 文を使った時の処理の流れ

あとがき

繰り返し文の一つである while 文をお話しました。
同じような処理は並べて書くこともできますが、while文で繰り返し処理で表現できるかを考えてみると、以外にすっきり書くことができたりします。
今後も繰り返し処理はいろいろなところで使われる予定です!

今回はここまで。おつかれさまでした。

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章20 do~while文で繰り返し処理を作る
NEXT : 2章20 do~while文で繰り返し処理を作る
2章18 明示的な型変換(型キャスト)を知る : PREV

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日 更新内容
2018/7/19 ページ公開
2018/9/9 アイキャッチ画像とトップ画像作成・追加