Iteraties met While

Gebruik van het while statement

In de vorige hoofdstukken zagen we reeds enkele lussen:

  • for: deze lus wordt gebruikt als het aantal iteraties op voorhand gekend is.
  • foreach: met deze lus werd elk element van een array aangesproken. Ook hier is het aantal iteraties gekend, het is gelijk aan het aantal elementen van de array.

Soms is het aantal uit te voeren iteraties echter niet op voorhand gekend. In dit geval biedt de iteratie met while een oplossing.

Syntax van het while statement

De algemene syntax van het while statement ziet er als volgt uit:

while (voorwaarde)
{
    te herhalen instructieblok;
}

Grafisch kunnen we dit met onderstaande flowchart voorstellen:

image

Bespreking: zolang er aan de voorwaarde voldaan is, wordt het instructieblok herhaald. De voorwaarde bevindt zich tussen ronde haken, het instructieblok tussen accolades. Bij het opbouwen van de voorwaarde, kunnen de verschillende logische en vergelijkingsoperatoren gebruikt worden, die in het hoofdstuk over operatoren besproken werden.

Voorbeeld

De functie bepaalt hoe vaak een getal deelbaar is door 2 voordat dit getal kleiner wordt dan 1.

public static int countDivided2(float number)
{
    int count = 0;
    while (number > 1)
    {
        number = number / 2;
        count++;
    }
    return count;
}

Grafisch kunnen we dit met onderstaande flowchart voorstellen:

image

Bespreking:

  • De variabele count: In dit voorbeeld wordt count als een teller gebruikt om bij te houden hoe vaak het instructieblok van de while-lus uitgevoerd wordt. De eindwaarde van deze teller geeft aan hoe vaak het getal deelbaar is door 2 voordat het kleiner wordt dan 1. Binnen de while-lus wordt de teller met 1 verhoogd (houdt bijgevolg het aantal lussen bij). De teller wordt als functieresultaat gegeven.
  • De voorwaarde bij while (number > 1): Zolang deze voorwaarde true als resultaat geeft, wordt de while-lus uitgevoerd. Van zodra de voorwaarde false geeft, stopt de while-lus en wordt er naar de eerste instructie na de lus gesprongen. In dit geval is dat de return instructie.
  • Het instructieblok: Het nummer wordt gelijkgesteld aan zichzelf gedeeld door 2 en de teller count wordt met 1 verhoogd verhoogd. Door het nummer in de lus te wijzigen, wijzigt ook de voorwaarde van de while-lus. Het is essentieel om de voorwaarde in de lus te wijzigen om een oneindige lus te vermijden.

Vermijd een oneindige lus door de voorwaarde van de while-lus in de lus te laten wijzigen.

While (true)

Soms kan het handig zijn om de voorwaarde voor het beëindigen van de lus niet bij while te vermelden, maar de lus te stoppen d.m.v. een break binnen de lus zelf.

while (true) 
{
    instructions;
    if (condition) break;
}

Door true als voorwaarde bij while te zetten, zal de lus blijven lopen. Het stoppen van de lus gebeurt in dit geval binnen de lus zelf. De instructies binnen de lus, zorgen ervoor dat de voorwaarde bij if wijzigt. Als er aan een bepaalde voorwaarde voldaan is, wordt het instructieblok bij if uitgevoerd. Aangezien dit een break is, zal de while-lus stoppen.

Iteraties met do while

Naast het while statement is er ook do while. Deze twee structuren lijken sterk op elkaar, toch is er dit belangrijk verschil: bij do while wordt het instructieblok altijd minstens één keer uitgevoerd, terwijl bij while de mogelijkheid bestaat dat het instructieblok niet uitgevoerd wordt. De algemene syntax van het do while statement verduidelijkt dit verder:

do
{
    te herhalen instructieblok;
} while (voorwaarde);

Grafisch kunnen we dit met onderstaande flowchart voorstellen:

image

Bespreking:

  • Aangezien de voorwaarde pas na het uitvoeren van het te herhalen instructieblok getest wordt, wordt dit instructieblok altijd minstens één keer uitgevoerd ongeacht er aan de voorwaarde voldaan is.
  • Merk de puntkomma op het einde van het do while statement op. Vergeet deze niet!

Wanneer gebruik je while en wanneer do while?

Zoals reeds vermeld in het voorgaande wordt het instructieblok bij do while minstens één maal uitgevoerd. In het voorbeeld hieronder wordt de variabele number op een random nummer geïnitialiseerd d.m.v. een (fictieve) functie GenerateRandomNumber(). We willen echter dat de variabele number niet groter is dan 10. D.m.v. do while wordt number steeds opnieuw geïnitialiseerd tot de variabele een waarde kleiner of gelijk aan 10 heeft. Omdat de initialisatie hier minstens 1 keer moet gebeuren, kan dit uitgewerkt worden met een do while statement.

int number;
do 
{
    number = GenerateRandomNumber(); // fictieve functie
} while (number > 10);

Door de variabele number op voorhand op een foutieve waarde te initialiseren kan bovenstaand do while statement echter ook onder de vorm van while geschreven worden.

int number = 11; // initialisatie op een te grote waarde -> while wordt uitgevoerd

while (number > 10)
{
    number = GenerateRandomNumber();
}

Een andere toepassing van het do while statement vind je bij de controle van invoer van de gebruiker in consoleprogramma’s. Aangezien dit momenteel niet aan de orde is, wordt do while niet verder behandeld in deze cursus.

Open het project oefening-while-1 en maak de oefeningenreeks


Previous section:
Next section:
Navigatie