Tot nu toe moest je je programma steeds opnieuw starten wanneer je een berekening voor een nieuw probleem wilde uitvoeren. Dat is natuurlijk niet erg efficiënt. Vaak wil je net dezelfde instructies meerdere keren herhalen.
Een iteratie is zo’n herhalingsstructuur. Ze laat een opeenvolging van instructies een aantal keren herhalen. Je spreekt ook wel van een lus.
In C# bestaan er twee soorten lussen: de while-lus en de for-lus. In deze reeks bekijken we de while-lus.
De while-lus herhaalt de instructies zolang aan een voorwaarde voldaan is. De naam zegt het zelf: while is het Engels voor “herhaal zolang”. Zodra niet meer aan de voorwaarde voldaan is, stopt de lus en gaat het programma verder met de opdracht na de lus.
while (voorwaarde)
{
// statements: de instructies die herhaald worden
}
true of false oplevert (net zoals bij
een if).true is, voert C# de instructies tussen de accolades
uit. Dat noemen we het lichaam (de body) van de lus.true, dan
volgt nog een ronde; is ze false geworden, dan stopt de lus.Schematisch ziet een while-lus er zo uit:
De voorwaarde wordt eerst getest, en pas daarna worden de instructies uitgevoerd. Is de voorwaarde al van bij de start
false, dan draait de lus dus nul keer.
false wordenDit is het belangrijkste om te onthouden: er moet binnen de lus iets
veranderen waardoor de voorwaarde uiteindelijk false wordt. Gebeurt dat niet,
dan blijft de voorwaarde eeuwig true en draait de lus voor altijd door. Dat
noemen we een oneindige lus, en dat is bijna nooit de bedoeling.
Daarom hoort bij elke while-lus meestal een vast patroon van drie ingrediënten:
| Ingrediënt | Wat het doet |
|---|---|
| Initialisatie | Stel vóór de lus een beginwaarde in voor de variabele die je in de voorwaarde gebruikt. |
| Voorwaarde | De test bovenaan de lus die bepaalt of er nog een ronde volgt. |
| Update | Verander in het lichaam die variabele, zodat de voorwaarde ooit false wordt. |
Vergeet je de update, dan verandert de variabele nooit en krijg je een oneindige lus. Dat is de klassieke beginnersfout bij lussen.
Bekijken we een concreet voorbeeld. We willen een programma dat zo werkt:
De gebruiker geeft een aantal keer een strikt positief geheel getal in (dus groter dan 0). Telkens toont het programma de tekst
Hallo. Geeft de gebruiker een negatief getal of 0 in, dan toont het programma hoe vaak hetHalloheeft getoond.
We hebben twee variabelen nodig: getal (het getal dat de gebruiker ingeeft) en
aantal (een teller die we bijhouden). De teller begint op 0 en gaat telkens
één omhoog wanneer we Hallo tonen.
// Declaratie van de variabelen
int getal;
int aantal = 0;
// Eerste invoer
Console.Write("Geef een getal: ");
getal = Convert.ToInt32(Console.ReadLine());
while (getal > 0)
{
Console.WriteLine("Hallo");
aantal = aantal + 1;
Console.Write("Geef een getal: ");
getal = Convert.ToInt32(Console.ReadLine());
}
// Resultaat tonen
Console.WriteLine("Aantal keer 'Hallo' getoond: " + aantal);
Herken je de drie ingrediënten?
| Ingrediënt | In dit programma |
|---|---|
| Initialisatie | int aantal = 0; en het eerste getal dat we vóór de lus inlezen. |
| Voorwaarde | getal > 0: zolang de gebruiker een strikt positief getal ingeeft. |
| Update | In het lichaam lezen we met getal = Convert.ToInt32(Console.ReadLine()); een nieuw getal in. Daardoor kan de voorwaarde ooit false worden. |
Merk op dat we vóór de lus al een eerste getal inlezen. Anders zou de
voorwaarde getal > 0 getest worden vóór getal een waarde heeft. En binnen de
lus lezen we op het einde telkens een nieuw getal in: dat is de update die de lus
ooit doet stoppen.
Geeft de gebruiker bijvoorbeeld achtereenvolgens 4, 7, 2 en dan 0 in, dan
ziet de uitvoer er zo uit:
Geef een getal: 4
Hallo
Geef een getal: 7
Hallo
Geef een getal: 2
Hallo
Geef een getal: 0
Aantal keer 'Hallo' getoond: 3
Geeft de gebruiker meteen 0 of een negatief getal in, dan is de voorwaarde van
bij de start false. De lus draait dan nul keer en het programma toont:
Geef een getal: 0
Aantal keer 'Hallo' getoond: 0