Step 13 - repeat-until

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ß ;)