Programmsteuerung 5: Die "repeat-until"-Schleife
Bei der repeat-until-Schleife werden die Anweisungen immer mindestens einmal ausgeführt, weshalb man hier von einer "nicht
abweisenden Schleife" spricht.
Hinzu kommt, dass es dann nicht mehr wiederholt wird, wenn die Bedingung wahr ist.
Die Struktur sieht wie folgt aus:
repeat // alle Anweisungen until Bedingung; // Ausgesprochen: Wiederhole ... Solange bis Bedingung wahr ist! |
Als einfaches Beispiel, könnten wir hier ein kleines scherzhaftes Spiel ausdenken. Dieses
nutzt die "MessageBox"-funktion, die wir bereits bei S09 - if
im Einsatz hatten.
Quizfrage: Was passiert beim folgenden Beispiel?
var id : Integer; begin repeat id := Application.MessageBox( 'Wollen Sie diesen Monat Ihr Gehalt Ihrem Chef spenden?', 'Frage:', MB_YESNO+MB_ICONQUESTION); until id = ID_YES; ShowMessage('Eine Sehr gute Wahl!'); end; |
Lasst uns hier einmal repeat...until mit while vergleichen:
repeat ... until | while |
---|---|
Die Abfrage steht am Ende | Die Abfrage steht am Anfang |
"nicht abweisende Schleife" | "abweisende Schleife" |
Braucht nie begin und end um mehrere Anweisungen auszuführen. | Bei einer Anweisung braucht man kein begin und end, ab zwei Anweisungen aber schon. |
Die Anweisungen werden mindestens einmal ausgeführt | Wenn die Bedingung beim ersten Durchlauf false ist, werden die Anweisungen nicht weiter ausgeführt |
Die repeat-until-Schleife läuft solange weiter, bis die Bedingung true ist. | Die while-Schleife läuft solange weiter, bis die Bedingung false ist. |
Achtung: Der unterste Punkt ist besonders bemerkenswert! Hier können die meisten Fehler in der Logik passieren,
was zu Programm-Abstürzen führen kann. Die Anweisungen zwischen repeat und until werden solange
wiederholt, bis die Bedingung wahr geworden ist.
Lasst uns noch mehr vergleichen:
i := 10; repeat dec(i); until i = 0; |
i := 10; while i > 0 do begin dec(i); end; // oder: i := 10; while i > 0 do dec(i); |
Auch hierfür kann der Source-Code komplett unter
GitHub aufgerufen werden.
Viel Spaß ;)
Viel Spaß ;)