Hoofdstuk 7: Lussen
Inleiding
Een lus kan gebruikt worden om in een programma een aantal uitdrukkingen herhaaldelijk uit te voeren
- Stel dat je een stuk tekst (type
String
) honderd keer moet op het scherm tonen. Of dat je een berekening moet doen die veel herhaling vergt. Dan zou je eenzelfde stukje code honderd keer moeten herhalen. Dat kan heel omslachtig zijn en vergroot de kans op fouten:
- Java heeft een heel belangrijke constructie die we een lus zullen noemen die controleert hoeveel keer een uitdrukking of een blok van uitdrukkingen wordt uitgevoerd. Het bovenstaande stuk code kunnen we ook schrijven met een dergelijke constructie:
Initieel is
teller
een variabel die de waarde 0 bevat. De lus controleert indienteller < 100
, indien dit waar is dan worden de uitdrukkingen binnen de lus uitgevoerd. Indien de conditie niet waar is (false
) dan wordt uit de lus gegaan en worden de uitdrukkingen uitgevoerd na de lus-structuur.Lussen zijn constructies die ons toelaten om herhaaldelijke uitvoeringen te controleren. In Java zijn er drie soorten lus structuren:
while
-lussen,do-while
-lussen enfor
-lussen
De While
lus
een
While
lus voert uitdrukkingen uit zolang een voorwaarde waar is
- De syntax voor een
while
-lus is als volgt:
- Een lus kan ook voorgesteld worden als een flowchart:
- Het deel van de uitdrukkingen die moeten herhaald worden zullen de body van de lus noemen. Een eenmalige doorloop van de body noemen we iteratie (of herhaling).
- Elke lus heeft een
lus-voorwaarde
. Dit is een Booleaanse uitdrukking dat de uitvoer van de body controleert. Als de voorwaardetrue
is dan wordt de body uitgevoerd. Als de voorwaarde evalueert totfalse
(niet waar) dan wordt de lus niet meer uitgevoerd en wordt overgegaan naar de eerstvolgende uitdrukking na de lus-structuur. Om via een while-lus 100 keer de tekst"Welkom bij Java"
te tonen wordt dit:
- In dit voorbeeld weet je exact hoeveel de lus doorlopen moet worden en hoeveel iteraties de lus moet hebben. Dit soort lus is een teller-gecontroleerde lus.
- Een ander voorbeeld telt de eerste getallen op van 1 tot 9:
Als
i < 10
waar is, zal het programma de waarde vani
bijtellen bijsom
. De waarde vani
is initieel geplaatst op 1, maar incrementeert na elke doorloop of iteratie van de lus. Wanneeri
gelijk wordt aan 10, is de lus-voorwaardei < 10
niet waar, zodat de lus wordt doorbroken.Wat gebeurt als er per ongeluk een uitdrukking vergeten wordt zodat bovenstaand programma wordt:
- Deze lus is oneindig, want
i
verandert niet dus de lus-voorwaardei < 10
blijft altijdtrue
. Let dus op dat je altijd ervoor zorgt dat de lus-voorwaardefalse
wordt, zodat er geen oneindige lussen voorkomen.
Ontwerpstrategieën voor lussen
het voornaamste in het ontwerpen van lussen is het bepalen van het stukje code dat moet herhaald worden en een voorwaarde schrijven om de lus te beëindigen
- Het schrijven van een lus is geen eenvoudige taak voor beginnende programmeurs:
- Stap 1: bepaal de Java uitdrukkingen dat dienen herhaald te worden
- Stap 2: Schrijf deze in een lus als volgt:while (true) { Uitdrukkingen; }
- Stap 3 : Maak een lus-voorwaarde en voeg uitdrukkingen toe die de uitvoering van de lus controleren (e.g. een teller, of iets dat meetbaar is):
- while (lus-voorwaarde) { Uitdrukkingen; Bijkomende uitdrukkingen die de uitvoering van de lus controleren; }
De do-while
lus
Een
do-while
lus is gelijkaardig aan dewhile
lus, behalve dat de body van de lus één keer wordt uitgevoerd alvorens de lus-voorwaarde gecontroleerd wordt.
- De syntax van een
do-while
lus is
- De body van de lus wordt eerst uitgevoerd, daarna wordt de
lus-voorwaarde
geëvalueerd. Als de evaluatie van delus-voorwaarde
true
oplevert, dan wordt de body opnieuw uitgevoerd; als dezefalse
oplevert, dan wordt de lus beëindigd. Voorgesteld door een flowchart wordt eendo-while
lus als volgt voorgesteld:
De for
lus
- De syntax voor een
for
lus is:
- Een
for
lus gebruikt een variabele om te controleren hoeveel keer een lus doorlopen moet worden. Deze variabele wordt de controlevariabele genoemd. Deinitiele-uitdrukking
initializeert de controlevariabele en deactie-na-elke-iteratie
zal de controlevariabele incrementeren of decrementeren. Delus-voorwaarde
test indien de controlevariabele een waarde bereikt heeft om de lus te stoppen. - De flowchart van een for lus wordt voorgesteld als:
- Bovenstaand voorbeeld met een while-lus
kan gemakkelijk herschreven worden volgens een for
-lus
- Een
for
lus kan dus bondiger geschreven worden in vergelijking met eenwhile
lus, omdat deze laatste veronderstelt dat een controlevariabele buiten de lus geïnitialiseerd wordt en dat in de body van de lus de controlevariabele geïncrementeerd of gedecrementeerd wordt.
Welke lus structuur te gebruiken?
- In elke situatie kan je elk van de lus structuren gebruiken.
- De
while
lus en dedo-while
lus zijn gemakkelijker te gebruiken dan defor
lus. Eenfor
lus plaast de initializatie en de increment/decrement van de controlevariabele in de lus structuur, terwijl dewhile
endo-while
lus deze buiten de lus worden gezet. - De
while
enfor
lus zullen eerst de lus-voorwaarde controleren alvorens de body uit te voeren. Ze worden daarom ook wel pretest lussen genoemd. Dedo-while
zal eerst een iteratie uitvoeren van de body en daarna de lus-voorwaarde controleren. Een dergelijke soort lus noemt men ook wel posttest lus. - De volgende herhaling kan je schrijven met een for en een while lus:
for-lus
- Een vuistregel is wanneer je weet hoeveel iteraties er moeten uitgevoerd worden, gebruik je een
for
-lus. Als je het aantal iteraties niet op voorhand weet, omdat dit afhangt van een waarde van een variabele die kan veranderen tijdens de lus, dan gebruik je eerder eenwhile
ofdo-while
.
Geneste lussen
Een lus kan binnen de body van een andere lus voorkomen. Dit zijn geneste lussen.
- Geneste lussen bestaan uit een buitenste lus en één of meerdere binnenste lussen. Bij elke herhaling van de buitenste lus, wordt de binnenste lus ook uitgevoerd.
- Bijvoorbeeld, onderstaand programma zal een vermenigvuldingstabel maken:
Dit geeft:
Vermenigvuldingstabel
1 2 3 4 5 6 7 8 9
------------------------------------------------
1 | 1 2 3 4 5 6 7 8 9
2 | 2 4 6 8 10 12 14 16 18
3 | 3 6 9 12 15 18 21 24 27
4 | 4 8 12 16 20 24 28 32 36
5 | 5 10 15 20 25 30 35 40 45
6 | 6 12 18 24 30 36 42 48 54
7 | 7 14 21 28 35 42 49 56 63
8 | 8 16 24 32 40 48 56 64 72
9 | 9 18 27 36 45 54 63 72 81
- Let op: hou er rekening mee dat geneste lussen some lang kunnen duren. Beschouw volgend stuk code:
- Ookal duurt de uitvoering van de body slechts een microseconde (), zal de volledige uitvoering meer dan 277 uren duren.