🏠 Startseite

🔁 Vorlesung 6
Schleifen

Grundlagen der Programmierung in C

HTW Berlin • WiSe 2025/26

📋 Agenda

  • Wiederholung: Verzweigungen
  • for-Schleife: Bekannte Anzahl von Durchläufen
  • while-Schleife: Bedingung am Anfang prüfen
  • do-while-Schleife: Bedingung am Ende prüfen
  • Schleifensteuerung: break und continue
  • Formatierte Ausgabe: Tabellen erstellen
  • Praxis: Beispiele und Übungen

🔄 Was sind Schleifen?

Schleifen wiederholen Programmteile mehrmals, abhängig von Bedingungen oder einer festgelegten Anzahl.

Warum Schleifen?

  • ✅ Vermeidung von Code-Wiederholung
  • ✅ Verarbeitung großer Datenmengen
  • ✅ Effizientere Programme
  • ✅ Flexibilität bei unbekannter Anzahl von Durchläufen

🎯 Drei Typen von Schleifen in C

Typ Verwendung Prüfung
for Wenn die Anzahl der Durchläufe bekannt ist Am Anfang
while Bedingung wird am Anfang geprüft
(kann 0-mal ausgeführt werden)
Am Anfang
do-while Bedingung wird am Ende geprüft
(wird mindestens 1-mal ausgeführt)
Am Ende

💡 Tipp: Wählen Sie den passenden Schleifentyp je nach Anforderung!

🔢 Die for-Schleife

Die for-Schleife verwendet man, wenn die Anzahl der Durchläufe bekannt ist.

for (int i = 0; i < 10; i++)
{
    // Code wird 10-mal ausgeführt
    printf("Durchlauf %d\n", i);
}

                

Drei Teile der for-Schleife:

  1. Initialisierung: int i = 0 (einmalig am Start)
  2. Bedingung: i < 10 (vor jedem Durchlauf geprüft)
  3. Änderung: i++ (nach jedem Durchlauf)

📝 for-Schleife: Praktisches Beispiel

Aufgabe: Berechne Summe und Preis von 3 Artikeln

#include <stdio.h>

int main()
{
    int anzahl, nummer;
    double preis, summeRechnung;

    summeRechnung = 0.0;

    /* Regelmäßige Wiederholung */
    for(nummer = 1; nummer < 4; nummer = nummer + 1)
    {
        printf("Artikel %d, Anzahl: ", nummer);
        scanf("%d", &anzahl);

        printf("Artikel %d, Preis in Euro: ", nummer);
        scanf("%lf", &preis);

        summeRechnung = summeRechnung + anzahl * preis;
    }

    printf("Summe der Rechnung: %.2f Euro\n", summeRechnung);

    return 0;
}

                

🔄 Ablauf der for-Schleife

Schrittweise Erklärung:

  1. Startanweisung: nummer = 1 (einmalig)
  2. Laufbedingung prüfen: Ist nummer < 4?
  3. Falls ja: Code-Block ausführen
  4. Änderung: nummer = nummer + 1
  5. Zurück zu Schritt 2

Wichtig zu beachten:

  • ✓ Die Variable kann innerhalb der Schleife mehrfach genutzt werden
  • ✓ Der Wert wird nicht nach jedem Gebrauch geändert
  • ✓ Nach Berechnung wird der neue Wert wieder zugewiesen

⚡ Die while-Schleife

Die while-Schleife prüft die Bedingung vor jedem Durchlauf.

while (bedingung)
{
    // Code wird ausgeführt, solange Bedingung wahr ist
}

                

Unterschied zu for:

  • ✓ Bedingung am Anfang (Kopfgesteuert)
  • ✓ Kann 0-mal ausgeführt werden
  • ✓ Gut für unbekannte Anzahl von Durchläufen
  • ✓ Oft verwendet mit Benutzereingaben

⚠️ Achtung: Kein Semikolon direkt nach dem Kopf der while-Schleife!

📝 while-Schleife: Praktisches Beispiel

Aufgabe: Benutzer bestimmt, wie oft die Schleife läuft

#include <stdio.h>

int main()
{
    int anzahl, nummer, nochEiner;
    double preis, summeRechnung;

    nummer = 0;
    summeRechnung = 0.0;

    /* Abfrage */
    printf("Wollen Sie Artikel eingeben (Ja=1, Nein=0): ");
    scanf("%d", &nochEiner);

    /* Bedingte Wiederholung */
    while(nochEiner == 1)
    {
        nummer = nummer + 1;

        printf("Artikel %d, Anzahl: ", nummer);
        scanf("%d", &anzahl);

        printf("Artikel %d, Preis in Euro: ", nummer);
        scanf("%lf", &preis);

        summeRechnung = summeRechnung + anzahl * preis;

        printf("Noch ein Artikel (Ja=1, Nein=0): ");
        scanf("%d", &nochEiner);
    }

    printf("Summe der Rechnung: %.2f Euro\n", summeRechnung);
    return 0;
}

                

🔄 Ablauf der while-Schleife

Schrittweise Erklärung:

  1. Variable initialisieren: nochEiner (vor der Schleife)
  2. Bedingung prüfen: Ist nochEiner == 1?
  3. Falls ja: Code-Block ausführen
  4. Nummer erhöhen: nummer = nummer + 1
  5. Daten eingeben und berechnen
  6. Erneut fragen: nochEiner aktualisieren
  7. Zurück zu Schritt 2

Wichtige Punkte:

  • ✓ Variable nochEiner wird vor der Schleife auf 1 gesetzt
  • ✓ Benutzer entscheidet mit Eingabe (1 oder 0)
  • ✓ Schleife läuft, solange (while) nochEiner == 1

🔁 Die do-while-Schleife

Die do-while-Schleife prüft die Bedingung nach jedem Durchlauf.

do
{
    // Code wird mindestens 1-mal ausgeführt
}
while (bedingung);  // Semikolon nicht vergessen!

                

Besonderheiten:

  • ✓ Bedingung am Ende (Fußgesteuert)
  • ✓ Wird mindestens 1-mal ausgeführt
  • ✓ Gut für Eingabevalidierung
  • Semikolon am Ende nicht vergessen!

💡 Merksatz: do-while wird auch als "fußgesteuerte Schleife" bezeichnet, da die Prüfung am Ende (Fuß) der Schleife stattfindet.

📝 do-while: Eingabekontrolle

Aufgabe: Eingabe prüfen und bei Fehler erneut eingeben lassen

#include <stdio.h>

int main()
{
    int anzahl;
    double preis;

    /* Eingabe mit Validierung */
    do
    {
        printf("Anzahl eingeben (positiv): ");
        scanf("%d", &anzahl);

        if(anzahl <= 0)
            printf("Anzahl muss positiv sein!\n");

    } while(anzahl <= 0);

    do
    {
        printf("Preis in Euro eingeben (0-10): ");
        scanf("%lf", &preis);

        if(preis < 0 || preis > 10)
            printf("Preis muss zwischen 0 und 10 Euro sein!\n");

    } while(preis < 0 || preis > 10);

    printf("Gesamtpreis: %.2f Euro\n", anzahl * preis);
    return 0;
}

                

⚖️ Vergleich: for vs while vs do-while

Kriterium for while do-while
Prüfung Am Anfang Am Anfang Am Ende
Min. Durchläufe 0 0 1
Anzahl bekannt? Ja Nein Nein
Typische Verwendung Zählschleifen Bedingte Wiederholung Eingabekontrolle
Beispiel for(i=0; i<10; i++) while(weiter==1) do {...} while(x<0)

🛑 Schleifensteuerung: break & continue

break

Bricht die Schleife sofort ab

for(int i=0; i<10; i++)
{
    if(i == 5)
        break;

    printf("%d ", i);
}
// Ausgabe: 0 1 2 3 4

                    

Verwendung: Vorzeitiges Beenden bei bestimmten Bedingungen

continue

Überspringt den Rest des aktuellen Durchlaufs

for(int i=0; i<10; i++)
{
    if(i == 5)
        continue;

    printf("%d ", i);
}
// Ausgabe: 0 1 2 3 4 6 7 8 9

                    

Verwendung: Überspringen bestimmter Werte

📊 Formatierte Ausgabe mit printf

Für übersichtliche Tabellenausgaben können wir die Ausgabe formatieren.

Format Bedeutung Beispiel
%6d Ganzzahl, mindestens 6 Zeichen breit printf("%6d", 12); → "____12"
%06d Ganzzahl, mit führenden Nullen printf("%06d", 12); → "000012"
%.2f Fließkommazahl, 2 Nachkommastellen printf("%.2f", 1.456); → "1.46"
%8.2f Fließkomma, 8 Zeichen breit, 2 Nachkommastellen printf("%8.2f", 1.45); → "____1.45"

💡 Tipp: Leerzeichen werden automatisch eingefügt, um die angegebene Breite zu erreichen!

📋 Beispiel: Tabelle erstellen

#include <stdio.h>

int main()
{
    int anzahlApfel = 12, anzahlRadio = 2;
    double preisApfel = 1.45, preisRadio = 109.95;

    /* Ausgabe mit führenden Nullen */
    printf("Anzahl\n");
    printf("%06d\n", anzahlApfel);
    printf("%06d\n", anzahlRadio);

    /* Ausgabe mit Nachkommastellen */
    printf("\n   Preis\n");
    printf("%8.2f Euro\n", preisApfel);
    printf("%8.2f Euro\n", preisRadio);

    return 0;
}

                

Ausgabe:

Anzahl
000012
000002

   Preis
    1.45 Euro
  109.95 Euro

                    

⚠️ Endlosschleifen vermeiden!

Was ist eine Endlosschleife?

Eine Schleife, die niemals endet, weil die Bedingung immer wahr bleibt!

❌ Falsch:

int i = 0;
while(i < 10)
{
    printf("%d ", i);
    // i wird nie erhöht! → Endlosschleife!
}

                

✅ Richtig:

int i = 0;
while(i < 10)
{
    printf("%d ", i);
    i++;  // i wird erhöht!
}

                

💡 Tipp: Drücken Sie Strg+C (Windows/Linux) oder Cmd+. (macOS), um ein Programm mit Endlosschleife zu beenden!

🔄 Geschachtelte Schleifen

Schleifen können ineinander verschachtelt werden.

#include <stdio.h>

int main()
{
    /* Kleines Einmaleins */
    for(int i = 1; i <= 10; i++)
    {
        for(int j = 1; j <= 10; j++)
        {
            printf("%4d", i * j);
        }
        printf("\n");  // Neue Zeile nach jeder Reihe
    }

    return 0;
}

                

Ausgabe (Auszug):

1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 ...

🎨 Muster erstellen mit Schleifen

Mit geschachtelten Schleifen können wir Muster erzeugen.

Dreieck aus Sternen:

for(int i=1; i<=5; i++)
{
    for(int j=1; j<=i; j++)
    {
        printf("* ");
    }
    printf("\n");
}

                        
Ausgabe:
*
* *
* * *
* * * *
* * * * *

                            

Quadrat aus #:

for(int i=1; i<=4; i++)
{
    for(int j=1; j<=4; j++)
    {
        printf("# ");
    }
    printf("\n");
}

                        
Ausgabe:
# # # #
# # # #
# # # #
# # # #

                            

⚠️ Häufige Fehler bei Schleifen (1/2)

Fehler 1: Falsche Bedingung

❌ Falsch:

for(int i=0; i<=10; i++)
{
    // Läuft 11-mal!
}

                        

✅ Richtig:

for(int i=0; i<10; i++)
{
    // Läuft 10-mal (0-9)
}

                        

Fehler 2: Semikolon nach while/for

❌ Falsch:

while(i < 10);  // Semikolon!
{
    i++;
}
// Endlosschleife!

                        

✅ Richtig:

while(i < 10)  // Kein Semikolon
{
    i++;
}

                        

⚠️ Häufige Fehler bei Schleifen (2/2)

Fehler 3: Variable nicht erhöhen

❌ Falsch:

int i = 0;
while(i < 10)
{
    printf("%d ", i);
    // i++ fehlt!
}
// Endlosschleife!

                        

✅ Richtig:

int i = 0;
while(i < 10)
{
    printf("%d ", i);
    i++;  // Variable erhöhen!
}

                        

Fehler 4: do-while Semikolon vergessen

❌ Falsch:

do
{
    printf("Hallo\n");
}
while(x < 10)  // Fehlt!

                        

✅ Richtig:

do
{
    printf("Hallo\n");
}
while(x < 10);  // Semikolon!

                        

💼 Praxisbeispiel: Beliebig viele Zahlen addieren

Aufgabe: Summiere Zahlen, die der Benutzer eingibt, bis 0 eingegeben wird

#include <stdio.h>

int main()
{
    int zahl, summe = 0, anzahl = 0;

    printf("Zahlen addieren (0 zum Beenden):\n");

    do
    {
        printf("Zahl eingeben: ");
        scanf("%d", &zahl);

        if(zahl != 0)
        {
            summe = summe + zahl;
            anzahl++;
        }

    } while(zahl != 0);

    if(anzahl > 0)
    {
        printf("Summe: %d\n", summe);
        printf("Durchschnitt: %.2f\n", (double)summe / anzahl);
    }

    return 0;
}

                

⏱️ Countdown: Rückwärts zählen

for-Schleifen können auch rückwärts zählen!

#include <stdio.h>

int main()
{
    printf("Countdown:\n");

    for(int i = 10; i >= 1; i--)
    {
        printf("%d...\n", i);
    }

    printf("Start!\n");

    return 0;
}

                

Ausgabe:

Countdown:
10...
9...
8...
...
2...
1...
Start!

                    

🎯 Schrittweite bei for-Schleifen

Die Schrittweite muss nicht immer 1 sein!

Gerade Zahlen (Schrittweite 2):

for(int i=0; i<=10; i+=2)
{
    printf("%d ", i);
}
// Ausgabe: 0 2 4 6 8 10

                        

Fünferschritte:

for(int i=0; i<=50; i+=5)
{
    printf("%d ", i);
}
// Ausgabe: 0 5 10 15 ... 50

                        

Praktisches Beispiel: Nur ungerade Zahlen

for(int i = 1; i <= 20; i += 2)
{
    printf("%d ", i);  // 1 3 5 7 9 11 13 15 17 19
}

                    

📌 Wichtig: Variablen-Gültigkeit

Variable nur in Schleife:

for(int i=0; i<5; i++)
{
    printf("%d ", i);
}

// i existiert hier NICHT mehr!
printf("%d", i);  // FEHLER!

                        

Variable vorher deklariert:

int i;

for(i=0; i<5; i++)
{
    printf("%d ", i);
}

// i existiert noch!
printf("\ni = %d", i);  // OK! i=5

                        

💡 Tipp: Wenn Sie die Schleifenvariable nach der Schleife benötigen, deklarieren Sie sie vorher!

🔗 Verschiedene Schleifen kombinieren

Beispiel: Menü mit Eingabevalidierung

#include <stdio.h>

int main()
{
    int wahl, anzahl;

    do
    {
        printf("\n=== MENÜ ===\n");
        printf("1. Zahlen ausgeben\n");
        printf("2. Sterne ausgeben\n");
        printf("3. Beenden\n");
        printf("Wahl: ");
        scanf("%d", &wahl);

        if(wahl == 1)
        {
            printf("Wie viele? ");
            scanf("%d", &anzahl);
            for(int i = 1; i <= anzahl; i++)
                printf("%d ", i);
            printf("\n");
        }
        else if(wahl == 2)
        {
            printf("Wie viele? ");
            scanf("%d", &anzahl);
            for(int i = 1; i <= anzahl; i++)
                printf("* ");
            printf("\n");
        }

    } while(wahl != 3);

    printf("Auf Wiedersehen!\n");
    return 0;
}

                

✏️ Übungsaufgabe 1: Quiz

Frage: Was gibt dieses Programm aus?

int summe = 0;
for(int i = 1; i <= 5; i++)
{
    summe += i;
}
printf("Summe: %d\n", summe);

                

Optionen:

  • A) Summe: 10
  • B) Summe: 15
  • C) Summe: 5
  • D) Fehler

💭 Denken Sie nach... Die Lösung kommt auf der nächsten Folie!

✅ Lösung Übungsaufgabe 1

Antwort: B) Summe: 15

Erklärung:

Durchlauf i summe vorher summe += i summe nachher
1 1 0 0 + 1 1
2 2 1 1 + 2 3
3 3 3 3 + 3 6
4 4 6 6 + 4 10
5 5 10 10 + 5 15

✏️ Übungsaufgabe 2: Code-Analyse

Frage: Wie oft wird "Hallo" ausgegeben?

int i = 0;
while(i < 3)
{
    printf("Hallo\n");
    i++;
}

                

Optionen:

  • A) 2-mal
  • B) 3-mal
  • C) 4-mal
  • D) Endlosschleife

✅ Lösung Übungsaufgabe 2

Antwort: B) 3-mal

Ablauf:

  1. i = 0: 0 < 3 → wahr → "Hallo" ausgeben, i = 1
  2. i = 1: 1 < 3 → wahr → "Hallo" ausgeben, i = 2
  3. i = 2: 2 < 3 → wahr → "Hallo" ausgeben, i = 3
  4. i = 3: 3 < 3 → falsch → Schleife endet

💡 Wichtig: Die Bedingung wird vor jedem Durchlauf geprüft!

⚡ Performance-Tipps für Schleifen

❌ Ineffizient:

for(int i=0; i<strlen(text); i++)
{
    // strlen() wird JEDES Mal berechnet!
    printf("%c", text[i]);
}

                        

✅ Effizienter:

int laenge = strlen(text);
for(int i=0; i<laenge; i++)
{
    // Länge nur 1x berechnet
    printf("%c", text[i]);
}

                        

Weitere Tipps:

  • ✓ Teure Berechnungen vor die Schleife ziehen
  • ✓ Unnötige Variablen in Schleifen vermeiden
  • ✓ Bei großen Datenmengen: Algorithmus optimieren
  • ✓ break verwenden, wenn Ziel erreicht

🐛 Debugging: Schleifen untersuchen

Technik: printf() zum Debuggen verwenden

int summe = 0;

for(int i = 1; i <= 5; i++)
{
    /* Debug-Ausgabe HINZUFÜGEN */
    printf("DEBUG: i=%d, summe vorher=%d\n", i, summe);

    summe += i;

    /* Debug-Ausgabe NACH der Berechnung */
    printf("DEBUG: summe nachher=%d\n\n", summe);
}

printf("Endergebnis: %d\n", summe);

                

Ausgabe hilft beim Verstehen:

DEBUG: i=1, summe vorher=0 DEBUG: summe nachher=1 DEBUG: i=2, summe vorher=1 DEBUG: summe nachher=3 ...

📝 Zusammenfassung

Was wir gelernt haben:

  • for-Schleife: Für bekannte Anzahl von Durchläufen
  • while-Schleife: Bedingung am Anfang, 0+ Durchläufe
  • do-while-Schleife: Bedingung am Ende, mindestens 1 Durchlauf
  • break: Schleife sofort beenden
  • continue: Aktuellen Durchlauf überspringen
  • Formatierung: Saubere Tabellenausgabe mit printf
  • Geschachtelte Schleifen: Schleifen in Schleifen

💡 Merke: Wähle die Schleife passend zur Aufgabe!

🚀 Nächste Schritte

Heute:

  • 📝 Labor 4: Praktische Übungen zu Schleifen
  • 🔄 for, while und do-while ausprobieren
  • 📊 Formatierte Tabellenausgaben erstellen

Nächste Woche:

  • Arrays: Datenstrukturen für viele Werte
  • Kombination: Schleifen + Arrays

Vielen Dank!

Viel Erfolg bei Labor 4! 🎯