C++ Kurs

while-Schleifen

Die Themen:

Einleitung
while-Schleife
do-Schleife
Beispiel und Übung

Einleitung

Außer der in der vorherigen Lektion beschriebenen for-Schleife gibt es noch die while-Schleife. Während die for-Schleife hauptsächlich dann eingesetzt wird, wenn schon vor dem Eintritt in die Schleife die Abbruchbedingung bekannt ist, so wird die while-Schleife dagegen hauptsächlich eingesetzt, wenn die Abbruchbedingung erst innerhalb der Schleife selbst festgestellt werden kann.

Selbstverständlich können Sie jederzeit eine for-Schleife gegen eine while-Schleife austauschen und umgekehrt, wenn Sie etwas mehr Aufwand spendieren.

Und damit es mal wieder nicht gar zu einfach wird gibt es zwei Arten von while-Schleifen:

while-Schleife

Bei der while-Schleife wird vor dem Eintritt in die Schleife bereits abgeprüft, ob die Schleife überhaupt durchlaufen werden muss. Sie hat folgende Syntax:

while (Ausdruck)
   Aktion;

Ausdruck kann jeder C++ Ausdruck sein der entweder ein ganzzahliges oder boolsches Ergebnis liefert.

Sie erinnern sich doch noch: jeder Wert ungleich 0 wird auch als true interpretiert und der Wert 0 als false!

Der Ausdruck muss immer in Klammern stehen und nach der Klammer folgt (in der Regel) kein Semikolon!

Die auf den Ausdruck folgende Aktion wird nun sooft wiederholt, so lange die Auswertung des Ausdrucks true ergibt. Und auch hier gilt, wie bei der for-Schleife, dass die Aktion standardmäßig nur aus einer Anweisung besteht. Sollen mehrere Anweisungen ausgeführt werden, was der Regelfall wohl ist, so müssen die Anweisungen in einen Block {...} eingeschlossen werden.


...
// Abbruchkriterium initialisieren
bool done = false;
// Schleifenbeginn
while (!done)
{
   ... // Hier irgend wann done auf auf true setzen
   ... // damit Schleife beendet wird.
}

Eine häufige Fehlerquelle bei diesem Schleifentyp ist das Vergessen der Initialisierung des Abbruchkriteriums. Wird das Abbruchkriterium (im obigen Beispiel die Variable done) nicht initialisiert, so wird die Schleife unter Umständen nicht durchlaufen!

do-Schleife

Diese Schleife wird immer mindestens einmal durchlaufen, da das Abbruchkriterium erst am Ende der Schleife abgeprüft wird. Die Schleife besitzt folgende Syntax:

do
   Aktion;
while (Ausdruck);

Für den Ausdruck und die Aktion gilt das Gleiche wie bei der vorherigen while-Schleife. Die Aktion besteht ebenfalls standardmäßig aus einer Anweisung, mehrere Anweisungen sind also wieder in einen Block {...} einzuschließen. Und Ausdruck kann wieder jeder beliebige ganzzahlige oder boolsche  C++ Ausdruck sein. Die Schleife wird auch hier so lange durchlaufen, so lange die Auswertung des Ausdrucks true ergibt.


...
// Abbruchkriterium initialisieren
bool done = false;
do
{
   ... // Hier irgend wann done auf auf true setzen
   ... // damit Schleife beendet wird.
} while (!done); 

Beachten Sie bitte, dass nach der Klammer des Ausdrucks hier ein Semikolon steht!

Auch mit while-Schleifen lassen sich Endlos-Schleifen erzeugen, wie die nachfolgenden Beispiele aufzeigen. Als Ausdruck wird hier ganz einfach der Wert true oder eine Ganzzahl-Konstante ungleich 0 eingesetzt.


// Endlos while-Schleife
while (true)
{
   ...
}

// Endlos do-while Schleife
do
{
   ...
} while(1);

Beispiel und Übung

Beispiel:

Das Programm liest aus der Textdatei while.dat verschiedene double-Werte in einer while-Schleife ein und berechnet daraus den Mittelwert.

Um das Dateiende festzustellen, wird nach dem Einlesen eines Wertes mit der ifstream Memberfunktion eof() das Erreichen des Dateiendes abgeprüft. Wie in der Lektion über Dateistreams bereits erläutert, liefert die Memberfunktion true wenn das Dateiende erreicht wurde.

Die eingelesenen Werte so wie der Mittelwert werden zur Kontrolle ausgegeben.

Nachfolgend der Inhalt der Datei while.dat. Wenn Sie das Beispiel ausführen wollen, erstellen Sie zuvor im Root-Verzeichnis des VC++ Projekts diese Datei.


10.1 20.2 30.3 40.4 50.5 60.6

1. Wert: 10.1
2. Wert: 20.2
3. Wert: 30.3
4. Wert: 40.4
5. Wert: 50.5
6. Wert: 60.6
Mittelwert der Zahlen: 35.35  


// Beispiel zur while-Schleife

// Zuerst Dateien iostream und iomanip einbinden

#include <iostream>
#include <fstream>

using std::cout;
using std::endl;

// Konstante für Dateinamen definieren
const char* const pFILENAME = "while.dat";

// Variablen definieren
double summe;
short zaehler;

// main() Funktion
int main ()
{
   // Eingabestream-Objekt definieren und mit Datei verbinden
   std::ifstream InFile;
   InFile.open(pFILENAME);
   // Fehler abfangen!
   if (!InFile)
   {
      cout << "Datei " << pFILENAME << " konnte nicht geöffnet werden!\n";
      exit (1);
   }
   // Summe und Zähler initialisieren
   summe = 0.0;
   zaehler = 0;

   // Daten aus Datei einlesen bis Dateiende
   do
   {
      // Variable zum Einlesen eines Werts
      double wert;
      // Wert einlesen
      InFile >> wert;
      // Falls nicht Dateiende erreicht
      if (!InFile.eof())
      {
         // Wert zur Kontrolle ausgeben und gleichzeitig Zähler erhöhen
         cout << ++zaehler << ". Wert: " << wert << endl;
         // Wert aufsummieren
         summe += wert;
      }
   } while (!InFile.eof());
   // Bei Dateiende Schleife beenden

   // Datei wieder schliessen
   InFile.close();

   // Falls Werte eingelesen wurden
   if (zaehler)
      // Mittelwert ausgeben
      cout << "Mittelwert der Zahlen: " << summe/zaehler << endl;
   else
      // sonst Meldung ausgeben
      cout << "Keine Werte eingelesen!\n";
}

Übung:

Für eine einmalige Einlage auf einem Sparkonto ist der sich ergebende Kontostand nach jedem Jahr zu berechnen und auszugeben. Der Kontostand ist mit 2 Nachkommastellen auszugeben.

Die einmalige Einlage so wie der Zinssatz (in Prozent) sind über die Tastatur einzulesen.

Danach ist der Kontostand so lange auszugeben, bis sich entweder die Einlage mindestens verdoppelt hat (siehe Ausgabe unten) oder aber 10 Jahre abgelaufen sind.

Welcher Betrag soll verzinst werden? 100
Und zu welchem Zinssatz (in Prozent)? 12
Am Ende des 1. Jahr: 112.00
Am Ende des 2. Jahr: 125.44
Am Ende des 3. Jahr: 140.49
Am Ende des 4. Jahr: 157.35
Am Ende des 5. Jahr: 176.23
Am Ende des 6. Jahr: 197.38
Am Ende des 7. Jahr: 221.07 

Lösung ansehen!