10.9 Die do while-Schleife
 
Die Schleife do while verhält sich wie die while-Schleife, nur dass die Bedingung am Ende des Anweisungsblocks überprüft wird. Hier die Syntax:
do {
/* Anweisungen */
} while(BEDINGUNG == wahr);
Der Anweisungsblock wird mit dem Schlüsselwort do eingeleitet. Im Block werden dann Anweisungen ausgeführt. Am Ende des Anweisungsblocks steht der bereits bekannte Ausdruck while, bei dem überprüft wird, ob die angegebene Bedingung wahr ist. Ist die Bedingung wahr, wird der Anweisungsblock erneut ausgeführt und es beginnt wieder bei do. Wenn die Bedingung unwahr ist, geht es weiter hinter der while-Bedingung.
Achten Sie auch darauf, dass Sie die do while-Schleife am Ende von while mit einem Semikolon abschließen. Dies ist ein häufig gemachter Fehler. Der Programmablaufplan zur do while-Schleife:
 Hier klicken, um das Bild zu Vergrößern
Abbildung 10.10
Programmablaufplan der do while-Schleife
Zur Veranschaulichung ein weiteres Listing:
/* do_while1.c */
#include <stdio.h>
#include <stdlib.h> /* für Bibliotheksfunktion rand() */
int main(void) {
int ratezahl, count=0, erraten=0;
int zufall = rand() % 10; /* Pseudo-Zufallszahl von 1–10 */
do {
printf("Zahleingabe bitte (1–10): ");
scanf("%d", &ratezahl);
if(ratezahl==zufall) { /* Zahl richtig geraten ... ? */
erraten=1; /* Ja, die Zahl ist richtig */
count++;
}
else {
(ratezahl > zufall) ?
printf("kleiner\n") : printf("grösser\n");
count++;
}
} while( (erraten != 1) && (count != 3) );
if(erraten == 0) {
printf("Sie haben 3 Chancen vertan ;) \n");
printf("Die Zahl wäre %d gewesen: \n", zufall);
}
else
printf("Mit %d Versuchen erraten!\n",count);
return 0;
}
In diesem Programm wird die Headerdatei
#include<stdlib.h>
für die Funktion
rand() % 10;
verwendet, womit eine (Pseudo-)Zufallszahl zwischen 1–10 erzeugt wurde, deren Wert Sie an die Variable zufall übergeben.
Die do while-Schleife wird so lange wiederholt, bis die beiden Ausdrücke in while wahr sind:
while( (erraten != 1) && (count != 3) );
Die Bedingung für das Spiel lautet also: Sie haben maximal 3 Versuche (count != 3) , in denen Sie die Zahl erraten müssen. Solange Sie die Variable von erraten auf dem Wert 0 UND den Zähler für die Versuche count noch nicht auf 3 stehen haben, beginnt der Anweisungsblock wieder von Neuem. Ist eine dieser Bedingungen unwahr, haben Sie entweder die Zahl erraten oder mehr als drei Versuche benötigt. Dies wird anschließend nach dem Anweisungsblock ausgewertet.
Aber warum lassen Sie nicht den Computer eine Zahl raten, die Sie sich ausgedacht haben? Künstliche Intelligenz und zu kompliziert, denken Sie? Solch ein Spiel lässt sich einfacher realisieren als Sie denken. Hier das Spiel andersherum:
/* do_while2.c */
#include <stdio.h>
int main(void) {
char response;
printf("Denk Dir eine Nummer zwischen 1 und 100 aus.\n");
printf("Das errate ich in 7 oder weniger Versuchen \n\n");
do {
int lo = 1, hi = 100;
int guess;
while (lo <= hi) {
guess = (lo + hi) / 2;
printf("Ist es %d ",guess);
printf(" ((h)oeher/(n)iedriger/(j)a): ");
fflush(stdout);
scanf("%c%*c",&response);
if (response == 'h')
lo = guess + 1;
else if (response == 'n')
hi = guess – 1;
else if (response != 'j')
printf("Erraten ... :-)");
else
break;
}
/* Resultat ausgeben */
if (lo > hi)
printf("Du schummelst!\n");
else
printf("Deine Nummer lautet: %d\n",guess);
printf("Noch ein Spiel (j)a/nein : ");
fflush(stdout);
scanf("%c%*c",&response);
} while( response == 'j' );
return 0;
}
Der Computer errät dabei Ihre Zahl immer in maximal sieben Versuchen. Verwendet wird dabei ein so genanntes »Teile-und-herrsche-Prinzip«. Die Variable guess erhält durch die Berechnung (lo+hi)/2 zuerst den Wert 50. Ist die von Ihnen gesuchte Zahl jetzt höher, erhält die Variable lo einen neuen Wert mit guess+1, also 51. Somit beginnt das Teilen und Herrschen von Neuem mit (lo+hi)/2, in Zahlen (51+100)/2, also 75. Ist jetzt die gesuchte Zahl niedriger, bekommt hi einen neuen Wert mit guess-1. Es ergibt sich beim nächsten Schleifendurchlauf (lo+hi)/2, in Zahlen (51+74)/2, also 62. Und so weiter, bis die Zahl erraten wurde. Auf dieses »Teile-und-herrsche-Prinzip« werden Sie noch einige Mal in diesem Buch stoßen.
Ein weiteres praktisches Anwendungsbeispiel der do while-Schleife ist ein Benutzermenü für die Konsole:
/* do_while3.c */
#include <stdio.h>
int main(void) {
int auswahl;
do {
printf("-1- Auswahl1\n");
printf("-2- Auswahl2\n");
printf("-3- Auswahl3\n");
printf("-4- Programmende \n\n");
printf("\n\n Ihre Auswahl: ");
scanf("%d", &auswahl);
switch(auswahl) {
case 1 : printf("\n Das war Auswahl 1 \n"); break;
case 2 : printf("\n Das war Auswahl 2 \n"); break;
case 3 : printf("\n Das war Auswahl 3 \n"); break;
case 4 : printf("\n Programmende \n"); break;
default : printf("\n Unbekannte Auswahl \n");
}
} while(auswahl!=4);
return 0;
}
Meist stellt sich nach einem solchen Menübeispiel die Frage, wie der Bildschirm gelöscht werden kann. In ANSI-C ist aber keine Funktion dafür vorgesehen. Das bedeutet, dass es von Compiler und Betriebssystem abhängt, ob eine (nicht standardisierte) Funktion hierfür existiert. Wenn Sie eine solche verwenden wollen, halten Sie Ausschau nach Funktionen wie clrscr() für Microsoft Windows oder der Bibliothek <ncurses.h> für Linux/UNIX.
|