B.5    Antworten und Lösungen zu Kapitel 6

  1. Schleifen sind Kontrollstrukturen, mit denen Anweisungen, die meistens in einem Anweisungsblock zusammengefasst sind, so oft wiederholt werden, bis eine bestimmte Abbruchbedingung erreicht wird.

  2. In C stehen die Zählschleife for, die kopfgesteuerte Schleife while und die fußgesteuerte Schleife do-while zur Verfügung.

  3. Muss ein Block von Anweisungen mindestens einmal ausgeführt werden, sollten Sie die do-while-Schleife verwenden. Mithilfe der do-while-Schleife wird die Abbruchbedingung nämlich erst am Ende des Schleifenrumpfes überprüft. Alternativ kann auch mithilfe der while- oder for-Schleife und der break-Anweisung eine solche einmal auszuführende Schleife nachgebildet werden.

  4. Mit dem Schlüsselwort break können Sie eine Schleife vorzeitig verlassen, und mit dem Schlüsselwort continue können Sie den aktuellen Schleifendurchlauf vorzeitig beenden.

  5. Die Schleife gibt gar nichts aus und wird nach der ersten Überprüfung wieder abgebrochen. In diesem Beispiel wurde eine falsche Abbruchbedingung in der Schleife definiert. Die Schleife wird ausgeführt, solange der Wert von ival größer als 10 ist, und das trifft hier gleich von Beginn an nicht zu. Die Schleifenbedingung müsste zusammen mit while lauten: Solange der Wert von ival kleiner als 10 ist, also:

    while ( ival < 10 ) {
    ...
    }
  6. Dies ist ein typischer, aber nicht sofort ersichtlicher logischer Fehler. Bei den Gleitpunktzahlen gibt es das Problem, dass sie nicht exakt dargestellt werden können. In diesem Beispiel sollten Sie daher unbedingt auf kleiner-gleich statt auf ungleich prüfen. Die bessere Lösung wäre also:

    for(float fval = 0.0f; fval <= 1.0f; fval+=0.1f) {
    printf("%f\n", fval);
    }
  7. Nach dem ersten Schleifendurchlauf wird in diesem Beispiel noch 0 ausgegeben. Im nächsten Schleifendurchlauf, wenn die Schleifenvariable den Wert 1 hat, trifft die if-Verzweigung zu, dass eine Division von ival durch 2 einen Rest ergibt. Deshalb springt das Programm mit continue wieder zum Kopf der while-Schleife zurück. Dort hat sich die Bedingung aber nicht geändert, und im nächsten Schleifendurchlauf ist die Bedingung der if-Verzweigung wiederum wahr. Dieser Zustand ändert sich auch nach mehreren Durchläufen nicht. Sie haben also quasi in diesem kleinen Bereich eine Endlosschleife erzeugt. Wegen des Schlüsselwortes continue wird auch das Hochzählen der Schleifenvariable ival++ nicht mehr ausgeführt. Dies ist aber von enormer Bedeutung für die Beendigung der Schleife. Besser wäre es also, die Schleifenvariable noch vor der continue-Anweisung hochzuzählen. Noch sicherer wäre es, eine for-Schleife zu verwenden:

    int ival=0;
    for(ival = 0; ival < 20; ival++) {
    if(ival % 2) {
    continue;
    }
    printf("%d\n", ival);
    }
  8. Hierzu eine Musterlösung:

    00  // kap006/loesung001.c
    01 #include <stdio.h>

    02 int main(void) {
    03 double geld=0.0, zs_tmp=0.0, zs=0.0;
    04 unsigned int jahre=0;
    05 printf("Welchen Geldbetrag wollen Sie einzahlen: ");
    06 if( scanf("%lf", &geld) != 1 ) {
    07 printf("Fehler bei der Eingabe...\n");
    08 return 1;
    09 }
    10 printf("Wie viel Zinsen bekommen Sie hierbei(%%): ");
    11 if( scanf("%lf", &zs_tmp) != 1 ) {
    12 printf("Fehler bei der Eingabe...\n");
    13 return 1;
    14 }
    15 zs = (zs_tmp / 100) + 1.0f;
    16 printf("Wie viele Jahre wollen Sie sparen : ");
    17 if( scanf("%u", &jahre) != 1 ) {
    18 printf("Fehler bei der Eingabe...\n");
    19 return 1;
    20 }
    21 for(unsigned int i = 0; i < jahre; geld=geld*zs, i++ ) {
    22 printf("%2u. Jahr: %.2lf\n",i+1, geld);
    23 }
    24 return 0;
    25 }

    Das Programm gibt bei der Ausführung z. B. Folgendes aus:

    Welchen Geldbetrag wollen Sie einzahlen: 100000
    Wie viel Zinsen bekommen Sie hierbei(%): 1.2
    Wie viele Jahre wollen Sie sparen : 10
    1. Jahr: 100000.00
    2. Jahr: 101200.00
    3. Jahr: 102414.40
    4. Jahr: 103643.37
    5. Jahr: 104887.09
    6. Jahr: 106145.74
    7. Jahr: 107419.49
    8. Jahr: 108708.52
    9. Jahr: 110013.02
    10. Jahr: 111333.18