Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 10 Kontrollstrukturen
  gp 10.1 Verzweigungen mit der if-Bedingung
    gp 10.1.1 Anweisungsblock
  gp 10.2 Die Verzweigung mit else if
  gp 10.3 Die Verzweigung mit else
  gp 10.4 Der !-Operator (logischer Operator)
  gp 10.5 Logisches UND (&&) – Logisches ODER (||)
  gp 10.6 Bedingungsoperator ?:
  gp 10.7 Fallunterscheidung: die switch-Verzweigung
    gp 10.7.1 default
  gp 10.8 Die while-Schleife
    gp 10.8.1 Endlosschleife (while)
    gp 10.8.2 Fehlervermeidung bei while-Schleifen
  gp 10.9 Die do while-Schleife
  gp 10.10 Die for-Schleife
    gp 10.10.1 Beispiele für eine for-Schleife
  gp 10.11 Kontrollierte Sprünge
    gp 10.11.1 continue
    gp 10.11.2 break
  gp 10.12 Direkte Sprünge mit goto
  gp 10.13 Notationsstil
    gp 10.13.1 K&R-Stil
    gp 10.13.2 Whitesmith-Stil
    gp 10.13.3 Allman-Stil
    gp 10.13.4 GNU EMACS-Stil
    gp 10.13.5 Der Stil des Autors ;) (K&R-like)


Galileo Computing - Zum Seitenanfang

10.9 Die do while-Schleiftoptop

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:

Abbildung
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.

 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de