JavaScript Anfänger

Schleifen in JavaScript (for, while, do-while)

Schleifen in JavaScript

Schleifen ermöglichen es, Code wiederholt auszuführen. Statt denselben Code 100 Mal zu schreiben, schreibst du ihn einmal und lässt ihn 100 Mal laufen.

Warum Schleifen?

// Ohne Schleife - Wahnsinn! 😱
console.log("Hallo 1");
console.log("Hallo 2");
console.log("Hallo 3");
console.log("Hallo 4");
console.log("Hallo 5");
// ... und so weiter bis 100?

// Mit Schleife - Elegant! ✨
for (let i = 1; i <= 100; i++) {
    console.log("Hallo " + i);
}

Die for-Schleife

Die for-Schleife ist die häufigste Schleife. Perfekt, wenn du weißt, wie oft etwas wiederholt werden soll.

Syntax

for (initialisierung; bedingung; update) {
    // Code der wiederholt wird
}

Die drei Teile erklärt

for (let i = 0; i < 5; i++) {
    console.log(i);
}

// Teil 1: let i = 0       → Initialisierung (einmal am Anfang)
// Teil 2: i < 5           → Bedingung (vor jedem Durchlauf geprüft)
// Teil 3: i++             → Update (nach jedem Durchlauf)

Ablauf einer for-Schleife

1. Initialisierung: let i = 0
2. Bedingung prüfen: 0 < 5? ✓ Ja
3. Code ausführen: console.log(0)
4. Update: i++ → i = 1
5. Bedingung prüfen: 1 < 5? ✓ Ja
6. Code ausführen: console.log(1)
7. Update: i++ → i = 2
... (weiter bis i = 5)
8. Bedingung prüfen: 5 < 5? ✗ Nein → Schleife beendet

Praktische Beispiele

// Von 1 bis 10 zählen
for (let i = 1; i <= 10; i++) {
    console.log(i);
}
// Ausgabe: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

// Rückwärts zählen
for (let i = 10; i >= 1; i--) {
    console.log(i);
}
// Ausgabe: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1

// In 2er-Schritten
for (let i = 0; i <= 20; i += 2) {
    console.log(i);
}
// Ausgabe: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20

// In 5er-Schritten rückwärts
for (let i = 100; i >= 0; i -= 5) {
    console.log(i);
}
// Ausgabe: 100, 95, 90, 85, ...

Summe berechnen

// Summe von 1 bis 100
let summe = 0;

for (let i = 1; i <= 100; i++) {
    summe += i;  // summe = summe + i
}

console.log(summe); // 5050

Multiplikationstabelle

const zahl = 7;

console.log(`Einmaleins von ${zahl}:`);
for (let i = 1; i <= 10; i++) {
    console.log(`${zahl} × ${i} = ${zahl * i}`);
}

// Ausgabe:
// Einmaleins von 7:
// 7 × 1 = 7
// 7 × 2 = 14
// 7 × 3 = 21
// ...

Die while-Schleife

Die while-Schleife läuft, solange eine Bedingung wahr ist. Perfekt, wenn du nicht weißt, wie oft etwas wiederholt werden muss.

Syntax

while (bedingung) {
    // Code der wiederholt wird
}

Einfaches Beispiel

let count = 0;

while (count < 5) {
    console.log("Count ist: " + count);
    count++;
}

// Ausgabe:
// Count ist: 0
// Count ist: 1
// Count ist: 2
// Count ist: 3
// Count ist: 4

Praktische Beispiele

// Würfeln bis eine 6 kommt
let wurf;
let versuche = 0;

while (wurf !== 6) {
    wurf = Math.floor(Math.random() * 6) + 1;
    versuche++;
    console.log(`Wurf ${versuche}: ${wurf}`);
}

console.log(`6 gewürfelt nach ${versuche} Versuchen!`);
// Passwort-Eingabe (vereinfacht)
let passwort = "";
const korrektesPasswort = "geheim123";

while (passwort !== korrektesPasswort) {
    passwort = prompt("Passwort eingeben:");

    if (passwort !== korrektesPasswort) {
        console.log("Falsches Passwort!");
    }
}

console.log("Willkommen!");
// Zahl halbieren bis < 1
let zahl = 1000;

while (zahl >= 1) {
    console.log(zahl);
    zahl = zahl / 2;
}

// Ausgabe: 1000, 500, 250, 125, 62.5, 31.25, 15.625, ...

Ziffern einer Zahl zählen

function ziffernZaehlen(n) {
    let zahl = Math.abs(n);  // Negative Zahlen behandeln
    let anzahl = 0;

    // Spezialfall: 0 hat eine Ziffer
    if (zahl === 0) return 1;

    while (zahl > 0) {
        anzahl++;
        zahl = Math.floor(zahl / 10);
    }

    return anzahl;
}

console.log(ziffernZaehlen(12345)); // 5
console.log(ziffernZaehlen(7));     // 1
console.log(ziffernZaehlen(-999));  // 3

Die do-while-Schleife

Die do-while-Schleife führt den Code mindestens einmal aus und prüft danach die Bedingung.

Syntax

do {
    // Code der wiederholt wird
} while (bedingung);

Unterschied zu while

// while - prüft ZUERST
let i = 10;
while (i < 5) {
    console.log(i);  // Wird NIE ausgeführt!
    i++;
}

// do-while - führt ZUERST aus
let j = 10;
do {
    console.log(j);  // Wird EINMAL ausgeführt!
    j++;
} while (j < 5);

Praktische Beispiele

// Menü-Auswahl
let auswahl;

do {
    console.log("=== MENÜ ===");
    console.log("1. Neues Spiel");
    console.log("2. Laden");
    console.log("3. Beenden");

    auswahl = prompt("Wähle (1-3):");

    switch (auswahl) {
        case "1":
            console.log("Starte neues Spiel...");
            break;
        case "2":
            console.log("Lade Spielstand...");
            break;
        case "3":
            console.log("Auf Wiedersehen!");
            break;
        default:
            console.log("Ungültige Auswahl!");
    }
} while (auswahl !== "3");
// Zufallszahl raten
const geheimzahl = Math.floor(Math.random() * 100) + 1;
let geraten;
let versuche = 0;

do {
    geraten = parseInt(prompt("Rate die Zahl (1-100):"));
    versuche++;

    if (geraten < geheimzahl) {
        console.log("Zu niedrig!");
    } else if (geraten > geheimzahl) {
        console.log("Zu hoch!");
    }
} while (geraten !== geheimzahl);

console.log(`Richtig! Du hast ${versuche} Versuche gebraucht.`);

Schleifenkontrolle: break und continue

break - Schleife sofort beenden

// Erste durch 7 teilbare Zahl finden
for (let i = 1; i <= 100; i++) {
    if (i % 7 === 0) {
        console.log("Gefunden: " + i);
        break;  // Schleife sofort verlassen
    }
}
// Ausgabe: "Gefunden: 7"
// Suche in Array abbrechen wenn gefunden
const namen = ["Anna", "Ben", "Clara", "David", "Eva"];
const gesucht = "Clara";

for (let i = 0; i < namen.length; i++) {
    console.log("Prüfe: " + namen[i]);

    if (namen[i] === gesucht) {
        console.log("Gefunden an Position " + i);
        break;
    }
}
// Prüft nur Anna, Ben, Clara - dann Abbruch

continue - Durchlauf überspringen

// Nur gerade Zahlen ausgeben
for (let i = 1; i <= 10; i++) {
    if (i % 2 !== 0) {
        continue;  // Rest überspringen, nächster Durchlauf
    }
    console.log(i);
}
// Ausgabe: 2, 4, 6, 8, 10
// Negative Werte überspringen
const werte = [10, -5, 20, -3, 15, -8, 30];
let summe = 0;

for (let i = 0; i < werte.length; i++) {
    if (werte[i] < 0) {
        continue;  // Negative überspringen
    }
    summe += werte[i];
}

console.log("Summe positiver Werte: " + summe); // 75

Verschachtelte Schleifen

Schleifen können ineinander verschachtelt werden:

// Koordinaten ausgeben
for (let x = 0; x < 3; x++) {
    for (let y = 0; y < 3; y++) {
        console.log(`(${x}, ${y})`);
    }
}

// Ausgabe:
// (0, 0), (0, 1), (0, 2)
// (1, 0), (1, 1), (1, 2)
// (2, 0), (2, 1), (2, 2)

Multiplikationstabelle (1x1 bis 10x10)

console.log("    1   2   3   4   5   6   7   8   9  10");
console.log("  +----------------------------------------");

for (let i = 1; i <= 10; i++) {
    let zeile = i.toString().padStart(2) + "|";

    for (let j = 1; j <= 10; j++) {
        zeile += (i * j).toString().padStart(4);
    }

    console.log(zeile);
}

Muster zeichnen

// Dreieck
for (let i = 1; i <= 5; i++) {
    let zeile = "";
    for (let j = 1; j <= i; j++) {
        zeile += "* ";
    }
    console.log(zeile);
}

// Ausgabe:
// *
// * *
// * * *
// * * * *
// * * * * *
// Pyramide
const hoehe = 5;

for (let i = 1; i <= hoehe; i++) {
    let leerzeichen = " ".repeat(hoehe - i);
    let sterne = "* ".repeat(i);
    console.log(leerzeichen + sterne);
}

// Ausgabe:
//     *
//    * *
//   * * *
//  * * * *
// * * * * *

Endlosschleifen vermeiden!

Endlosschleifen laufen für immer und frieren den Browser ein:

// ❌ ENDLOSSCHLEIFE - NIE MACHEN!
// while (true) {
//     console.log("Für immer...");
// }

// ❌ Bedingung wird nie false
// let i = 0;
// while (i < 10) {
//     console.log(i);
//     // i++ vergessen!
// }

// ❌ Falsche Richtung
// for (let i = 0; i < 10; i--) {
//     console.log(i);
// }

Schutz vor Endlosschleifen

// Sicherheits-Counter einbauen
let count = 0;
const maxIterations = 10000;

while (someBedingung) {
    // ... Code ...

    count++;
    if (count > maxIterations) {
        console.error("Mögliche Endlosschleife erkannt!");
        break;
    }
}

Welche Schleife wann?

SchleifeVerwende wenn…
forDu weißt, wie oft (z.B. Array durchlaufen)
whileDu weißt nicht, wie oft (z.B. bis Bedingung erfüllt)
do-whileCode muss mindestens 1x laufen (z.B. Menü)

Entscheidungsbaum

Weißt du wie oft?
├── Ja → for-Schleife
└── Nein → Muss es mindestens 1x laufen?
            ├── Ja → do-while
            └── Nein → while

Praktisches Projekt: Passwort-Generator

function generierePasswort(laenge) {
    const zeichen = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%";
    let passwort = "";

    for (let i = 0; i < laenge; i++) {
        const zufallsIndex = Math.floor(Math.random() * zeichen.length);
        passwort += zeichen[zufallsIndex];
    }

    return passwort;
}

// 5 Passwörter generieren
for (let i = 1; i <= 5; i++) {
    console.log(`Passwort ${i}: ${generierePasswort(12)}`);
}

Zusammenfassung

// for - bekannte Anzahl
for (let i = 0; i < 10; i++) {
    // 10 Durchläufe
}

// while - unbekannte Anzahl
while (bedingung) {
    // bis bedingung false
}

// do-while - mindestens einmal
do {
    // mindestens 1x
} while (bedingung);

// break - Schleife beenden
// continue - Durchlauf überspringen

Übung: Schreibe ein Programm, das alle Primzahlen von 2 bis 100 ausgibt. Tipp: Eine Zahl ist prim, wenn sie nur durch 1 und sich selbst teilbar ist.