Herhaling: For, While en Do
description
Transcript of Herhaling: For, While en Do
Herhaling:For, While en Do
Hoofdstuk 8
Hoofdstuk 8 Visual Basic.NET voor studenten 2
In dit hoofdstuk …
In elke programmeertaal bestaat de mogelijkheid om herhalingen of lussen uit te voeren
VB.NET: For, While en Do
Hoofdstuk 8 Visual Basic.NET voor studenten 3
For
Private Sub Button1_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Button1.Click
End Sub
Private Sub Button1_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Button1.Click
End Sub
Dim number As IntegerTextBox1.Clear()For number = 1 To 10 TextBox1.AppendText( _ CStr(number) & NewLine)Next
Hoofdstuk 8 Visual Basic.NET voor studenten 4
For De body van de lus wordt herhaaldelijk uitgevoerd Nieuwe methoden
TextBox1.Clear() TextBox1.AppendText(…)
Nieuwe properties NewLine, Tab Imports Microsoft.VisualBasic.ControlChars Is ControlChars een namespace of een class? Welke andere constanten zijn nog gedefinieerd? Waarom zou je beter niet met de codes zelf werken?
Demo: Gebruik de debugger om de lus te volgen Een andere (primitievere) truc
MessageBox.Show(CStr(number))
Hoofdstuk 8 Visual Basic.NET voor studenten 5
For: stroomdiagram
Body
[lusvariabele <= limiet]
lusvariabele = beginwaarde
Ophogen lusvariabele
Hoofdstuk 8 Visual Basic.NET voor studenten 6
For
Beschouw volgend stukje code, hoeveel keer wordt de lus uitgevoerd?
For number = 1 To 10 TextBox1.AppendText(CStr(number) & NewLine) number = 10Next
For number = 1 To 10 TextBox1.AppendText(CStr(number) & NewLine) number = 10Next
Hoofdstuk 8 Visual Basic.NET voor studenten 7
For: conclusie
Gebruik een For-lus als je op voorhand weet hoeveel keer de body moet uitgevoerd worden
De “lusvariabele” (number) zou nooit mogen veranderd worden in de bodyHiervoor bestaat de While lus!
De “lusvariabele” mag wel gelezen / geraadpleegd worden
Hoofdstuk 8 Visual Basic.NET voor studenten 8
For: varianten
Zoek in de Help van Visual Studio Hoe kan je het programma “1 To 10” veranderen,
zodat het in stappen van 5 springt? Dus de uitvoer wordt: 0, 5, 10
Hoe kan je het programma “1 To 10” veranderen, zodat het van 10 naar 1 aftelt?
Beschouw het programma “boxes”. Hoeveel keer wordt de body van de For lus uitgevoerd, als je de slider vanaf uiterst links, 7 stappen naar rechts beweegt?
Hoofdstuk 8 Visual Basic.NET voor studenten 9
While Een While lus kan je gebruiken om herhalingen uit te
voeren waarbij de lusvoorwaarde veel vrijer te bepalen is door de programmeur
Voorbeelden: Zolang als een variabele < 10, doe je … Zolang als een invoerveld niet is ingevuld, doe je … Zolang als de grootte van een bestand < 10kB, doe je … Zolang als je een woord niet hebt gevonden in een tekst, doe je
… In een While lus is het aantal iteraties (herhalingen) dus
niet op voorhand bepaald!
Hoofdstuk 8 Visual Basic.NET voor studenten 10
While: voorbeeld
Per tegel verdubbelt het aantal graankorrels Op de hoeveelste tegel heb ik in totaal honderd
graankorrels (of meer)?
Hoofdstuk 8 Visual Basic.NET voor studenten 11
WhilePrivate Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Button1.Click Dim square, rice, total As Integer
square = 1 rice = 1 total = 1 DisplayCounts(square, rice)
While total < 100 square = square + 1 rice = rice * 2 DisplayCounts(square, rice) total = total + rice End While TextBox1.AppendText(NewLine & _ "Number of squares to make total of 100 is " & _ square)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Button1.Click Dim square, rice, total As Integer
square = 1 rice = 1 total = 1 DisplayCounts(square, rice)
While total < 100 square = square + 1 rice = rice * 2 DisplayCounts(square, rice) total = total + rice End While TextBox1.AppendText(NewLine & _ "Number of squares to make total of 100 is " & _ square)
End Sub
While total < 100 square = square + 1 rice = rice * 2 DisplayCounts(square, rice) total = total + riceEnd While
Hoofdstuk 8 Visual Basic.NET voor studenten 12
While
Hoeveel keer wordt de body van de while lus uitgevoerd?
Verander het programma, zodat het aantal rijstkorrels kan ingegeven worden door de gebruiker.
Private Sub DisplayCounts(ByVal square As Integer, _ ByVal rice As Integer) TextBox1.AppendText("On square " & square & _ " are " & rice & " grains" & NewLine)End Sub
Private Sub DisplayCounts(ByVal square As Integer, _ ByVal rice As Integer) TextBox1.AppendText("On square " & square & _ " are " & rice & " grains" & NewLine)End Sub
Hoofdstuk 8 Visual Basic.NET voor studenten 13
While
Elke while lus bestaat uit de volgende componenten Initialisatie vóór de lus (total = 1) Stopvoorwaarde (total < 100) Opdrachten die de stopvoorwaarde beïnvloeden
(total = total + rice) Typische fouten
Te weinig iteraties (bv: count < 10 of count <= 10) Oneindige lussen (bv: vergeten count te verhogen)
Hoofdstuk 8 Visual Basic.NET voor studenten 14
And, Or, Not
Net zoals bij de If structuur kunnen deze operatoren gebruikt worden om ingewikkelde stopcondities te maken
Haakjes!
Hoofdstuk 8 Visual Basic.NET voor studenten 15
Do … Loop
Deze herhalingsstructuur laat toe om de betekenis van de stopconditie te variërenOfwel itereren “zolang als een voorwaarde
waar is”Ofwel itereren “totdat een voorwaarde waar
geworden is”
Hoofdstuk 8 Visual Basic.NET voor studenten 16
Do … LoopDim count As IntegerTextBox1.Clear()count = 0Do While count <= 9 TextBox1.AppendText(CStr(count)) count = count + 1Loop
Dim count As IntegerTextBox1.Clear()count = 0Do While count <= 9 TextBox1.AppendText(CStr(count)) count = count + 1Loop
Dim count As IntegerTextBox1.Clear()count = 0Do Until count = 10 TextBox1.AppendText(CStr(count)) count = count + 1Loop
Dim count As IntegerTextBox1.Clear()count = 0Do Until count = 10 TextBox1.AppendText(CStr(count)) count = count + 1Loop
Deze fragmenten doen identiek hetzelfde!
Hoofdstuk 8 Visual Basic.NET voor studenten 17
Do … Loop
Deze herhalingsstructuur laat toe om de plaats van de stopconditie te variërenVoor elke iteratie evalueren (de lus begint dus
met een test)Na elke iteratie evalueren (de lus begint dus
met statements)
Hoofdstuk 8 Visual Basic.NET voor studenten 18
Do … LoopDim count As IntegerTextBox1.Clear()count = 0Do TextBox1.AppendText(CStr(count)) count = count + 1Loop While count <= 9
Dim count As IntegerTextBox1.Clear()count = 0Do TextBox1.AppendText(CStr(count)) count = count + 1Loop While count <= 9
Dim count As IntegerTextBox1.Clear()count = 0Do While count <= 9 TextBox1.AppendText(CStr(count)) count = count + 1Loop
Dim count As IntegerTextBox1.Clear()count = 0Do While count <= 9 TextBox1.AppendText(CStr(count)) count = count + 1Loop
Deze fragmenten doen identiek hetzelfde!
Hoofdstuk 8 Visual Basic.NET voor studenten 19
Bemerking
Elke lus kan herschreven worden door middel van een while lus Hiervoor bestaat een formeel wiskundig bewijs.
Waarom dan zoveel lus varianten? Kortere schrijfwijze, bv een For is korter dan een While Persoonlijke voorkeur Soms lijkt code duidelijker als ze met de ene of andere variant is
geschreven TIP: werk zoveel mogelijk met For, vervolgens zoveel
mogelijk met While en vermijd de varianten van Do … Loop
Hoofdstuk 8 Visual Basic.NET voor studenten 20
Geneste lussenPrivate Sub DrawFlats(ByVal floors As Integer, _ ByVal flats As Integer)
Dim x, y As Integer Dim floor, flat As Integer
Dim paper As Graphics paper = PictureBox1.CreateGraphics() paper.Clear(Color.White) Dim myPen As Pen = New Pen(Color.Black) y = 10 For floor = 0 To floors x = 10 For flat = 0 To flats paper.DrawRectangle(myPen, x, y, 10, 5) x = x + 15 Next y = y + 15 NextEnd Sub
Private Sub DrawFlats(ByVal floors As Integer, _ ByVal flats As Integer)
Dim x, y As Integer Dim floor, flat As Integer
Dim paper As Graphics paper = PictureBox1.CreateGraphics() paper.Clear(Color.White) Dim myPen As Pen = New Pen(Color.Black) y = 10 For floor = 0 To floors x = 10 For flat = 0 To flats paper.DrawRectangle(myPen, x, y, 10, 5) x = x + 15 Next y = y + 15 NextEnd Sub
Indentatie leesbaarheid!
Hoofdstuk 8 Visual Basic.NET voor studenten 21
Geneste lussen
Als je dergelijke oefeningen zelf moet opstellen, denk je vaak best “bottom up” DrawOneFlat() code om één flat te tekenen van
n verdiepingen Dit is dus een simpeler probleem
Herhaal de vorige methode voor het gevraagde aantal flats
Als je methodes gebruikt, bevordert dit eveneens de leesbaarheid
Hoofdstuk 8 Visual Basic.NET voor studenten 22
Geneste lussenPrivate Sub DrawOneFlat(ByVal floors As Integer, _ ByVal startX As Integer, _ ByVal paper As Graphics) Dim floor As Integer Dim myPen As Pen = New Pen(Color.Black)
Dim y As Integer = 10 For floor = 0 To floors paper.DrawRectangle(myPen, startX, y, 10, 5) y = y + 15 NextEnd Sub
Private Sub DrawOneFlat(ByVal floors As Integer, _ ByVal startX As Integer, _ ByVal paper As Graphics) Dim floor As Integer Dim myPen As Pen = New Pen(Color.Black)
Dim y As Integer = 10 For floor = 0 To floors paper.DrawRectangle(myPen, startX, y, 10, 5) y = y + 15 NextEnd Sub
Hoofdstuk 8 Visual Basic.NET voor studenten 23
Geneste lussenPrivate Sub DrawFlats(ByVal floors As Integer, _ ByVal flats As Integer) Dim x, y As Integer Dim floor, flat As Integer
Dim paper As Graphics paper = PictureBox1.CreateGraphics() paper.Clear(Color.White) Dim myPen As Pen = New Pen(Color.Black)
x = 10 For flat = 0 To flats DrawOneFlat(floors, x, paper) x = x + 15 Next
End Sub
Private Sub DrawFlats(ByVal floors As Integer, _ ByVal flats As Integer) Dim x, y As Integer Dim floor, flat As Integer
Dim paper As Graphics paper = PictureBox1.CreateGraphics() paper.Clear(Color.White) Dim myPen As Pen = New Pen(Color.Black)
x = 10 For flat = 0 To flats DrawOneFlat(floors, x, paper) x = x + 15 Next
End Sub
Hoofdstuk 8 Visual Basic.NET voor studenten 24
Combineren van controlestructuren
Bestudeer het programma: “bouncing ball”
Waarom verschijnt er een “spoor” van de bal? Je ziet a.h.w. zeer veel ballen …
Verander dit programma, zodat je effectief één bal ziet stuiterenHint: Timer