Herhaling: For, While en Do Hoofdstuk 8 Hoofdstuk 8
Visual Basic.NET voor studenten In dit hoofdstuk … In elke programmeertaal bestaat de mogelijkheid om herhalingen of lussen uit te voeren VB.NET: For, While en Do Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten For Private Sub Button1_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ Handles Button1.Click End Sub Dim number As Integer TextBox1.Clear() For number = 1 To 10 TextBox1.AppendText( _ CStr(number) & NewLine) Next Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten 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)) Visual Basic.NET voor studenten Hoofdstuk 8
For: stroomdiagram lusvariabele = beginwaarde [lusvariabele <= limiet] Body Ophogen lusvariabele Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten For Beschouw volgend stukje code, hoeveel keer wordt de lus uitgevoerd? For number = 1 To 10 TextBox1.AppendText(CStr(number) & NewLine) number = 10 Next Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten 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 body Hiervoor bestaat de While lus! De “lusvariabele” mag wel gelezen / geraadpleegd worden Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten 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? Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten 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! Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten While: voorbeeld Per tegel verdubbelt het aantal graankorrels Op de hoeveelste tegel heb ik in totaal honderd graankorrels (of meer)? Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten While 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 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 + rice End While Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten While Private Sub DisplayCounts(ByVal square As Integer, _ ByVal rice As Integer) TextBox1.AppendText("On square " & square & _ " are " & rice & " grains" & NewLine) End Sub Hoeveel keer wordt de body van de while lus uitgevoerd? Verander het programma, zodat het aantal rijstkorrels kan ingegeven worden door de gebruiker. Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten 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) Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten And, Or, Not Net zoals bij de If structuur kunnen deze operatoren gebruikt worden om ingewikkelde stopcondities te maken Haakjes! Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten Do … Loop Deze herhalingsstructuur laat toe om de betekenis van de stopconditie te variëren Ofwel itereren “zolang als een voorwaarde waar is” Ofwel itereren “totdat een voorwaarde waar geworden is” Visual Basic.NET voor studenten Hoofdstuk 8
Do … Loop Deze fragmenten doen identiek hetzelfde! Dim count As Integer TextBox1.Clear() count = 0 Do While count <= 9 TextBox1.AppendText(CStr(count)) count = count + 1 Loop Deze fragmenten doen identiek hetzelfde! Dim count As Integer TextBox1.Clear() count = 0 Do Until count = 10 TextBox1.AppendText(CStr(count)) count = count + 1 Loop Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten Do … Loop Deze herhalingsstructuur laat toe om de plaats van de stopconditie te variëren Voor elke iteratie evalueren (de lus begint dus met een test) Na elke iteratie evalueren (de lus begint dus met statements) Visual Basic.NET voor studenten Hoofdstuk 8
Do … Loop Deze fragmenten doen identiek hetzelfde! Dim count As Integer TextBox1.Clear() count = 0 Do TextBox1.AppendText(CStr(count)) count = count + 1 Loop While count <= 9 Deze fragmenten doen identiek hetzelfde! Dim count As Integer TextBox1.Clear() count = 0 Do While count <= 9 TextBox1.AppendText(CStr(count)) count = count + 1 Loop Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten 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 Visual Basic.NET voor studenten Hoofdstuk 8
Geneste lussen Indentatie leesbaarheid! 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 End Sub Indentatie leesbaarheid! Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten 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 Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten Geneste lussen 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 Next End Sub Visual Basic.NET voor studenten Hoofdstuk 8
Visual Basic.NET voor studenten Geneste lussen 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 Visual Basic.NET voor studenten Hoofdstuk 8
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 stuiteren Hint: Timer Visual Basic.NET voor studenten Hoofdstuk 8