Herhaling: For, While en Do

24
Herhaling: For, While en Do Hoofdstuk 8

description

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) _ - PowerPoint PPT Presentation

Transcript of Herhaling: For, While en Do

Page 1: Herhaling: For, While  en  Do

Herhaling:For, While en Do

Hoofdstuk 8

Page 2: Herhaling: For, While  en  Do

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

Page 3: Herhaling: 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

Page 4: Herhaling: For, While  en  Do

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))

Page 5: Herhaling: For, While  en  Do

Hoofdstuk 8 Visual Basic.NET voor studenten 5

For: stroomdiagram

Body

[lusvariabele <= limiet]

lusvariabele = beginwaarde

Ophogen lusvariabele

Page 6: Herhaling: For, While  en  Do

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

Page 7: Herhaling: For, While  en  Do

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

Page 8: Herhaling: For, While  en  Do

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?

Page 9: Herhaling: For, While  en  Do

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!

Page 10: Herhaling: For, While  en  Do

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)?

Page 11: Herhaling: For, While  en  Do

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

Page 12: Herhaling: For, While  en  Do

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

Page 13: Herhaling: For, While  en  Do

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)

Page 14: Herhaling: For, While  en  Do

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!

Page 15: Herhaling: For, While  en  Do

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”

Page 16: Herhaling: For, While  en  Do

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!

Page 17: Herhaling: For, While  en  Do

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)

Page 18: Herhaling: For, While  en  Do

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!

Page 19: Herhaling: For, While  en  Do

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

Page 20: Herhaling: For, While  en  Do

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!

Page 21: Herhaling: For, While  en  Do

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

Page 22: Herhaling: For, While  en  Do

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

Page 23: Herhaling: For, While  en  Do

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

Page 24: Herhaling: For, While  en  Do

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