Herhaalde uitvoering Bepaalde en onbepaalde lussen
Herhaalde uitvoering Bepaalde en onbepaalde lussen
Her haalde uitvoering
Zoals in de echte wereld worden ook in een programma vele acties herhaaldelijk uitgevoerd.
Voorbeeld:
* echte wereld: een machine in een autofabriek maakt elke dag 250 identieke autodeuren.
* programma: een schietspelletje toont om de 5 seconden een schietschijf op het scherm totdat het spel gedaan is.
In een programma worden acties herhaaldelijk uitgevoerd door éénzelfde instructie of methode meerdere keren na elkaar uit te voeren.
Oefening (bunnyHop)
Een konijn sluipt een tuin binnen en wil een stukje broccoli eten. Daartoe moet het konijn meerdere keren naar de broccoli toe springen.
Gebruik de methode ‘hop’ van het object ‘bunny’
Een oplossing
Do in order:
bunny.turn to face brocolli
bunny.hop
bunny.hop
bunny.hop
bunny.hop
bunny.hop
bunny.hop
bunny.hop
bunny.hop
Herhaalde uitvoering
Meerdere keren dezelfde instructie na elkaar zetten is enigzins tijdrovend en nogal onoverzichtelijk
De programmacode wordt langer en langer
We zouden liever de instructie slechts 1 keer moeten opschrijven en het programma vertellen dat die instructie een aantal keer herhaald moet worden
In Alice kan dit met de loop-instructie
Herhaling : counted loop
De loop instructie is een alternatieve manier om repetitieve code te schrijven.
Counted loop = ‘tellende lus’
Herhaalt instructies een bepaald (‘geteld’) aantal keer
Oefening
Idem als de vorige oefening, maar nu met gebruik van de loop-instructie.
Belangrijk:
De loop-instructie voert de code in zijn blok een bepaald aantal keer uit, gespecifieerd door een teller
De waarde van de teller moet geheel en positief zijn (negatieve waarde -> lus voert niet uit)
De code in het blok van de loop kan een enkele instructie zijn of een blok instructies (dus ook if-else, do together, …)
Het gebruik van een loop-instructie
bespaart tijd
is overzichtelijker
Oneindige herhaling: demo
Het aantal keer dat een lus loopt, kan ook oneindig zijn (= ‘infinity’)
Als “Infinity times” is geselecteerd voor een lusteller, betekent dit dat de lus zal blijven uitvoeren tot wanneer het programma gestopt wordt.
Demonstratie Carrousel
Complexere lusconstructies
Zoals reeds vermeld kan de code binnen een lus eender welke instructie of blok instructies zijn
Het is dus ook mogelijk om een lus binnen een andere lus te plaatsen
We noemen dit ‘geneste lussen’ (nested loops): de binnenste lus is ‘genest’ binnenin de buitenste lus
Oefening (ferrisWheel)
Het grote rad (doublewheel) draait in wijzerszin, terwijl de 2 kleine wielen (wheel1 en wheel2) in tegenwijzerszin draaien. De kleine wielen moeten 2 keer ronddraaien voor elke omwenteling van het grote wiel. Laat het grote rad 5 keer draaien.
Geneste lussen
Merk op:
De binnenste lus loopt volledig voor elke iteratie van de buitenste lus.
Als de buitenste lus 5 keer loopt en de binnenste lus 2 keer, dan zal de binnenste lus in totaal 10 keer uitgevoerd worden.
Stel de teller van de buitenste lus in op 1, en die van de binnenste lus op 2. Wat zie je?
In an animation, opposite actions that occur simultaneously effectively cancel each other out in terms of the rendered action. To demonstrate, set the outer loop to 1 time and the inner loop to 2 times. The inner wheel will look as though it rotates only once. As another example, you would see the same kind of result if you try to turn a person's head left and right ¼ revolution at the same time.
Een functie als teller
Een waarde voor de teller van een lus kan bepaald worden door een functie!
De loop-instructie rondt het teruggekregen getal (‘return value’) van de functie automatisch (naar beneden) af naar een geheel getal.
Oefening: pas de bunnyHop wereld aan zodat de teller van de lus bepaald wordt door een functie.
Onbepaalde herhaalde uitvoering
Tot dusver hebben we enkel situaties gezien waarbij we weten hoeveel keer de instructie(s) binnen de lus moeten worden uitgevoerd (eventueel bepaald door een functie)
Er zijn echter ook situaties waar het feit of de instructie(s) herhaald worden, afhankelijk is van een voorwaarde (= conditie)
We weten dus niet op voorhand hoeveel keer de lus moet uitgevoerd worden, al wat we weten is dat er herhaling nodig is
Daarom noemen we dit onbepaalde herhaling
Voorbeeld: Zolang ik niet op school ben, blijf ik verder fietsen
Onbepaalde herhaling
In programma’s waarin het aantal keer dat een actie herhaald moet worden niet gekend is (=onbepaald), kan men 2 soorten controlemechanismen gebruiken:
de While-instructie
recursie
We gaan verder in op de while-instructie
Werking van een while-lus
Het algemene principe:
Zolang een bepaalde conditie waar is
voer instructie(s) uit
Om een while-instructie te schrijven, moeten we dus weten wat de voorwaarde is die bepaalt of de lus blijft draaien
While-lus
De voorwaarde is een Booleaanse conditie (net als bij de if-instructie), die telkens opnieuw wordt geëvalueerd: is de conditie waar, dan worden de instructies in de lus uitgevoerd; is de conditie niet waar, dan worden de instructies in de lus overgeslagen
Zolang de conditie waar blijft, zal de lus dus blijven draaien; als de conditie vals wordt, stopt de lus. Daarom wordt de conditie ook soms een ‘guard’ of bewaker genoemd. De conditie ‘bewaakt’ als het ware de lus.
while = conditionele herhaling
Syntax: (in Alice)
while
Oefeningen
Pas de bunnyHop wereld aan zodat het konijn naar de broccoli toespringt zolang het konijn verder dan een halve meter verwijderd is van de broccoli. Gebruik hiervoor een while-lus.
Een achtervolging: een haai zit een visje achterna. Het visje probeert te vluchten maar de haai haalt het in en uiteindelijk wordt het visje opgegeten.
Probleem
Hoe laten we de haai de vis achtervolgen?
De haai mag het visje niet onmiddellijk vangen want dan is er geen achtervolging
De vis moet vluchten
Oplossing:
We laten de haai een korte afstand naar de vis toe zwemmen en tegelijkertijd de vis een korte afstand van de haai wegzwemmen
De vis zal naar een willekeurige (maar dichtbije) plaats vluchten
Zolang de vis verder dan 0.5 meter verwijderd is van de haai, herhalen we bovenstaande stappen.
Oefening: chase
Schrijf een verhaalbord uit
Splits op in verschillende logische delen (via methoden)
Implementeer in Alice, aangenomen dat
de haai elke keer 0.4 meter vooruit zwemt
het visje elke keer maximum 0.2 meter vooruit zwemt, en zijwaarts en verticaal ook maximum 0.2 meter uitwijkt
Hint: gebruik de randomMotion methode van goldfish
Opmerking
0.2
0.2 0.2 0.35 We zijn zeker dat de lus zal eindigen want de haai beweegt elke keer 0.4 meter vooruit terwijl de vis maximum 0.35 meter van de haai weg kan bewegen
Comments