C-Tutorials.de Logo

zum Inhaltsverzeichnis

C Tutorial: Die kopf- und fußgetesteten Schleifen (while, do-while)


Die kopfgeteste Schleife: while

Was ist überhaupt eine Schleife? Schleifen sind dazu da bestimmte Codeteile, im Fall der while- bzw. do-while-Schleife, eine unbestimmte Anzahl oft zu wiederholen.
Es gibt 2 verschiedene while-Schleifen. Die while und die do-while. Zuerst aber die einfachere, die while:

#include <stdio.h>

int main ()
{
int eingabe = 0;

    while(eingabe != 51) //solange nicht die Tasten '3' gedrückt wird in der Schleife bleiben
    {
      printf("Ich bin in der Schleife!\n");
      eingabe = getch(); //den Wert, den getch() zurückgibt, 'eingabe' zuweisen
      //Die beiden Zeilen innerhalb der '{ }' werden so lange wiederholt wie die Bedingung wahr ist.
      //Die Bedingung wird nach Durchlauf der Schleife geprüft.
    }

  printf("\nJetzt bin ich draussen.");
  getch();
}

Der Aufbau der while Schleife ist im Endeffekt der gleiche wie der eines ifs ohne else-Teil. Man schreibt 'while(Bedingung)'. Die '{ }' umrahmen wieder den Teil vom Code der, in diesem Fall, wiederholt werden soll. Die Sache mit der Bedingung funktioniert genauso wie beim if. Jetzt zur Erklärung von den neuen Elementen des Beispielcodes:
In diesem Fall ist es unbedingt erforderlich der Variablen 'eingabe' beim Definieren einen Wert zuzuweisen, weil die Variable überprüft wird, bevor wir etwas daran verändern können.
Die Bedingung heißt 'eingabe != 51'. Das Programm springt allerdings aus der Schleife wenn man die Taste 3 drückt (die Bedingung 'eingabe != 51' ist nicht mehr wahr). Das liegt daran, das in der Schleife der Variablen der Rückgabewert der Funktion 'getch()' zugewiesen wird. Zuweisungen wurden schon früher besprochen. Der Rückgabewert von 'getch()' entspricht dem ASCII-Code der gedrückten Taste. Der ASCII-Code der Taste 3 ist eben 51. Das heißt, 'getch()' wartet nicht nur auf einen Tastendruck, sondern sagt uns auch noch welche Taste gedrückt wurde.
Willst du den ASCII-Code einer Taste wissen, fragst du entweder Google nach einer ASCII Tabelle oder verwendest dieses kleine Programm: ASCII VIEW (wichtig ist nur der dezimale Wert, die anderen sind nur ein Produkt langer Weile) oder compile dieses kleines Programm:

#include <stdio.h>

int main ()
{
  while(1) //Endlosscheife
    {
      printf("%i\n",getch()); //Wert, den getch() zurück gibt, ausgeben
    }
}

Da du die while-Schleife jetzt (hoffentlich) verstanden hast, kannst deinen Taschenrechner vom vorherigen Teil nehmen und so erweitern, das nach einer Rechnung gefragt wird, ob man nochmal eine Rechnung durchführen möchte oder nicht (j drücken für ja, eine andere Taste für nein). Ich werde eine neue Funktion in der Lösung verwenden, alle Zeichen auf dem Bildschirm überschreibt und den Curser wieder nach links oben in die Ecke setzt: 'system("CLS")'. Zusätzlich wird noch an geeigneten Stellen scanf durch getch() ersetzt. Lösung:

#include <stdio.h>

int main ()
{
int auswahl;
float zahl1;
float zahl2;
int NochmalRechnen = 106; //106 = 'j' = ja

  while(NochmalRechnen == 106) //solange 'j' gedrückt wird ist die Bedingung wahr
    {                                                //und die Schleife wird nochmal ausgeführt
      printf("Moechtest du +(1), -(2), *(3) oder /(4) rechnen?");
      printf("\nDruecke die entsprechende Taste.");
      auswahl = getch(); /*Hier ist jetzt das getch()
                        und die cases wurden angepasst*/
      printf("\n\nGib Zahl 1 ein: ");
      scanf("%f",&zahl1);
      printf("Gib Zahl 2 ein: ");
      scanf("%f",&zahl2);

      switch(auswahl)
        {
          case 49: //'1'
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",zahl1 + zahl2);
              break;
          case 50: //'2'
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",zahl1 - zahl2);
              break;
          case 51: //'3'
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",zahl1 * zahl2);
              break;
          case 52: //'4'
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",zahl1 / zahl2);
              break;
          default:
              printf("\n\nDeine Auswahl entsprach keinem definierten Rechenzeichen!");
              break;
        }
      printf("\n\nNochmal? j fuer ja, eine andere Taste fuer nein druecken.");
      NochmalRechnen = getch(); //einlesen
      system("CLS"); //Bildschirm löschen
    }
}

Die fußgeteste Schleife: do-while

Der Unterschied zur while-Schleife ist der, dass die do-wihle-Schleife mindestens einmal ausgeführt wird, bevor die Bedingung geprüft wird und der Inhalt der Schleife dann bei entsprechender Bedingung nochmal ausgeführt wird. Dieses Codebeispiel macht das selbe wie das erste Codebeispiel von der wihle-Schleife weiter oben:

#include <stdio.h>

int main ()
{
int eingabe; /*Jetzt brauchen wir der Variablen zu Anfang keinen Inhalt geben, weil
            der Wert vor der ersten Überprüfung sowieso verändert werden würde.*/

    do
    {
      printf("Ich bin in der Schleife!\n");
      eingabe = getch();
    }
  while(eingabe != 51);

  printf("\nJetzt bin ich draussen.");
  getch();
}

Zuerst schreiben wir 'do', öffnen die geschweifte Klammer '{', schreiben den zu wiederholenden Code, schließen die geschweifte Klammer '}' und schreiben dann 'while(Bedingung);'. Eigentlich ganz einfach und im Prinzip das selbe wie die while-Schleife, nur das die Bedingung eben erst nach einmaligem Durchlauf geprüft wird. Jetzt darfst du den Taschenrechnercode von eben so verändern, der er mit einer do-while-Schleife funktioniert. Lösung:

#include <stdio.h>

int main ()
{
int auswahl;
float zahl1;
float zahl2;
int NochmalRechnen; //wieder keine Inhalt notwendig weil vor Überprüfung verändert

  do //Veränderung
    {
      printf("Moechtest du +(1), -(2), *(3) oder /(4) rechnen?");
      printf("\nDruecke die entsprechende Taste.");
      auswahl = getch();

      printf("\n\nGib Zahl 1 ein: ");
      scanf("%f",&zahl1);
      printf("Gib Zahl 2 ein: ");
      scanf("%f",&zahl2);

      switch(auswahl)
        {
          case 49:
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",zahl1 + zahl2);
              break;
          case 50:
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",zahl1 - zahl2);
              break;
          case 51:
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",zahl1 * zahl2);
              break;
          case 52:
              printf("\n\nDas Ergebnis deiner Rechnung lautet: %f",zahl1 / zahl2);
              break;
          default:
              printf("\n\nDeine Auswahl entsprach keinem definierten Rechenzeichen!");
              break;
        }
      printf("\n\nNochmal? j fuer ja, eine andere Taste fuer nein druecken.");
      NochmalRechnen = getch();
      system("CLS");
    }
  while(NochmalRechnen == 106); //Veränderung
}

Vielleicht fragst Du dich jetzt, warum es eigendlich zwei Schleifen Typen gibt, wenn man doch mit beiden das gleiche erreichen kann. Nunja, der Sinn ist der, die entsprechende Schleife zu verwenden die den Code am leserlisten macht. Wenn eine Schleife auf jeden Fall ein mal ausgeführt werden soll, dann verwende auch die do-while. Da macht es einem Fremden leichter die Funktionsweise deines Programms zu verstehen.

zum Inhaltsverzeichnis