1. はじめに
プログラミングでは、同じ処理を何回も繰り返すことがよくあるんだ。例えば:
- リストの全要素を順番に処理する。
- ユーザーが正しい値を入力するまでキーボードから値を読み取る。
- 1から100までの合計を計算する。
- 正しいパスワードが入力されるまでユーザーにパスワードを聞き続ける。
もしこれをループなしで全部書こうとしたら、めっちゃ長くてダルいし、全然スケールしないよ。例えば、電卓アプリを作ってて、1から10までの数字を手動で足すコードを書いたら:
int sum = 0;
sum += 1;
sum += 2;
sum += 3;
// ... こんな感じで10回。うーん。
絶対途中で飽きるって!解決策はループ。ループを使えば、繰り返し処理をシンプルに書けるんだ。今日は一番基本だけど超便利なループ、whileを紹介するよ。
2. whileループと仲良くなろう
構文と基本パターン
whileループは、プログラミング界の「オウム」みたいなもの。同じコードを、ある条件がtrueの間ずっと繰り返す。条件がfalseになったら、オウムは黙る(ループ終了)。
while (条件)
{
// ループの本体
}
whileループのコマンドブロックの書き方
ダイアグラム
whileループの動きをイメージしやすい簡単なフローチャートがこれ:
3. 例:whileループを動かしてみよう
クラシックなカウンター
1から5まで数えて表示するシンプルなプログラムを作ってみる:
int i = 1;
while (i <= 5)
{
Console.WriteLine($"ステップ № {i}");
i++; // カウンターを増やすのを忘れずに!
}
// 出力:
// ステップ № 1
// ステップ № 2
// ステップ № 3
// ステップ № 4
// ステップ № 5
ポイント:iを増やすのを忘れると、ループが永遠に終わらない(オウムが不死身になって永遠に繰り返す)。これを無限ループって言うんだ。ちょっと怖いよね。
正しい値が入力されるまでキーボード入力
ユーザーが正解を入力するまで「しつこく」聞き続けるのによくループを使う:
string password = "";
while (password != "qwerty")
{
Console.Write("パスワードを入力してね: ");
password = Console.ReadLine();
}
Console.WriteLine("ようこそ!");
このプログラムは、君が魔法の"qwerty"を入力するまでパスワードを聞き続ける。password = Console.ReadLine();の行を消しちゃうと、また無限ループになる(パスワードを聞くけど入力を読まないから、壊れたロボットみたいに永遠に止まらない)。
4. whileループの種類と使いどころ
普通のwhileループ
さっきの例みたいに、このループは最初の1回目の前に条件をチェックする。もし最初から条件がfalseなら、ループの本体は一度も実行されない。
例:最初から条件がfalseの場合
int i = 10;
while (i < 5)
{
Console.WriteLine(i); // これは絶対実行されない!
}
まあ、そりゃそうだよね。ここに書いてある通り。
入れ子のwhileループ
たまにループの中にループが必要なこともある。例えば、全ての行を処理して、その中の全ての文字をチェックしたい時とか。今はちょっと冒険だけど、簡単な例を見てみよう:
int i = 1;
while (i <= 3)
{
int j = 1;
while (j <= 2)
{
Console.WriteLine($"i = {i}, j = {j}");
j++;
}
i++;
}
// i = 1, j = 1
// i = 1, j = 2
// i = 2, j = 1
// i = 2, j = 2
// i = 3, j = 1
// i = 3, j = 2
入れ子ループについてはまた別のレクチャーで詳しくやるから、今はちょっとだけビビらせておくね :)
無限ループ
ループは普通終わるけど、たまに永遠に続くやつもある。
while (true)
{
Console.WriteLine("俺は永遠だ!");
}
あんまり使わないけど、バックグラウンド処理(例えばサーバーの動作)とかで実際に使うこともあるよ。
5. 変な書き方をしないために:whileでよくあるミス
プログラミングのループは電気みたいなもん。便利だけど、安全ルールを知らないと危ない。
問題1:うっかり無限ループ
初心者がよくやるのは、条件に使う変数を更新し忘れること。そのせいでループが「永遠」に動き続けて、プログラムを強制終了(例えばCtrl + C)しないと止まらなくなる。
int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
// i++; // あっ!iを増やすの忘れた
}
問題2:条件が間違ってる
たまに自分で自分の罠を作っちゃうことも。条件が絶対trueにならない場合、ループは一度も実行されない。
int i = 10;
while (i < 5)
{
Console.WriteLine(i); // このコードは絶対動かない。
i++;
}
問題3:データ型のミス
ループの条件は必ずbool式(つまり結果がtrueかfalseになるやつ)じゃないとダメ。
int number = 5;
while (number) // エラー!boolが必要なのにintになってる。
{
number--;
}
GO TO FULL VERSION