Programmieren mit C


Inhalt


Willkommen

Installation

Das Terminal

Exkurs: Scanf und Sonderzeichen

Exkurs: continue & break

Statische Arrays

Exkurs: sizeof

Dynamische Arrays

Exkurs: Speicherbereiche

Funktionen

Exkurs: Funktionen & Arrays

Kommandozeilenparameter

Structs

Dateien

Anwendung: Textdatei einlesen

Hintergrund: Unicode

Stringbibliothek

Ausblick

Dark Mode

Schleifen: continue und break

Diese Woche haben wir uns mit den verschiedenen Schleifen in C beschäftigt. Eine Schwierigkeit hierbei ist das Verbinden von Logik in if-Konstrukten und Schleifen, vor allem mit continue und break Anweisungen.

int main() {
    int summe = 0;

    for(int i = 1; i < 10; ++i) {
        if( i > 4 && i < 8 ) {
            continue;
        }
        summe += i;
    }

    printf("Summe: %d\n", summe); // Summe: 27
}

In dem obigen Beispiel, werden einige Iterationsschritte durch das continue in der if-Abfrage übersprungen. Die Schleife ohne if-Abfrage würde 1+2+3+4+5+6+7+8+9 rechnen, da von 1 gestartet wird (int i=1), die Schleife durchgeführt wird, bis i größer gleich 10 ist (i < 10) und jede Iteration um 1 erhöht wird (++i).

Hier werden die Zahlen von 5 bis 7 durch die if-Abfrage ausgenommen. Übrig bleibt 1+2+3+4+8+9=27. Dazu sind zwei logische Bedingungen verkettet: i > 4 und i < 8. Setzen wir die Bedingungen einmal Schritt für Schritt um:

Wir starten mit 1+2+3+4+5+6+7+8+9. Zunächst schließen wir alle Zahlen, die die Bedingung i > 4 erfüllen, also alle Zahlen, die größer als 4 sind, aus. Übrig bleibt: 1+2+3+4.

Die zweite Bedingung schließt alle Zahlen, die kleiner als 8 sind aus. Übrig bleibt hier: 8+9.

Die beiden Bedingungen sind nun mit && verknüpft, es müssen also beide Bedingungen gleichzeitig gelten. Ausgeschlossen werden also alle Zahlen, die zugleich größer als 4 UND kleiner als 8 sind, also 5,6,7. Übrig bleibt: 1+2+3+4+8+9.

Eine gleichbedeutende Formulierung des Programmes ist:

int main() {
    int summe = 0;

    for(int i = 1; i < 10; ++i) {
        if( i > 4 && i < 8 ) {

        } else {
            summe += i;
        }
    }

    printf("Summe: %d\n", summe); // Summe: 27
}

Hierbei werden die Iterationen 5,6,7 nicht übersprungen, sondern einfach nichts gemacht. Die continue Anweisung überspringt hierbei die aktuelle Iteration. Besonders nützlich ist die Anweisung also bei for-Loops mit vielen Anweisungen, bei denen einige spezielle Fälle übersprungen werden sollen. Das gleiche Programm mit der break Anweisung liefert ein anderes Ergebnis.

int main() {
    int summe = 0;

    for(int i = 1; i < 10; ++i) {
        if( i > 4 && i < 8 ) {
            break;
        }
        summe += i;
    }

    printf("Summe: %d\n", summe); // Summe: 10
}

Die Logik aus dem vorherigen Beispiel gilt weiterhin. Die if-Anweisung wird bei 5,6,7 aufgerufen. Mit break wird jedoch die Schleife sofort beendet und nicht nur die aktuelle Iteration übersprungen. Übrig bleibt hier also: 1+2+3+4.

Für ein anderes Beispiel nehmen wir folgendes Programm an. Wir haben einen Rechner geschrieben, der entweder die Quadratwurzel, oder den Betrag einer Zahl ausgeben kann. Diese Optionen soll durch die Eingabe eines Buchstaben (char) gewählt werden können, ’s’/’S’ für die Quadratwurzel, ‘a’/‘A’ für den Betrag. Um falschen Eingaben vorzubeugen wollen wir alle anderen Eingaben abfangen und eine neue Eingabe ermöglichen. Die Lösung für dieses Problem könnte so aussehen:

int main() {
    char input = 0;
    int  i = 0;

    while ( input != 's' && input != 'a' &&
            input != 'S' && input != 'A'    ) {

        if ( i == 0 ) {
            printf("'s' für Quadratwurzel, ");
            printf("'a' für Betrag\n");
            ++i;
        } else {
            printf("Ungültige Eingabe. ");
            printf("Versuchen Sie es erneut:\n");
        }

        scanf(" %c", &input);
    }
}

Wir nutzen eine while-Schleife, die solange läuft, bis wir eine für unser Programm sinnvolle Eingabe bekommen haben. Dazu verknüpfen wir mehrere Bedingungen: input != ’s’, input != ‘a’, input != ’S’, input != ‘A’. Die Schleife wird also fortgesetzt, solange in unserem char input nicht entweder s, a, S, A steht. Durch die Verknüpfung mit && müssen alle Bedingungen gleichzeitig gelten, sollte also ein Vergleich nicht erfüllt sein - einer der gewünschten Buchstaben also eingegeben sein - so bricht die Schleife ab.

Die if-Abfrage dient in dem Beispiel der Unterscheidung zwischen der ersten Eingabe und der Eingabe nach einem Fehlversuch. Dazu nutzen wir eine Zählvariable i, die in jeder Iteration um 1 erhöht wird und bei 0 startet. Ist i also gleich 0, so wird die Schleife das erste Mal gestartet und eine Nachricht erscheint, was eingegeben werden soll. Ist i größer als 0, so wurde bereits eine ungültige Eingabe gemacht und eine andere Nachricht wird ausgegeben.