Visual Basic サンプル集 |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 >
条件指定の繰り返し(Do と While)
2022/12/4
→ C# のサンプルに切り替える → Python のサンプルに切り替える
目次
- 無限に繰り返す
- 条件付きで繰り返す。条件は1周ごとに最初に判断する。
- 条件付きで繰り返す。条件は1周ごとに最後に判断する。(Do)
- 条件がFalseになった場合に1回だけ処理を実行する
- 途中でループから抜け出す(Exit Do, Exit While)
- ループがすべて完了したか確認する (たとえば、Exit Doしていないかどうか)
- その周を中断し、次の周を開始する(Continue Do, Continue While)
- 条件達成まで繰り返す。条件は1周ごとに最初に判断する。(Do Until)
- 条件達成まで繰り返す。条件は1周ごとに最後に判断する。(Do Until)
- 5回繰り返す
- 条件判断と同時に変数に代入する
- 参考:プログラミング言語ごとの条件付きループの比較
無限に繰り返す
この例では、「こんにちは!」と出力してから1秒待つという処理を無限に繰り返します。
Do
Debug.WriteLine("こんにちは!")
Task.Delay(1000).Wait() '何もしないで1秒待つ。
Loop
メモ:最初の行を Do While True にしたり、最後の行をLoop While True にしても無限に繰り返します。
これでもできます。
While True
Debug.WriteLine("こんにちは!")
Task.Delay(1000).Wait() '何もしないで1秒待つ。
End While
条件付きで繰り返す。条件は1周ごとに最初に判断する。
この例は、変数 i が 5 より小さい間処理を繰り返します。
Dim i As Integer
Do While i < 5
i += 1
Debug.WriteLine($"現在{i}周目です。")
Loop
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
これでもできます。
Dim i As Integer
While i < 5
i += 1
Debug.WriteLine($"現在{i}周目です。")
End While
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
条件付きで繰り返す。条件は1周ごとに最後に判断する。(Do)
この例は、変数 i が 5 より小さい間処理を繰り返します。
Dim i As Integer
Do
i += 1
Debug.WriteLine($"現在{i}周目です。")
Loop While i < 5
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
条件がFalseになった場合に1回だけ処理を実行する
Dim i As Integer
'条件が False になったときに実行する処理をあらかじめ定義します。
Dim falseOp = Function()
Debug.WriteLine("条件が False になったのでループはこれで終わります。")
Return False '必ず False を返す必要があります。
End Function
'While条件で、False時に falseOpで定義した処理を実行するようにします。
Do While If(i < 3, True, falseOp())
i += 1
Debug.WriteLine($"現在{i}周目です。")
Loop
メモ:もし、最初から条件が False の場合、ループ本体は実行されず、falseOp の処理だけが実行されます。
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
条件が False
になったのでループはこれで終わります。
途中でループから抜け出す(Exit Do, Exit While)
この例では、Do ~ Loop文の条件で 変数 i が 10より小さい限り繰り返す指定になっていますが、If 文で条件判断してi が 3 のときループを抜けます。
Dim i As Integer
Do While i < 10
i += 1
If i = 3 Then
Exit Do
End If
Debug.WriteLine($"i = {i}")
Loop
Debug.WriteLine("終了")
実行すると下記の通り出力されます。
i = 1
i = 2
終了
While の場合は Exit Do の代わりに Exit Whileを使用します。この例は上記の Do ~ Loop の例と全く同じ結果になります。
Dim i As Integer
While i < 10
i += 1
If i = 3 Then
Exit While
End If
Debug.WriteLine($"i = {i}")
End While
Debug.WriteLine("終了")
この例は、摂氏(℃)と華氏(゜F)の対応表を出力します。「華氏が100度を超える」とExit Doして終了します。
Dim c As Double '摂氏。日本で通常使用する温度の単位。℃。
Dim f As Double '華氏。主にアメリカで使用する温度の単位。゜F。
Do
f = (9.0 / 5.0 * c) + 32 '摂氏(℃)から華氏(゜F)を算出。
If f > 100 Then
'華氏が100を超える場合、ループを終了します。
Debug.WriteLine("Exit Doします。")
Exit Do
End If
' ,5:0.0 の意味は「5文字分の幅で小数1桁」という書式指定。
Debug.WriteLine($"{c,5:0.0}℃ = {f,5:0.0}゜F")
c += 10
Loop
実行すると下記の通り出力されます。(掲載の都合上スペースは省いています)
0.0℃ = 32.0゜F
10.0℃ = 50.0゜F
20.0℃ = 68.0゜F
30.0℃ = 86.0゜F
Exit Doします。
ループがすべて完了したか確認する (たとえば、Exit Doしていないかどうか)
この例では 変数 i が 9999 の場合 Exit Do します。ループの処理がすべて終わった後に Exit Do して終わったのか、Exit Do しないで終わったのかメッセージを出力します。 このまま実行すると i は 9999 にならないので Exit Do は発生しないで終了します。
Dim isBreak As Boolean = False
Dim i As Integer = 0
Do While i < 10
i += 1
Debug.WriteLine($"i = {i}")
If i = 9999 Then '←ここを i == 2 などに変えると、最後のメッセージが出力されなくなります。
isBreak = True
Exit Do
End If
Loop
If Not isBreak Then
Debug.WriteLine("Exit Doしないでループを終了しました。") '←これが出力されます。
End If
While でも同様です。この例は上記の Do ~ Loop の例と全く同じ結果になります。
Dim isBreak As Boolean = False
Dim i As Integer = 0
While i < 10
i += 1
Debug.WriteLine($"i = {i}")
If i = 9999 Then '←ここを i == 2 などに変えると、最後のメッセージが出力されなくなります。
isBreak = True
Exit While
End If
End While
If Not isBreak Then
Debug.WriteLine("Exit Whileしないでループを終了しました。") '←これが出力されます。
End If
その周を中断し、次の周を開始する(Continue Do, Continue While)
If 文で条件判断して2周目と3周目であれば処理を中断して次の周を開始します。
Dim i As Integer = 0
Do While i < 5
i += 1
Debug.WriteLine($"i = {i} 開始")
If i = 1 OrElse i = 2 Then
Continue Do
End If
Debug.WriteLine($"i = {i} 終了")
Loop
実行すると下記の通り出力されます。
i = 1 開始
i = 2 開始
i = 3 開始
i = 3 終了
i = 4 開始
i = 4 終了
i = 5 開始
i = 5 終了
While でも同様です。この例は上記の Do ~ Loop の例と全く同じ結果になります。
Dim i As Integer = 0
While i < 5
i += 1
Debug.WriteLine($"i = {i} 開始")
If i = 1 OrElse i = 2 Then
Continue While
End If
Debug.WriteLine($"i = {i} 終了")
End While
この例は、摂氏(℃)と華氏(゜F)の対応表を出力します。華氏が整数になる場合にだけ出力します。華氏が100度より下である限り繰り返します。
Dim c As Double '摂氏。日本で通常使用する温度の単位。℃。
Dim f As Double '華氏。主にアメリカで使用する温度の単位。゜F。
Do
f = (9.0 / 5.0 * c) + 32 '摂氏(℃)から華氏(゜F)を算出。
If f >= 100 Then
'華氏が100以上になった場合、ループを終了します。
Exit Do
End If
c += 1
If f - Math.Truncate(f) <> 0 Then
'小数部が 0 出ない場合、何もせず次の繰り返しにジャンプします。
Continue Do
End If
' ,5:0.0 の意味は「5文字分の幅で小数1桁」という書式指定。
Debug.WriteLine($"{c - 1,5:0.0}℃ = {f,5:0.0}゜F")
Loop
実行すると下記の通り出力されます。(掲載の都合上スペースは省いています)
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周ごとに最初に判断する。(Do Until)
この例は、変数 i が 5 になるまで処理を繰り返します。
Dim i As Integer
Do Until i = 5
i += 1
Debug.WriteLine($"現在{i}周目です。")
Loop
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
条件達成まで繰り返す。条件は1周ごとに最後に判断する。(Do Until)
この例は、変数 i が 5 になるまで処理を繰り返します。
Dim i As Integer
Do
i += 1
Debug.WriteLine($"現在{i}周目です。")
Loop Until i = 5
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
5回繰り返す
Dim i As Integer
Do While i < 5
i += 1
Debug.WriteLine($"現在{i}周目です。")
Loop
メモ:この例のように単純に回数を指定して繰り返すには For の方が適しています。
実行すると下記の通り出力されます。
現在1周目です。
現在2周目です。
現在3周目です。
現在4周目です。
現在5周目です。
これでもできます。
Dim i As Integer
Do
i += 1
Debug.WriteLine($"現在{i}周目です。")
Loop While i < 5
メモ:この例のように単純に回数を指定して繰り返すには For の方が適しています。
これでもできます。
Dim i As Integer
While i < 5
i += 1
Debug.WriteLine($"現在{i}周目です。")
End While
メモ:この例のように単純に回数を指定して繰り返すには For の方が適しています。
条件判断と同時に変数に代入する
次の例は、1~6のランダムな数値を生成します。6が生成されると何もせず終了します。
Dim i As Integer
Dim assign = Function(ByRef v As Integer, value As Integer)
v = value
Return value
End Function
Do While assign(i, Random.Shared.Next(1, 7)) <= 5
Debug.WriteLine(i)
Loop
メモ:C#の代入演算子 = は代入した値を返しますが、VBの代入演算子 = は何も値を返さないので、VBでは代入と条件判断を組み合わせて記述することができません。この例では、代入を実行し、代入した値を返す関数を 変数 assign で定義することでC#の代入演算子を同じことを実現しています。しかし、この方式はサンプルを見てわかるように少しトリッキーです。ここまでして代入と条件判断を組み合わせる必要はないはずなので、このサンプルは参考程度にご活用ください。
条件を最後に判断しても同様ですが、この例では、最初に必ず 0 が出力されます。
Dim i As Integer
Dim assign = Function(ByRef v As Integer, value As Integer)
v = value
Return value
End Function
Do
Debug.WriteLine(i)
Loop While assign(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 で可能 |
条件判断と代入を 組み合わせと記述 |
不可 | = で可能 | := で可能 |
この表は言語に用意されている機能を表現しています。「不可」となっている部分の多くはロジックを自作することで実現は可能です。
VB6では Do ~ Loop または While ~ Wend 使用します。
この記事のサンプルでは VB2015以降でのみ使用できるものが多くなっていますが、これは、Do や While の機能が違うわけではなく、サンプル中で利用している補完文字列( $" から始まる文字列)がVB2015以上でないと使用できないという理由の場合が多いです。