第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 条件式
これを使えば、前話の問題は簡単に解決することができます。


第2話へ 第4話へ

006

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座

数学研究室に戻る