240 likes | 391 Views
Herhaling: For, While en Do. Hoofdstuk 8. In dit hoofdstuk …. In elke programmeertaal bestaat de mogelijkheid om herhalingen of lussen uit te voeren VB.NET: For, While en Do. For. Private Sub Button1_Click( _ ByVal sender As System.Object, _ ByVal e As System.EventArgs) _
E N D
Herhaling:For, While en Do Hoofdstuk 8
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
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
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) trucMessageBox.Show(CStr(number)) Visual Basic.NET voor studenten
For: stroomdiagram lusvariabele = beginwaarde [lusvariabele <= limiet] Body Ophogen lusvariabele 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
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
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
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
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
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 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 + rice End While 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
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
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
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
Do … Loop 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
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
Do … Loop 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
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
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) 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 Next End Sub Indentatie leesbaarheid! 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
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
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
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