第7講 Do While〜Loop文(繰り返し処理2)
第4話 Do While〜Loop文とFor〜Next文の違い
2つのプログラム
Private Sub CommandButton1_Click()
Dim i As Integer, wa As Integer
Cells(5, 1) = "1から10までの和"
wa = 0
For i = 1 To 10 Step 2
wa = wa + i
Next
Cells(6, 1) = wa
End Sub
Private Sub CommandButton1_Click()
Dim i As Integer, wa As Integer
Cells(5, 1) = "1から10までの和"
wa = 0
i = 1
Do While i < 11
wa = wa + i
i = i + 2
Loop
Cells(6, 1) = wa
End Sub
はいずれも1+3+5+7+9を計算させるプログラムです。
では、Do While〜Loop文とFor〜Next文は違いがないのでしょうか。
そうではありません。
問題によっては、For〜Next文を使った方がいい場合と
Do While〜Loop文を使った方がいい場合と長所・短所があるのです。
確かに、1+3+5+7+9のような計算はFor〜Next文の方が簡単です。
ところがもし和が1、000を超える奇数の和の最小値とそのときの最後に足した奇数を求めよという問題
(1から奇数を加えていって、合計が1,000超えたなら加えるのをやめるときの合計を最後に加えた奇数を求める問題)なら、
Do While〜Loop文の方が簡単です。
Do While〜Loop文なら次のようにプログラムを組めばいいのです。
Private Sub CommandButton1_Click()
Dim i As Integer, wa As Integer
Cells(5, 1) = "1,000を超える奇数の和の最小値と最後に加えた奇数"
wa = 0
i = 1
Do While wa =< 1000
wa = wa + i
i = i + 2
Loop
Cells(6, 1) = wa
Cells(7, 1) = i - 2
End Sub
Cells(7, 1) = i - 2の部分はわかりにくいかも知れませんが、
2を引いておかないと正確な値は出ません。
理由は、ループの終わる直前にi = i + 2の計算をしていて、
最後に加えた奇数よりiは2大きくなってしまっているからです。
ところがFor〜Next文ではかなり難しい問題となります。
iをいくつまでに設定すればいいかがわからないからです。
iの終了値がはっきりしているときはFor〜Next文を、
はっきりしていないときは、Do While〜Loop文と使い分ければいいのです。
ところで、もし和が1,000を超えない奇数の和の最大値と最後に加えた奇数を求めよという問題であったらどうしたらよいでしょうか。
Private Sub CommandButton1_Click()
Dim i As Integer, wa As Integer
Cells(5, 1) = "1,000を超えない奇数の和の最大値と最後に加えた奇数"
wa = 0
i = 1
Do While wa =< 1000
wa = wa + i
i = i + 2
Loop
Cells(6, 1) = wa - (i - 2)
Cells(7, 1) = i - 4
End Sub
とすれば求められます。最後にi - 2
(iではありません。ループが終わる直前にi = i + 2の計算をしているからです。)
加えてしまったために1,000を超えてしまったわけですから
最後のi - 2を引けばいいというわけです。
Cells(7, 1) = i - 4の部分は、
wa = wa + iの次にi = i + 2を行っているので、
i - 4でなければならないのです。
でも一回足したものを引いていて、
計算に無駄がありますし、
わかりにくいプログラムです。
もっと、すっきり書くにはどうしたらよいでしょうか。
答えは、強制的にループを抜け出せばよいのです。