07C: Lussen

Les 7 kent drie delen A, B, C die in een willekeurige volgorde kunnen worden doorgenomen.

Tot nu toe hebben we een aantal basisprogrammeeropdrachten leren kennen (bijv. het toekennen van een waarde aan een variabele en het afdrukken van een waarde) en ook de if-opdracht. In deze les introduceren we lussen (Eng.: loops) (ook wel de herhaal-opdracht genoemd of iteratie): een manier om de computer dezelfde opdrachten vele keren na elkaar te laten uitvoeren. Bijvoorbeeld, bij het controleren van de spelling van een document komt ieder woord in het document aan bod; zoiets programmeer je typisch met een lus. We zullen twee soorten lussen van Python beschrijven: while-lussen en for-lussen.

while-lussen

Een while-opdracht herhaalt een aantal regels uit je programma keer op keer zolang er aan een bepaalde voorwaarde wordt voldaan. Hier volgt een voorbeeld:

Voorbeeld: Aftellen

Hier volgt de algemene structuur:

  • De eerste regel bestaat uit while «voorwaarde»: waarbij «voorwaarde» een uitdrukking is die True (waar) of False (onwaar) oplevert (een Booleaanse uitdrukking dus, zoals bij if-opdrachten).
  • Daarna volgt een blok bestaande uit opdrachten die inspringen (net zoals bij de if-opdracht) dat steeds weer wordt uitgevoerd. Dit wordt het lichaam (Eng.: body) genoemd.
  • Wanneer je het programma uitvoert, gebeurt het volgende:
    1. De voorwaarde wordt getest. Als de voorwaarde False is, stopt de lus, en voert Python de code uit die na de lus komt in het programma.
    2. Als de voorwaarde True is, dan wordt het lichaam uitgevoerd, waarbij de opdrachten van het lichaam van boven naar beneden doorlopen worden. Ga dan weer naar Stap 1.

Programmeeroefening: Countup
Pas het voorbeeld hierboven aan zodat het resultaat een programma is waarbij we vooruit tellen, beginnend bij 1 en dan tot 10, en druk dan Boem! af.
Tik de invoer voor je programma hieronder in.

Met lussen kun je gemakkelijk een programma schrijven dat niet meer stopt, omdat het in een eeuwigdurende lus (ook een oneindige lus genoemd) terecht is gekomen.
Voorbeeld
Oneindige lus
Je krijgt een foutmelding "Time Limit Exceeded" (tijdlimiet overschreden). Dat komt doordat de CS Circles-webserver een tijdslimiet heeft; na 1 seconde wordt het programma afgebroken. Wanneer je het programma thuis uitvoert, dan blijft het eeuwig doorlopen (totdat je het zelf beëindigt). 

for-lussen

Er is nog een andere soort lus in Python; de for-lus. In veel situaties kunnen beide soorten lussen (for/while) worden gebruikt. Maar soms is de ene eenvoudiger en dan weer de andere, waardoor het nuttig is om ze beide te kennen. Een for-lus wordt gebruikt om gemakkelijk een rij getallen te doorlopen (of zoals we in een volgende les zullen zien, iedere lijst met data).

Voorbeeld
Voorbeeld van een for-lus: opwaarts tellen

De algemene structuur van een numerieke for-lus is

for «variabeleNaam» in range(«startWaarde», «eindWaarde»):
  «inspringend blok met opdrachten, dat de "body" van de lus wordt genoemd»
Zoals gebruikelijk kan het lichaam meerdere regels lang zijn, zolang de regels maar evenveel inspringen. Eerst wordt het luslichaam uitgevoerd met variabeleNaam gelijk aan startWaarde. Daarna wordt het herhaald met variabeleNaam gelijk aan startWaarde+1, dan opnieuw met startWaarde+2, enzovoort. Dit gaat zo door totdat variabeleNaam de waarde eindWaarde-1 heeft bereikt; na die laatste uitvoering van het luslichaam (de laatste iteratie van de lus dus) stopt de lus.

De lus eindigt met eindWaarde-1, en niet met eindWaarde! Dit heeft dus veel weg van de manier waarop substring-indices werken (zie les 7A).
Voorbeeld

Het lichaam van een lus kan gerust zelf ook weer een lus bevatten. (We spreken van geneste lussen (Eng.: nested loops).) Bijvoorbeeld:

Voorbeeld
Een vierkant van 5 bij 5 afdrukken.
Merk opS = S + '*' zet een * aan het eind van de string S (geleerd in les 7A).

Programmeeroefening: Star triangle
Wijzig voorgaand programma op twee manieren. Ten eerste: teken een driehoek in plaats van een vierkant, zoals: ◣. Ten tweede: in plaats van altijd 5 regels af te drukken zou het de gewenste grootte via de invoer moeten inlezen. Bijvoorbeeld, wanneer de invoer 3 is, dan is de uitvoer:

*
**
***
Klik hier voor een aanwijzing. 
Tik de invoer voor je programma hieronder in.

De opdrachten break en continue

De opdracht break is te vergelijken met een nooduitgang bij een while- of for-lus: break veroorzaakt een onmiddellijke sprong naar de opdrachten na het einde van het lichaam van de lus. Hier is een voorbeeld van een break: het leest alle invoerregels totdat er één gevonden wordt die zegt "END".

Voorbeeld
Een lus door invoerregels

De continue-opdracht slaat de rest van de huidige lusiteratie (de uitvoering van het luslichaam die momenteel bezig is) over, waarna verdergegaan wordt met de volgende iteratie (de volgende uitvoering van het luslichaam, dus bv. voor de volgende waarde van de range).

Voorbeeld

Oefeningen

Programmeeroefening: Kwadraten
Kwadraten zijn gehele getallen die gelijk zijn aan K × K. Zo is bijvoorbeeld 9 een kwadraat want 3 × 3 = 9. Schrijf een programma dat een geheel getal n als invoer inleest en als uitvoer de kwadraten kleiner dan n geeft. Elk op een aparte regel, in opklimmende volgorde. Wanneer bijvoorbeeld de invoer 16 is dan is de correcte uitvoer:

1
4
9
Hint
Tik de invoer voor je programma hieronder in.

Programmeeroefening: Skipping
Voeg extra regels toe aan het voorbeeld "Een lus door invoerregels" van hierboven (we hebben het programma al voor je gekopieerd) door een extra eis toe te voegen: iedere regel die gelijk is aan SKIP moet niet worden afgedrukt en moet ook niet tot gevolg hebben dat de teller wordt opgehoogd. Voer het programma uit om een voorbeeld te bekijken.Hint
Tik de invoer voor je programma hieronder in.

Programmeeroefening: Delers vinden
Als a × b = n, dan noemen we a × een factorisatie van n. Schrijf in deze oefening een programma dat een positief geheel getal n als invoer inleest, en alle factorisaties van n als uitvoer heeft; daarbij moet de uitvoer eruit zien als in het voorbeeld hier beneden voor n=10.

1 times 10 equals 10
2 times 5 equals 10
5 times 2 equals 10
10 times 1 equals 10
Hint
Tik de invoer voor je programma hieronder in.