peace software
  Berndt Wischnewski  Richard-Wagner-Str. 49  10585 Berlin 
  Tel.: 030 - 3429075  FAX : 030 34704037  email: webmaster@peacesoftware.de  Ust-ID: DE135577379 
<= Previous

 

C Kurs - Schleifen - while Schleife: machs mir solange bis der Arzt kommt

Es ist ja schon ganz nett, wenn man einen Teil des Programnes für eine bestimmte Anzahl von Durchgängen wiederholen kann. Was jedoch wenn man die Anzahl der Durchgänge gar nicht kennt? Ein typisches Beispiel ist die Verabeitung eines Wortes, eingegeben durch den Benutzer oder gelesen aus einer Datei. Die Länge des Wortes, Anzahl der Buchstaben kann das Programm leider nicht voraussehen. Die Lösung dieses Problems ist die while Schleife, die solange läuft, bis das Abbruchkriterium erfüllt wird. Man kann sich eine while Schleife wie eine for Schleife vorstellen, die nur aus dem Abbruchkriterium besteht.

Die generelle Form der while Schleife ist:

while ( Bedingung )
{
   Anweisungen;
}

Am besten erst eimal ein Beispiel:

#include <stdio.h> // für printf und sprintf
#include <string.h>// für strlen
#include <ctype.h> // für toupper

char daswort[100]; // ein Array von characters also ein string
int i = 0, x = 0;

sprintf(daswort, "hi babes"); // der string wird gefüllt; print-formatted in einen string, wird später erklärt
x = strlen(daswort); // string length Funktion, gibt die Anzahl der Zeichen in einem string zurück

while(i < x) // mach es solange, wie i kleiner als x ist
{
   // to upper, Funktion die kleingeschriebene Buchstaben in großgeschriebene verwandelt
   daswort[i] = toupper(daswort[i]);
   i++;
}
printf("%s", daswort); // Ausgabe mit print formatted

ergibt folgenden output:

HI BABES

Die while Schleife läuft solange wie die Bedingung im Schleifenkopf wahr ist, und bricht dann ab, wenn diese falsch wird. Um Zählvariablen, in unserem Beispiel i, muß man sich selber kümmern.

Was passiert nun, wenn die Schleifenbedingung von vorne herein falsch ist? Nun gar nichts, die while Schleife wird einfach übersprungen. Hier ein Beispiel:

int i = 10, x = 0, y = 0;

while(i < x)
{
   i++;
   y = i;
}
printf("y: %d", y);

ergibt folgenden output:

y: 0

Diskussion:

Fast immer lassen sich while Schleifen in for Schleifen überführen, in unserem Beispiel kann man, wenn man die Länge des strings schon kennt, sie ist x, genausogut schreiben:

for(i = 0; i < x; i++
{
...
}

Welche Schleife man nun nimmt, for oder while, sollte man mit etwas Fingespitzengefühl auswählen. Wenn man das Gefühl hat, die Abbruchkriterien der Schleife sind eher unbestimmt, sollte man nicht lange nachdenken um diese zu berechnen, sonder eine while Schleife programmieren. Wenn man andersrum meint, alle Laufbedingungen der Schleife zu kennen, nimmt man am besten eine for Schleife.

Eleganter kann man die while Schleife auch so kodieren, in dem man eine Funktion in den Schleifenkopf einfügt, in unserem Beispiel etwa so:

while(i < strlen(daswort))
    daswort[i] = toupper(daswort[i++]);

Hier kann man nun fragen, ob bei jedem Schleifendurchlauf die Funktion strlen(...) aufgerufen wird, und dass das Programm dadurch langsamer wird, so steht es schließlich im Programmkode. Die Antwort ist, im Prinzip nein, aber... alle C Compiler die ich kenne optimieren solche Konstruktionen dahingehend, dass wenn möglich die Funktion nur einmal ausgeführt wird. Ich kenne aber nicht alle C Compiler, außerdem kann man Compileroptimierungen auch abschalten. Und wenn man sich Mühe gibt, kann man die Funktion so komplex gestalten, dass es der Compiler nicht mehr schafft, eine optimale Ausführung zu generieren.

 


Will man unbedingt, dass die Schleife einmal durchlaufen wird, benutzt man die do-while Schleife. Hier wird die Abbruchbedingung erst am Ende getestet.

Die generelle Form der do-while Schleife ist:

do
{
   Anweisungen;
}while ( Bedingung ); // Semikolon nicht vergessen

Hier kommt auch schon ein Beispiel:

char c;

do
{
   c = getchar(); // liest einen Anschlag von der Tatstatur
   printf("Sie haben '%c' gedrückt\n", c); // gibt das gedrückte Zeichen aus
}while( c != 'q'); // Läuft solange wie man nicht q drückt. Wenn q, wie quit, gedrückt wurde, beendet sich die Schleife

 

<= Previous











Wie man besser nicht programmiert, Fehler sucht und findet: