Lussen

Lussen zijn herhalings-constructies. Iedere programmeertaal zal dergelijke constructies herbergen en zijn bedoeld om een of meerdere zaken te herhalen.
Pascal kent drie soorten lussen, te weten: fe For-lus, de While-lus en de Repeat-Until-lus.
In deze paragraaf zal ik aan de hand van één en hetzelfde voorbeeld alle drie de lussen illustreren. Hierna zal ik aangeven wanneer je welke lus gebruikt.

Eerst het voorbeeld: Bepaal de som van alle getallen van 1 t/m 100. Die som is overigens 5050 en is zonder lus gemakkelijk te bepalen (zie ook “wiskunde is leuk: aflevering 3 bewijs 2)”.

De For-lus.

De syntax van de For-lus luidt als volgt:

For [variabele] := [beginwaarde] (down)to [eindwaarde] do
[opdracht];

Voor de For-lus heb je dus een variabele nodig (van een aftelbaar type), en je moet een begin- en een eindwaarde weten. Als de [eindwaarde] kleiner is dan de [beginwaarde], dan gebruik je downto, anders to.
Gedurende de doorloop van de lus wordt de [opdracht] uitgevoerd.

Het eerste programma:

program p6_1;

var
  teller, som: integer;

begin
  som := 0;
  for teller := 1 to 100 do
    som := som + teller;
  writeln(teller,’ – ‘,som);
end.

Probeer goed te begrijpen wat er gebeurt. Schrijf ook de uitkomsten even op, dat is later van belang.

De While-lus.

De syntax van de While-lus luidt als volgt:

While [voorwaarde] do
[opdracht];

Hierbij kan [voorwaarde] weer complex zijn. De While-lus wordt uitgevoerd zolang er aan de [voorwaarde] voldaan is.

Het tweede programma:

program p6_2;

var
  teller, som: integer;

begin
  teller := 1;
  som := 0;
  while teller <= 100 do
    begin
      som := som + teller;
      teller := teller + 1;
    end;
  writeln(teller,’ – ‘,som);
end.

Ten opzichte van het eerste programma (met de For-lus) een belangrijke zaak: je moet nu zelf de teller bijhouden, ofwel voorzien van een initiële waarde, en binnen de lus ophogen!
Verder moet je er goed opletten dat de voorwaarde wel een keer eindigt, zodat het programma uit de lus komt.
Gevaarlijke constructies zijn die waar in de voorwaarde het is-gelijk-teken of ongelijk-aan-teken staat. Bijvoorbeeld:

while teller <> 100 do …

waarbij je er dus vanuit gaat dat teller ooit 100 wordt. Stel dat teller een real-variabele is, dan is dit nog maar zeer de vraag. Let daar dus goed op.

Schrijf ook hier de uitkomsten even op.

De Repeat-Until_lus.

De syntax van de Repeat-Until_lus luidt als volgt:

Repeat
[opdracht(en)];
Until [voorwaarde];

Hierbij mag [voorwaarde] complex zijn. De statements tussen repeat en until worden als een compound-statement beschouwd.
De statements tussen repeat en until worden uitgevoerd totdat er aan de until-voorwaarde is voldaan.

Het derde programma:

program p6_3;

var
  teller, som: integer;

begin
  teller := 1;
  som := 0;
  repeat
    som := som + teller;
    teller := teller + 1;
  until teller > 100;
  writeln(teller,’ – ‘,som);
end.

Probeer ook deze lus weer goed te doorgronden en noteer de uitkomsten nog even.
Heb je alles gesnapt? Zo ja, dan moet je deze vraag kunnen beantwoorden: Wat is het wezenlijke verschil tussen de While-lus en de Repeat-Until-lus?

Als het goed is dan heb je de uitkomsten van alle drie de lussen genoteerd. Dan valt op dat de variabele som in alle gevallen 5050 is, maar dat de variabele teller bij de For-lus de waarde 100 heeft en bij de andere twee lussen de waarde 101. Het is altijd belangrijk te weten wat dit soort teller-variabelen voor waarde hebben nadat de lus is verlaten, voor het geval je verder moet rekenen met zo’n variabele.

Om nog even terug te komen op de eerder in dit onderdeeltje gestelde vraag:
De Repeat-Until-lus wordt minimaal 1 keer doorlopen! Verander in programma p6_2 en p6_3 de initiële waarde van teller maar eens in 1000 en vergelijk de uitkomsten!

Wanneer welke lus?

Wanneer moet je nu welke lus gebruiken?
Hoewel enigszins arbitrair kun je de volgende vuistregels aanhouden:

Een for-lus gebruik je als je van te voren precies weet hoevaak iets herhaald moet worden.
Een while-lus gebruik je wanneer je van te voren niet weet of de code in de lus wel uitgevoerd moet worden.
Een repeat-until-lus gebruik je wanneer de code tussen repeat en until minimaal 1 keer moet worden uitgevoerd.

Bij een vrije keuze verdient de for-lus verreweg de voorkeur, omdat dit de snelste van de drie is.

[Keuzes] <– –> [Deelprogramma’s en variabelen(2)]