🖥️

【C言語超入門】 第12回 Whileループ

2024/12/25に公開

https://youtu.be/ZxYIo4lV2-8

四国めたん
\textcolor{pink}{四国めたん: }教師役ですわ

ずんだもん
\textcolor{lime}{ずんだもん: }生徒役なのだ

\footnotesize \textcolor{pink}{四国めたん:} 皆さん、こんにちは。四国めたんです

\footnotesize \textcolor{lime}{ずんだもん:} ずんだもんなのだ。こんにちはなのだ

\footnotesize \textcolor{pink}{四国めたん:} 今回もC言語のお勉強をしていきましょう

\footnotesize \textcolor{lime}{ずんだもん:} レッツゴーなのだ

\footnotesize \textcolor{pink}{四国めたん:} 前回は forループ についてお話ししましたわ

\footnotesize \textcolor{pink}{四国めたん:} 今回はプログラミングの基本の 反復 の1つである whileループ についてお話ししますわ

\footnotesize \textcolor{lime}{ずんだもん:} よろしくなのだ

whileループで繰り返し

\footnotesize \textcolor{pink}{四国めたん:} 前回の forループ のことは覚えていますか?

\footnotesize \textcolor{lime}{ずんだもん:} 前処理条件式後処理 の指定ができたのだ

\footnotesize \textcolor{pink}{四国めたん:} その通りですわ

\footnotesize \textcolor{pink}{四国めたん:} 対して whileループ では 条件式 のみ、指定できるのですわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

\footnotesize \textcolor{lime}{ずんだもん:} それで whileループ はどのように書けばいいのだ

\footnotesize \textcolor{pink}{四国めたん:} while (条件式) { 処理 }の形式となりますわ

\footnotesize \textcolor{lime}{ずんだもん:} どのように動作するのだ?

\footnotesize \textcolor{pink}{四国めたん:} whileループ では 条件式 の結果がtrueの場合には 処理 を1回行い、再度、 条件式 を評価しますわ

\footnotesize \textcolor{lime}{ずんだもん:} 条件式 の結果がfalseとなるとどうなるのだ?

\footnotesize \textcolor{pink}{四国めたん:} whileループ を抜けて次のプログラムを実行しますわ

\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ

forループを書き換えよう

\footnotesize \textcolor{pink}{四国めたん:} ところで前回使用した forループ を覚えていますか

\footnotesize \textcolor{lime}{ずんだもん:} おぼえているのだ

\footnotesize \textcolor{pink}{四国めたん:} まずはおさらいとして前回のサンプルプログラムを実行してみましょう

#include <stdio.h>

void main() {
  int apple[100] = {0};
  int total = 0;

  for (int i = 0; i < 100; i++) {
    apple[i] = 100 + i;
  }

  for (int j = 0; j < 100; j++) {
    total += apple[j];
  }

  int average = total / 100;
  printf("リンゴの重さの平均は%dグラムです\n", average);
}

forループの実行結果

\footnotesize \textcolor{lime}{ずんだもん:} 「リンゴの重さの平均は149グラムです」と表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} では whileループ を使って書き換えて実行してみましょう

#include <stdio.h>

void main() {
  int apple[100] = {0};
  int total = 0;
  int i = 0;

  while (i < 100) {
    apple[i] = 100 + i;
    i++;
  }

  i = 0;
  while (i < 100) {
    total += apple[i];
    i++;
  }

  int average = total / 100;
  printf("リンゴの重さの平均は%dグラムです\n", average);
}

whileループの実行結果

\footnotesize \textcolor{lime}{ずんだもん:} まったく同じ結果になったのだ

\footnotesize \textcolor{pink}{四国めたん:} 結果が違ったらビックリですわ

\footnotesize \textcolor{pink}{四国めたん:} それではプログラムの説明を行いますわ

\footnotesize \textcolor{lime}{ずんだもん:} おねがいなのだ

\footnotesize \textcolor{pink}{四国めたん:} まず whileループ の直前で、カウンターに使用する変数"i"を0に初期化していますわ

\footnotesize \textcolor{lime}{ずんだもん:} どちらのループの前でも初期化しているのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、これは forループ前処理 に相当しますわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

\footnotesize \textcolor{pink}{四国めたん:} 次に whileループ条件式 i < 100を設定していますわ

\footnotesize \textcolor{lime}{ずんだもん:} ここは forループ と一緒なのだ

\footnotesize \textcolor{pink}{四国めたん:} 処理の最後ではカウンターの変数"i"をインクリメントしていますわ

\footnotesize \textcolor{lime}{ずんだもん:} forループ後処理 に相当しているのだ

\footnotesize \textcolor{pink}{四国めたん:} ちなみにインクリメント演算子については前の行と一緒にすることができますわ

\footnotesize \textcolor{pink}{四国めたん:} 例えば最初のループはapple[i++] = 100 + i等としても動作しますわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほど、インクリメント演算子は、かなり便利なのだ

\footnotesize \textcolor{pink}{四国めたん:} ただインクリメント演算子やデクリメント演算子は動作が複雑で判り難い面がありますわね

\footnotesize \textcolor{pink}{四国めたん:} ですので、最初は単体で使用する方が良いでしょう

\footnotesize \textcolor{lime}{ずんだもん:} わかったのだ

回数不定のループを試そう

\footnotesize \textcolor{pink}{四国めたん:} whileループ はカウンターを使用して条件式に回数を指定すれば、 forループ と同様のことができますわ

\footnotesize \textcolor{lime}{ずんだもん:} でも、それだけであれば whileループ を使用するのではなく、 forループ を使えばいいのでは?

\footnotesize \textcolor{pink}{四国めたん:} そうですわね

\footnotesize \textcolor{pink}{四国めたん:} whileループ の使いどころとしては、ループの回数が予め定まっていない場合などですわ

\footnotesize \textcolor{lime}{ずんだもん:} それって、どんな場合か想像できないのだ

\footnotesize \textcolor{pink}{四国めたん:} 条件式 に使用する変数が 処理 の中で変化するような場合ですわね

\footnotesize \textcolor{lime}{ずんだもん:} 具体的には?

\footnotesize \textcolor{pink}{四国めたん:} 例えば1回のループ毎にキーボードから1文字を取得して q の文字が入力されたらループから抜けるようなプログラムですわ

\footnotesize \textcolor{pink}{四国めたん:} 実際にプログラムを書いて実行してみましょう

#include <conio.h>
#include <stdio.h>

void main() {
  int c = 0;

  printf("何かキーを押してください。\n");

  c = _getch();
  while (c != 'q') {
    printf("%c", c);
    c = _getch();
  }

  printf("\nループを抜けました\n");
}

回数不定のループ

\footnotesize \textcolor{lime}{ずんだもん:} 「何かキーを押してください。」と表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} とりあえず\fcolorbox{blue}{lightgray}{a}\fcolorbox{blue}{lightgray}{b}\fcolorbox{blue}{lightgray}{c}と入力してみましょう

abcを入力

\footnotesize \textcolor{lime}{ずんだもん:} 入力した文字が表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、処理内では入力されたキーの文字を表示し、_getch()で再度キー入力を待ちますわ

\footnotesize \textcolor{pink}{四国めたん:} では\fcolorbox{blue}{lightgray}{q}を入力してみましょう

qを入力

\footnotesize \textcolor{lime}{ずんだもん:} 「ループを抜けました」と表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、入力した文字が q と等しくなったので、 条件式falseとなって whileループ を抜けましたわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

\footnotesize \textcolor{pink}{四国めたん:} このように\fcolorbox{blue}{lightgray}{q}が押されるまでは永久にループによる処理が行われますわ

\footnotesize \textcolor{lime}{ずんだもん:} ところで最初に\fcolorbox{blue}{lightgray}{q}を押してしまったらどうなるのだ?

\footnotesize \textcolor{pink}{四国めたん:} 最初に\fcolorbox{blue}{lightgray}{q}を押してしまえば 処理 は行われずにスキップされますわ

\footnotesize \textcolor{pink}{四国めたん:} とりあえずやってみましょう

最初にq

\footnotesize \textcolor{lime}{ずんだもん:} 「何かキーを押してください。」の後に、すぐ「ループを抜けました」と表示されたのだ

do~whileループもありますわ

\footnotesize \textcolor{pink}{四国めたん:} 前の例では最初に\fcolorbox{blue}{lightgray}{q}が入力された場合には 処理 がスキップされて1回も実行されませんでしたわ

\footnotesize \textcolor{lime}{ずんだもん:} でも、1回も実行されないのでは、困ることはないのか?

\footnotesize \textcolor{pink}{四国めたん:} ありますわね

\footnotesize \textcolor{pink}{四国めたん:} ですので、C言語では最低でも1回は 処理 が実行される whileループ が存在しますわ

\footnotesize \textcolor{lime}{ずんだもん:} どんなループなのだ?

\footnotesize \textcolor{pink}{四国めたん:} do~whileループ と呼ばれていますわ

\footnotesize \textcolor{pink}{四国めたん:} 形式としてはdo { 処理 } while (条件式);の構造となりますわ

\footnotesize \textcolor{lime}{ずんだもん:} 条件式 の評価が 処理 の後に行われるのか?

\footnotesize \textcolor{pink}{四国めたん:} はい、その通りですわ

\footnotesize \textcolor{pink}{四国めたん:} 前のプログラムを do~whileループ を使って書き直して実行してみましょう

#include <conio.h>
#include <stdio.h>

void main() {
  int c = 0;

  printf("何かキーを押してください。\n");

  do {
    c = _getch();
    printf("%c", c);
  } while (c != 'q');

  printf("\nループを抜けました\n");
}

do~whileループ

\footnotesize \textcolor{lime}{ずんだもん:} まずは「何かキーを押してください。」と表示されたのだ

\footnotesize \textcolor{pink}{四国めたん:} では\fcolorbox{blue}{lightgray}{q}を入力してみましょう

do~whileループ2

\footnotesize \textcolor{lime}{ずんだもん:} 前のプログラムと違って「ループを抜けました」と表示される前に"q"が表示されているのだ

\footnotesize \textcolor{pink}{四国めたん:} はい、今回の場合、キー入力と入力されたキーの表示はセットになっていて、必ず1回は実行されますわ

\footnotesize \textcolor{pink}{四国めたん:} 結果として、\fcolorbox{blue}{lightgray}{q}を押したら、ループを抜ける前に"q"が表示されますわ

\footnotesize \textcolor{lime}{ずんだもん:} なるほどなのだ

\footnotesize \textcolor{pink}{四国めたん:} 更に whileループ の直前のc = _getch()を無くすことができましたわ

\footnotesize \textcolor{lime}{ずんだもん:} 少しはスッキリとしたプログラムになったのだ

まとめ

\footnotesize \textcolor{pink}{四国めたん:} お疲れさまでした

\footnotesize \textcolor{lime}{ずんだもん:} おつかれさまなのだ

\footnotesize \textcolor{pink}{四国めたん:} 以上で Whileループ を終了しますわ

Discussion