C# サンプル集 |
Visual Basic 中学校 > C# サンプル集 > C# サンプル集目次 >
条件指定の繰り返し(while と do)
2022/12/4
→ Visual Basic のサンプルに切り替える → Python のサンプルに切り替える
目次
- 無限に繰り返す
- 条件付きで繰り返す。条件は1周ごとに最初に判断する。(while)
- 条件付きで繰り返す。条件は1周ごとに最後に判断する。(do)
- 条件がfalseになった場合に1回だけ処理を実行する
- 途中でループから抜け出す(break)
- ループがすべて完了したか確認する (たとえば、breakしていないかどうか)
- その周を中断し、次の周を開始する(continue)
- 条件達成まで繰り返す。条件は1周ごとに最初に判断する。(while)
- 条件達成まで繰り返す。条件は1周ごとに最後に判断する。(do)
- 5回繰り返す
- 条件判断と同時に変数に代入する
- 参考:プログラミング言語ごとの条件付きループの比較
無限に繰り返す
この例では、「こんにちは!」と出力してから1秒待つという処理を無限に繰り返します。
while (true)
{
System.Diagnostics.Debug.WriteLine("こんにちは!");
Task.Delay(1000).Wait(); //何もしないで1秒待つ。
}
これでもできます。
do
{
System.Diagnostics.Debug.WriteLine("こんにちは!");
Task.Delay(1000).Wait(); //何もしないで1秒待つ。
} while (true);
条件付きで繰り返す。条件は1周ごとに最初に判断する。(while)
この例は、変数 i が 5 より小さい間処理を繰り返します。
int i = 0;
while (i < 5)
{
i++;
System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
}
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
条件付きで繰り返す。条件は1周ごとに最後に判断する。(do)
この例は、変数 i が 5 より小さい間処理を繰り返します。
int i = 0;
do
{
i++;
System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
} while (i < 5);
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
条件がfalseになった場合に1回だけ処理を実行する
int i = 0;
bool loopCondition;
while (loopCondition = i < 3)
{
i++;
System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
}
if (loopCondition == false)
{
System.Diagnostics.Debug.WriteLine("条件が false になったのでループはこれで終わります。");
}
メモ:もし、最初から条件が false の場合、ループ本体は実行されず、if の処理だけが実行されます。
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
条件が false
になったのでループはこれで終わります。
途中でループから抜け出す(break)
この例では、while文の条件で 変数 i が 10より小さい限り繰り返す指定になっていますが、if 文で条件判断してi が 3 のときループを抜けます。
int i = 0;
while (i < 10)
{
i++;
if (i == 3)
{
break;
}
System.Diagnostics.Debug.WriteLine($"i = {i}");
}
System.Diagnostics.Debug.WriteLine("終了");
実行すると下記の通り出力されます。
i = 1
i = 2
終了
do でも同様です。この例は上記の while の例と全く同じ結果になります。
int i = 0;
do
{
i++;
if (i == 3)
{
break;
}
System.Diagnostics.Debug.WriteLine($"i = {i}");
} while (i < 10);
System.Diagnostics.Debug.WriteLine("終了");
この例は、摂氏(℃)と華氏(゜F)の対応表を出力します。「華氏が100度を超える」とbreakして終了します。
double c = 0; //摂氏。日本で通常使用する温度の単位。℃。
double f; //華氏。主にアメリカで使用する温度の単位。゜F。
while(true)
{
f = (9.0 / 5.0 * c) + 32; //摂氏(℃)から華氏(゜F)を算出。
if (f > 100)
{
//華氏が100を超える場合、ループを終了します。
System.Diagnostics.Debug.WriteLine("breakします。");
break;
}
// ,5:0.0 の意味は「5文字分の幅で小数1桁」という書式指定。
System.Diagnostics.Debug.WriteLine($"{c,5:0.0}℃ = {f,5:0.0}゜F");
c += 10;
}
実行すると下記の通り出力されます。(掲載の都合上スペースは省いています)
0.0℃ = 32.0゜F
10.0℃ = 50.0゜F
20.0℃ = 68.0゜F
30.0℃ = 86.0゜F
breakします。
ループがすべて完了したか確認する (たとえば、breakしていないかどうか)
この例では 変数 i が 9999 の場合 break します。ループの処理がすべて終わった後に break して終わったのか、break しないで終わったのかメッセージを出力します。 このまま実行すると i は 9999 にならないので break は発生しないで終了します。
bool loopCondition;
int i = 0;
while (loopCondition = i < 10)
{
i++;
System.Diagnostics.Debug.WriteLine($"i = {i}");
if (i == 9999) //←ここを i == 2 などに変えると、最後のメッセージが出力されなくなります。
{
break;
}
}
if (!loopCondition)
{
System.Diagnostics.Debug.WriteLine("breakしないでループを終了しました。"); //←これが出力されます。
}
do でも同様です。この例は上記の while の例と全く同じ結果になります。
bool loopCondition = false;
int i = 0;
do
{
i++;
System.Diagnostics.Debug.WriteLine($"i = {i}");
if (i == 9999) //←ここを i == 2 などに変えると、最後のメッセージが出力されなくなります。
{
break;
}
} while (loopCondition = i < 10);
if (!loopCondition)
{
System.Diagnostics.Debug.WriteLine("breakしないでループを終了しました。"); //←これが出力されます。
}
その周を中断し、次の周を開始する(continue)
if 文で条件判断して2周目と3周目であれば処理を中断して次の周を開始します。
int i = 0;
while (i < 5)
{
i++;
System.Diagnostics.Debug.WriteLine($"i = {i} 開始");
if ( i == 1 || i == 2)
{
continue;
}
System.Diagnostics.Debug.WriteLine($"i = {i} 終了");
}
実行すると下記の通り出力されます。
i = 1 開始
i = 2 開始
i = 3 開始
i = 3 終了
i = 4 開始
i = 4 終了
i = 5 開始
i = 5 終了
do でも同様です。この例は上記の while の例と全く同じ結果になります。
int i = 0;
do
{
i++;
System.Diagnostics.Debug.WriteLine($"i = {i} 開始");
if ( i == 1 || i == 2)
{
continue;
}
System.Diagnostics.Debug.WriteLine($"i = {i} 終了");
} while (i < 5);
この例は、摂氏(℃)と華氏(゜F)の対応表を出力します。華氏が整数になる場合にだけ出力します。華氏が100度より下である限り繰り返します。
double c = 0; //摂氏。日本で通常使用する温度の単位。℃。
double f; //華氏。主にアメリカで使用する温度の単位。゜F。
while((f = (9.0 / 5.0 * c) + 32) < 100) //摂氏(℃)を華氏(゜F)に変換した値を変数fに代入し、それが100より下の場合処理を実行します。
{
c += 1;
if (f - Math.Truncate(f) != 0)
{
//小数部が 0 でない場合、何もせず次の繰り返しにジャンプします。
continue;
}
// ,5:0.0 の意味は「5文字分の幅で小数1桁」という書式指定。
System.Diagnostics.Debug.WriteLine($"{c - 1,5:0.0}℃ = {f,5:0.0}゜F");
}
実行すると下記の通り出力されます。(掲載の都合上スペースは省いています)
0.0℃ = 32.0゜F
5.0℃ = 41.0゜F
10.0℃ = 50.0゜F
15.0℃
= 59.0゜F
20.0℃ = 68.0゜F
25.0℃ = 77.0゜F
30.0℃ =
86.0゜F
35.0℃ = 95.0゜F
条件達成まで繰り返す。条件は1周ごとに最初に判断する。(while)
この例は、変数 i が 5 になるまで処理を繰り返します。
int i = 0;
while (! (i == 5))
{
i++;
System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
}
メモ:ループの終了条件を指定する特別な機能はありません。もし必要ならこの例のようにループの条件を ! で反転させるなどすることになります。
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
条件達成まで繰り返す。条件は1周ごとに最後に判断する。(do)
この例は、変数 i が 5 になるまで処理を繰り返します。
int i = 0;
do
{
i++;
System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
} while (! (i == 5));
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
5回繰り返す
int i = 0;
while (i < 5)
{
i++;
System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
}
メモ:この例のように単純に回数を指定して繰り返すには for の方が適しています。
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
これでもできます。
int i = 0;
do
{
i++;
System.Diagnostics.Debug.WriteLine($"現在{i}周目です。");
} while (i < 5);
メモ:この例のように単純に回数を指定して繰り返すには for の方が適しています。
条件判断と同時に変数に代入する
次の例は、1~6のランダムな数値を生成します。6が生成されると何もせず終了します。
int i;
while ((i = Random.Shared.Next(1, 7)) <= 5)
{
System.Diagnostics.Debug.WriteLine(i);
}
do でも同様ですが、条件を判断するのが処理の最後なので、この例では、最初に必ず 0 が出力されます。
int i = 0;
do
{
System.Diagnostics.Debug.WriteLine(i);
} while ((i = Random.Shared.Next(1, 7)) <= 5);
参考:プログラミング言語ごとの条件付きループの比較
方法 | Visual Basic | C# | Python |
---|---|---|---|
条件の省略 | Do で可能。 省略すると無限ループします。 |
不可 | 不可 |
ループ先頭での条件判断 | Do と While で可能 | while で可能 | while で可能 |
ループ最後での条件判断 | Do で可能 | do で可能 | 不可 |
条件が false と評価された 場合に実行する処理の記述 |
不可 | 不可 | else で可能 |
ループを継続する条件の記述 | Do と While で可能 | do と whileで可能 | while で可能 |
ループを終了する条件の記述 | Do で 可能 (Untilを使う) |
不可 | 不可 |
ループの終了 | Exit Do または Exit While で可能 | break で可能 | break で可能 |
次の周へのジャンプ | Continue Do または Continue While で可能 |
continue で可能 | continue で可能 |
条件判断と代入を 組み合わせと記述 |
不可 | = で可能 | := で可能 |
この表は言語に用意されている機能を表現しています。「不可」となっている部分の多くはロジックを自作することで実現は可能です。