tags:

views:

41

answers:

6

Hi - learning about loops (still a beginner) in VB.net. I have got the below code and basically it is meant to stop the loop once it reaches a number above 20. Now, the problem is that it does stop after number 20 but the last number that is displayed in the list is always above 20.....any idea how I can stop it showing the last number as above 20?

If you guys know it can you also explain a bit about the answer - would like to learn as well as have the code..Thanks!

Private Sub btnDoWhileLoop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDoWhileLoop.Click
    Dim objRandom As New Random
    Dim intRandomNumber As Integer = 0
    ClearList()

    Do While intRandomNumber < 20
        intRandomNumber = objRandom.Next(25)
        lstData.Items.Add(intRandomNumber.ToString)
    Loop
End Sub
+1  A: 

...well ...as you said, your loop stops when 'intRandomNumber' is greater or equal to twenty

...so ...at the end, the number will be greater or equal to twenty ;)

I don't know the exact syntax, but you can do something like:

Do While True
    intRandomNumber = objRandom.Next(25)
    if intRandomNumber >= 20
        Break
    lstData.Items.Add(intRandomNumber.ToString)
Loop
arnaud
but intRandomNumber < 20 - so should it be less than 20? I have not a greater or equal to twenty sign in the code?
lara400
ah - get yeah...
lara400
+3  A: 

The problem is that you are adding the random item immediately after it was generated, without checking whether you should add it.

You can check that the number should be added to the list before adding it:

Private Sub btnDoWhileLoop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDoWhileLoop.Click
    Dim objRandom As New Random
    Dim intRandomNumber As Integer = 0
    ClearList()

    Do While intRandomNumber < 20
        intRandomNumber = objRandom.Next(25)
        If intRandomNumber < 20 Then
            lstData.Items.Add(intRandomNumber.ToString)
        End If
    Loop
End Sub

Or, break out of the loop:

Private Sub btnDoWhileLoop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDoWhileLoop.Click
    Dim objRandom As New Random
    Dim intRandomNumber As Integer = 0
    ClearList()

    Do While intRandomNumber < 20
        intRandomNumber = objRandom.Next(25)
        If intRandomNumber >= 20 Then
            Exit While
        End If

        lstData.Items.Add(intRandomNumber.ToString)
    Loop
End Sub
Oded
brilliant mate! your explanation explians it all! thanks for that..
lara400
+2  A: 

The problem is that you are picking a new number and adding it to the list before checking the number. You should pick the number, check it, and then add it to the list.

There are several ways of doing that in a loop.

Initialise before the loop, and create a new number at the end of the loop:

Dim objRandom As New Random
Dim intRandomNumber As Integer
ClearList()

intRandomNumber = objRandom.Next(25)
Do While intRandomNumber < 20
  lstData.Items.Add(intRandomNumber.ToString)
  intRandomNumber = objRandom.Next(25)
Loop

Check in the middle of the loop and exit:

Dim objRandom As New Random
Dim intRandomNumber As Integer
ClearList()

Do
  intRandomNumber = objRandom.Next(25)
  if intRandomNumber >= 20 Then Exit Loop
  lstData.Items.Add(intRandomNumber.ToString)
Loop

Double check:

Dim objRandom As New Random
Dim intRandomNumber As Integer
ClearList()

Do
  intRandomNumber = objRandom.Next(25)
  If intRandomNumber < 20 Then
    lstData.Items.Add(intRandomNumber.ToString)
  End If
Loop Until intRandomNumber >= 20
Guffa
totally under it now! - thanks Guffa!
lara400
A: 

As far as Do While .. Loop constructs go, the body of the loop is executed BEFORE condition is checked.

If you want to check BEFORE executing the body of the loop, look into a While ... End construct.

Jin Kim
A: 

To Add on to Oded's answer so you don't do your check twice

Private Sub btnDoWhileLoop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDoWhileLoop.Click
    Dim objRandom As New Random
    Dim intRandomNumber As Integer = 0
    ClearList()

    Do
        intRandomNumber = objRandom.Next(25)
        If intRandomNumber < 20 Then
            lstData.Items.Add(intRandomNumber.ToString)
        Else
            Exit Loop
        End If
    Loop
End Sub
Scott Chamberlain
A: 

Note placement of Random statement

Public Class Form1

    Dim objRandom As New Random 'usually best declared at the class level

    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) _
                          Handles Button1.Click

        Dim intRandomNumber As Integer = 0

        lstData.Items.Clear()

        Do

            intRandomNumber = objRandom.Next(25)

            If intRandomNumber < 20 Then
                lstData.Items.Add(intRandomNumber.ToString)
            End If

        Loop While intRandomNumber < 20

    End Sub

End Class
dbasnett