第6講 For文以外の繰り返し処理
第3話 前話問題解答と解説
前話問題解答例
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'変数の宣言
Dim a As Integer, b As Integer, c As Integer, i As Integer, w As Integer
'値の取得
a = TextBox1.Text
b = TextBox2.Text
c = TextBox3.Text
'1乗の和の計算
w = 0
i = a
While 1
If w > b Then
i = i - c
w = w - i
Exit While
End If
w = w + i
i = i + c
End While
TextBox4.Text = w.ToString
'2乗の和の計算
w = 0
i = a
While 1
If w > b Then
i = i - c
w = w - i * i
Exit While
End If
w = w + i * i
i = i + c
End While
TextBox5.Text = w.ToString
'3乗の和の計算
w = 0
i = a
While 1
If w > b Then
i = i - c
w = w - i * i * i
Exit While
End If
w = w + i * i * i
i = i + c
End While
TextBox6.Text = w.ToString
'4乗の和の計算
w = 0
i = a
While 1
If w > b Then
i = i - c
w = w - i * i * i * i
Exit While
End If
w = w + i * i * i * i
i = i + c
End While
TextBox7.Text = w.ToString
End Sub
End Class
解説
どうです。皆さんうまくいきましたか。
うまくいかなかった方もいらっしゃるのではないでしょうか。
実は前話の課題をwhile文で実行するのは、かなり難しいのです。
私もうっかり最初は次にようにしてしまいました。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'変数の宣言
Dim a As Integer, b As Integer, c As Integer, i As Integer, w As Integer
'値の取得
a = TextBox1.Text
b = TextBox2.Text
c = TextBox3.Text
'1乗の和の計算
w = 0
i = a
While 1
w = w + i
i = i + c
If w > b then Exit While
End While
TextBox4.Text = w.ToString
'2乗の和の計算
w = 0
i = a
While 1
w = w + i * i
i = i + c
If w > b then Exit While
End While
TextBox5.Text = w.ToString
'3乗の和の計算
w = 0
i = a
While 1
w = w + i * i * i
i = i + c
If w > b then Exit While
End While
TextBox6.Text = w.ToString
'4乗の和の計算
w = 0
i = a
While 1
w = w + i * i * i * i
i = i + c
If w > b then Exit While
End While
TextBox7.Text = w.ToString
End Sub
End Class
ところがこれだと実行結果例は、
となり、すべてが合計条件値を超えてしまっています。
理由は、If w > b then Exit Whileでループを抜ける判定するときすでに上限値を超えてしまっています。
そこで、If w > b then Exit Whileを If w >= b then Exit While と改良したらどうでしょうか。
確かに、1乗の和だけ条件を満たしました。
しかし、2乗以上ではすべて10を超えてしまいました。
理由は、1乗の場合は
1+2+3+4=10なので、 If w => b then Exit While でたまたま条件に反せずループを抜け出しただけです。
2乗の場合は、
1の2乗+2の2乗=1+4=5<10なので、ループ処理が続きます。
次の
1の2乗+2の2乗+3の2乗=1+4+9=14でループを抜けることになりますが、
すでに上限値の10を超えてしまっています。
w = w + i * i
i = i + c
の処理をしてから、判定していることに問題があるのでしょうか。
もし、そうなら次のように改良すれば、問題は解決するはずです。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'変数の宣言
Dim a As Integer, b As Integer, c As Integer, i As Integer, w As Integer
'値の取得
a = TextBox1.Text
b = TextBox2.Text
c = TextBox3.Text
'1乗の和の計算
w = 0
i = a
While 1
If w>= b then Exit While
w = w + i
i = i + c
End While
TextBox4.Text = w.ToString
'2乗の和の計算
w = 0
i = a
While 1
w = w + i * i
i = i + c
If >= b then Exit While
End While
TextBox5.Text = w.ToString
'3乗の和の計算
w = 0
i = a
While 1
If w >= b then Exit While
w = w + i * i * i
i = i + c
End While
TextBox6.Text = w.ToString
'4乗の和の計算
w = 0
i = a
While 1
If w>= b then Exit While
w = w + i * i * i * i
i = i + c
End While
TextBox7.Text = w.ToString
End Sub
End Class
ところが実行結果は同じです。
なぜでしょうか。
w = w + i * i
i = i + c
の処理をする前にループを抜けているのに、なぜうまくいかないのでしょうか。
理由は、簡単です。If w => b then Exit While の判定が行われたとき、2乗以降では上限値の10を超えてしまっているのです。
1の2乗+2の2乗=1+4=5 の次は、1の2乗+2の2乗+3の2乗=1+4+9=14ですでに超えてしまっています。
1の2乗+2の2乗=1+4=5 のとき、5<10でiIf w => b then Exit While の条件式を満たしませんから、
w = w + i * i
i = i + c
の処理は行われてしまうのです。
そして、その処理をした際に、
1の2乗+2の2乗+3の2乗=1+4+9=14で上限値の10を超えてしまうのです。
超えた後に、TextBox5.Text=w.ToString での表示ですから当然14が表示されてしまいます。
つまり、最後の処理
w = w + i * i
i = i + c
は余計だったのです。したがって、解答例プログラムにおいては
'2乗の和の計算
w = 0
i = a
While 1
If w > b Then
i = i - c
w = w - i * i
Exit While
End If
w = w + i * i
i = i + c
End While
TextBox5.Text = w.ToString
となっているわけです。最後の余計な処理を精算しているのです。
でも、これだと余計な計算をして、その分をまた精算している(逆算している)のですから、
余分な計算を2回もしていることになります。
それに、難解なプログラムになってしまいます。
なぜ、この問題が起きているかというと,
While文がループを続けるかどうかの判定を
while 条件式
・
・
・
End While
最初に行っているためなのです。
それに対して、後からループ継続判定をするものがあります。
それが、Do...Loop While文です。
Do
・
・
・
Loop While 条件式
これを使えば、前話の問題は簡単に解決することができます。
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
数学研究室に戻る