Willkommen beim fünften Teil des C-Kurses!

Doch zum Anfang eine kleine Übungsaufgabe, ob man noch fit vom letzten Kursteil ist. Das folgende Programm ist ein kleines, aber feines Modul, das die Inhalte zweier Variablen tauscht. Ein Klassiker sozusagen:
 

void vertausche ( int *zahl1, int *zahl2 ) 
{
    int temp;

     
    temp = *zahl1;
    *zahl1 = *zahl2; 
    *zahl2 = temp; 
}

Aufgerufen wird das Modul mit:
 

swap ( &a , &b );

wobei a und b zwei Integer-Variablen sind. Versuchen sie zu verstehen, wieso man hier mit Adressen arbeitet und welche Vorteile dieses Verfahren haben könnte.

Genug der Übung und frisch ans Werk.

Diesmal befassen wir uns mit Schleifen und bedingten Anweisungen.
 
 
 
 
Schleifen:

Prinzipiell gibt es zwei Arten von Schleifen: Die vorprüfenden und die nachprüfenden Schleifen. Die vorprüfenden Schleifen prüfen vor dem Schleifenkörper und die nachprüfenden Schleifen nach dem Schleifenkörper, ob eine Bedingung wahr ist.

Wenn der Schleifenkörper aus einem Befehl besteht, können die geschweiften Klammern weggelassen werden.
 
 
 
while

 
 

while ( Bedingung )
    { Schleifenkörper } 

Der Schleifenkörper wird solange wiederholt, solange die Bedingung erfüllt ist.
Die Prüfung der Bedingung erfolgt immer vor der Ausführung des Schleifenkörpers.

Beispiel:
 

#include <stdio.h>

 
void main ( void
{
int i = 0; 
while ( i <= 10 )
{
printf ( "i = %d\n",i ); 
i=i+1; 
}
}

Der Schleifenkörper wird nun solange durchlaufen, bis die Bedingung nicht mehr wahr ist, d.h. bis i > 10 ist. Hier wird vor jedem Durchgang geprüft, ob die Bedingung zutrifft.
 
 
 
do

 
 

do
    { Schleifenkörper } 
while ( Bedingung );

Hier gilt das selbe, wie bei while-Schleifen, nur das nach der Ausführung des Schleifenkörpers die Bedingung geprüft wird, ob ein erneutes durchlaufen der Schleife nötig ist. Man muß immer beachten: Hinter dem while [Bedingung] steht immer ein Semikolon!

Beispiel:
 

#include <stdio.h>

 
void main ( void
{
int i= 0; 

 
do 
{
printf ( "i = %d\n",i ); 
i=i+1;
}
while ( i <= 10 );
}

 
 
 
for

 
for (  Initialisierung  ;  Bedingung  ;  Anweisung  ) 
    { Schleifenkörper }

Bei einer for-Schleife wird zuerst die Initialisierung abgearbeitet. Solgange die Bedingung wahr ist, wird der Schleifenkörper und anschließend die Anweisung ausgeführt. Danach wird wieder die Bedingung geprüft, und so weiter.
Sieht alles sehr kryptisch aus. Also schreiben wir das ganze etwas um und erhalten als equivalent folgenden Ausdruck:
 

Initialisierung; 

 
while ( Bedingung )
    Schleifenkörper; 
    Anweisung; 
}

Als Praxisbeispiel:
 

#include <stdio.h>

 
void main ( void
{
int i= 0; 

 
for ( i = 0 ; i <= 10 ; i = i+1 ) printf ("i = %d \n",i);

}

Hier haben wir den Eingangssatz angewendet das, wenn der Schleifenkörper aus einem Befehl besteht, die geschweiften Klammern wegfallen können. Oberes Beispiel ist, wenn wir unsere Erläuterung einer for-Schleife anschauen, das selbe wie das Beispiel der while-Schleife. Nur etwas kürzer :-)
 
 

for ( i = 0 ; i <= 10 ; i = i+1 ) 
{
printf ("i = %d \n",i);
}
i = 0; 
while ( i <= 10 )
{
printf ( "i = %d\n",i ); 
i=i+1; 
}

 
 
 
Bedingte Anweisungen

Im Gegensatz zu den Schleifen, wo ein Schleifenkörper solange abgearbeitet wird, solange die Bedingung wahr ist, wird in bedingten Anweisungen die Anweisung einmal abgearbeitet, wenn die Bedingung wahr ist. Bei vergleichen bitte immer auf die Variablentypen achten!
 
 
 
if

 

if ( Bedingung ) 
    { Körper1 }
else
    { Körper2 }

Wenn die Bedingung wahr ist, wird der Befehls-Körper1 abgearbeitet. Wenn die Bedingung nicht zutrifft wird die Alternative im Befehls-Körper2 abgearbeitet.

Natürlich kann man das else weglassen, dann wird keine Alternative ausgeführt.

Beispiel:
 
 

#include <stdio.h>
void main void
{
if ( t == 2 ) 
{
printf ( "\nHallo, t ist 2\n");
printf ( ".... wirklich :-)\n\n");
}
}

...oder als 2. Beispiel ....
 

#include <stdio.h>
void main void
{
if ( t == 2 ) 
{
printf ( "\nHallo, t ist 2\n");
printf ( ".... wirklich :-)\n\n");
}
else
{
printf ( "\nSchade...\n");
printf ( " ... t ist nicht 2\n");
}
}

Warum das Doppel-Gleichzeichen ? Ein einfaches Gleichzeichen ist immer eine Zuweisung, z.B. b = 3. Würde nun in der Klammer t = 2 stehen, so würde t erst der Wert 2 zugeordnet werden und dann eine Überprüfung auf wahr erfolgen, der ist bei positiven Werten ungleich Null immer wahr!

Wird nun ein Vergleich angestellt muß nun ein Doppel-Gleichzeichen stehen!
 
 
 
if & else if

Jetzt steht natürlich die Frage im Raum, was ist, wenn man mehrere Abfragen kombinieren will ? Als eine Methode empfiehlt sich der Gebrauch von else if-Konstrukten.
 

if ( Bedingung1 ) 
    { Körper1 }
else if ( Bedingung2 )
    { Körper2 }
else
    { Körper3 }

Hier wird erst die erste Bedingung geprüft. Trifft diese nicht zu, wird die zweite geprüft. Wenn ja, so wird der Befehls-Körper2 ausgeführt. Trifft keine der Bedingungen zu, so wirde der Befehls-Körper3 ausgeführt.

Zu beachten ist: Wird eine Bedingung auseführt, so werden die anderen Fälle ignoriert.

Beispiel:
 

if ( t == 1 ) 
printf ( "\n t = 1 \n" ); 
else if ( t == 2 ) 
printf ( "\n t = 2 \n");
else 
printf ("\n t ist weder 1 noch 2\n");

Man kann sich jetzt natürlich vorstellen, das es etwas ermüdend sein kann, wenn man sehr viele Fallunterscheidungen machen will. Auch für solche Probleme wurde gesorgt....
 
 
 
switch & case

 

switch ( Variable ) 

    case Term1: 
      Aktion1; 
      break
    case Term2 : 
      Aktion2;
      break;
    default:
      Aktion3; 
}

Hier wird eine Variable auf Gleichheit untersucht. Mit der switch-Anweisung gibt man die zu untersuchende Variable an. Als erstes wird geprüft ob die Variable dem Term1 entspricht, wenn ja, so wird Aktion1 ausgeführt. Diese können beliebeig viele sein. Abgeschlossen werden die Aktionen mit einem break! Solange kein break auftritt werden alle weiteren Befehle abgearbeitet.
Danach wird der nächste Vergleich angestellt, u.s.w. Hinter dem Schlüsselwort default steht kein Vergleich, da diese Aktionen ausgeführt werden, wenn sich keine Übereinstimmungen in den oberen Fällen ergab. Also ein Default-Anweisung, solange kein anderer Fall eintritt. Da dieser als letztes angefhrt wird, benötigt man hier keine break-Anweisung.

Beispiel:
 

char i; 
switch ( i )
{
    case 'a' :
      printf ( "\n i = a \n" );
      break;

       
    case 'b' : 
      printf ( "\n i = b \n" );
      printf ( "Schade :-(\n" );
      break;

       
    default:
      printf ( "\n i war weder a noch b \n"); 
      printf ( "\n ...ist aber nicht so schlimm :-)\n");
}

War ein bischen viel Theorie auf einmal, oder ? Am besten versucht man zu jeder Schleifenart ein kleines Beispielprogramm zu schreiben. Natürlich kann man auf die Beispiele zurückgreifen. Bitte daran denken, das die Beispiele keine vollständigen Programme sind!
 
 
 
 
Hausaufgaben

1) Schreiben sie ein Programm, welches eine eingegebene Zahl als Wortlaut auf den Bildschirm ausgibt. Z.B.:
 

Eingabe => 5 

Ausgabe => fuenf

2) Schreiben sie je ein Programm mit den verschiedenen Schleifentypen,. die die Zahlen von 2 bis 7 auf dem Bildschirm ausgeben.

Überlegen sie auch, woher bestimmte Überraschungen herrühren könnten.
 
 
 
 
 
...das Obligatorische

Autor: Sebastian Cyris \ PCD Bascht

Dieser C-Kurs dient nur zu Lehrzwecken! Eine Vervielfältigung ist ohne vorherige Absprache mit dem Autor verboten! Die verwendete Software unterliegt der GPL und unterliegt der Software beiliegenden Bestimmungen zu deren Nutzung! Jede weitere Lizenzbestimmung die der benutzten Software beiliegt, ist zu beachten!