🏠 Zurück zur Startseite
🔀

Vorlesung 5

Verzweigungen in C

Grundlagen der Programmierung in C

Prof. Dr. Alexandra Mikityuk

HTW Berlin - Wintersemester 2025/26

📋 In dieser Vorlesung lernen Sie:

  • ✅ Was sind Verzweigungen und warum brauchen wir sie?
  • ✅ Die if-Anweisung verstehen und anwenden
  • if-else für alternative Ausführungspfade
  • ✅ Vergleichsoperatoren in C (<, >, ==, !=, <=, >=)
  • ✅ Logische Operatoren (&&, ||, !)
  • ✅ Bedingungen kombinieren und verschachteln
  • ✅ Häufige Fehler vermeiden

🤔 Warum brauchen wir Verzweigungen?

Das Problem:

Bisher wurden alle Anweisungen Zeile für Zeile ausgeführt. Ein Programm soll aber auch in der Lage sein, auf unterschiedliche Situationen zu reagieren.

🎯 Beispiele aus dem echten Leben:

  • 💰 Rabatt: Wenn Summe > 10 Euro, dann 20% Rabatt
  • 🍎 Preisvergleich: Welcher Artikel ist teurer?
  • 🌡️ Temperatur: Wenn Temperatur < 0°C, dann "Es friert"
  • 🔐 Passwort: Wenn Eingabe korrekt, dann Zugang gewähren

💡 Verzweigung: Eine Verzweigung wird mithilfe einer Bedingung formuliert. Eine Bedingung hat einen Wahrheitswert: entweder wahr oder falsch.

🔑 Die if-Anweisung

Syntax:

if (Bedingung) { // Diese Anweisungen werden nur ausgeführt, // wenn die Bedingung WAHR ist Anweisung1; Anweisung2; }

Beispiel: Teurer Artikel

#include <stdio.h> int main() { double preis = 0.85; /* Bedingte Ausführung eines Blocks von Anweisungen */ if (preis > 0.99) { printf("Ein teurer Artikel\n"); printf("Brauchen wir den wirklich?\n"); } /* Bedingte Ausführung einer einzelnen Anweisung */ if (preis < 1.0) printf("Ein billiger Artikel\n"); return 0; }

Ausgabe: Ein billiger Artikel

Der erste Block wird NICHT ausgeführt, weil 0.85 nicht größer als 0.99 ist.

⚖️ Vergleichsoperatoren in C

Beim Vergleich von Zahlen stehen Ihnen 6 verschiedene Vergleichsoperatoren zur Verfügung:

Operator Bedeutung Beispiel
> größer als preis > 0.99
< kleiner als preis < 1.0
>= größer oder gleich preis >= 1.0
<= kleiner oder gleich preis <= 0.99
== gleich preis == 1.50
!= ungleich preis != 1.50

⚠️ WICHTIG: Unterschied zwischen = und ==

  • = ist eine Zuweisung: preis = 1.5
  • == ist ein Vergleich: if (preis == 1.5)

💻 Beispiel: Preisvergleich

#include <stdio.h> int main() { double preisApfel = 1.45, preisBirne = 0.85, preisKiwi = 1.45; /* Größer */ if (preisApfel > preisBirne) printf("Apfel ist teurer als Birne\n"); /* Kleiner */ if (preisBirne < preisKiwi) printf("Birne ist billiger als Kiwi\n"); /* Größer oder gleich */ if (preisApfel >= preisKiwi) printf("Apfel ist mindestens so teuer wie Kiwi\n"); /* Kleiner oder gleich */ if (preisBirne <= preisKiwi) printf("Birne ist hoechstens so teuer wie Kiwi\n"); /* Gleich */ if (preisApfel == preisKiwi) printf("Apfel und Kiwi haben denselben Preis\n"); /* Ungleich */ if (preisBirne != preisKiwi) printf("Birne und Kiwi haben unterschiedliche Preise\n"); return 0; }

Ausgabe:

Apfel ist teurer als Birne Birne ist billiger als Kiwi Apfel ist mindestens so teuer wie Kiwi Birne ist hoechstens so teuer wie Kiwi Apfel und Kiwi haben denselben Preis Birne und Kiwi haben unterschiedliche Preise

🔀 Die if-else-Anweisung

Sie können eine Verzweigung durch das Schlüsselwort else erweitern. Nach dem if folgt in runden Klammern eine Bedingung. Ist diese Bedingung wahr, wird die Anweisung oder der folgende Block von Anweisungen ausgeführt.

Syntax:

if (Bedingung) { // Falls Bedingung WAHR ist Anweisung1; } else { // Falls Bedingung FALSCH ist Anweisung2; }

Beispiel:

#include <stdio.h> int main() { double preis = 0.85; /* Falls Bedingung zutrifft */ if (preis > 0.99) { printf("Ein teurer Artikel\n"); } /* Ansonsten, falls also Bedingung nicht zutrifft */ else { printf("Ein billiger Artikel\n"); printf("Den nehmen wir\n"); } return 0; }

Ausgabe:

Ein billiger Artikel Den nehmen wir

🔗 Logische Operatoren

Der Ablauf innerhalb einer Verzweigung kann auch von mehreren Bedingungen abhängig sein, die miteinander verknüpft werden.

Operator Bedeutung Beispiel
&& Logisches UND a < 1.0 && b < 1.0
|| Logisches ODER a > 0.99 || b > 0.99
! Logisches NICHT !(preis > 0.99)

💡 Logisches UND (&&)

Falls alle Bedingungen zutreffen sollen, verknüpfen Sie sie mithilfe des Operators &&. Er steht für das logische Und.

💡 Logisches ODER (||)

Reicht dagegen eine Bedingung aus, nutzen Sie den Operator ||. Er steht für das logische Oder.

💡 Logisches NICHT (!)

Es gibt noch einen dritten logischen Operator: Das Zeichen ! steht für das logische Nicht. Mit diesem Operator wird der Wahrheitswert einer Bedingung umgedreht: Aus wahr wird falsch und umgekehrt.

💻 Beispiel: Logische Operatoren

#include <stdio.h> int main() { double preisApfel = 1.45, preisBirne = 0.85, preisBanane = 0.75; /* Logisches UND */ if (preisBirne < 1.0 && preisBanane < 1.0) printf("Beide Artikel sind billig\n"); /* Logisches ODER */ if (preisApfel > 0.99 || preisBirne > 0.99) printf("Mindestens einer der Artikel ist teuer\n"); /* Logisches NICHT */ if (!(preisBanane > 0.99)) printf("Artikel ist nicht teuer\n"); return 0; }

Ausgabe:

Beide Artikel sind billig Mindestens einer der Artikel ist teuer Artikel ist nicht teuer

⚠️ Vorrangregeln:

Die Vergleichsoperatoren haben Vorrang vor den logischen Operatoren. Das bedeutet, dass zunächst der Wahrheitswert der einzelnen Bedingungen ermittelt wird. Erst anschließend werden die Bedingungen verknüpft.

🎯 Übungsaufgabe: Rabatt-Rechner

Aufgabenstellung:

Schreiben Sie ein Programm in der Datei u_fall.c. Es soll die folgende Ausgabe ermöglichen (hier mit Eingaben des Benutzers):

Anzahl: 5 Preis in Euro: 3.20 Summe der Rechnung: 12.80 Euro

📋 Anforderungen:

  • Der Benutzer soll Anzahl und Preis für einen eingekauften Artikel eingeben
  • Anschließend wird die Summe der Rechnung ermittelt
  • Falls diese Summe 10 Euro überschreitet, soll ein Rabatt von 20% gewährt werden
  • Ansonsten soll kein Rabatt gewährt werden
  • Wählen Sie geeignete Variablennamen, und kommentieren Sie Ihr Programm ausreichend

💡 Tipp: Eine mögliche Lösung finden Sie in Abschnitt C.3 des Buchs.

⚠️ Häufige Fehler bei Verzweigungen

❌ Fehler 1: Vergessen des Semikolons nach else

Achten Sie darauf, nach dem else kein Semikolon zu notieren. Dies würde diesen Zweig der Verzweigung unmittelbar beenden. Der Compiler meldet diesen Fehler ebenfalls nicht. Die anschließende Anweisung wäre nicht mehr mit der Verzweigung verbunden und würde stets ausgeführt.

/* FALSCH! */ if (preis > 0.99) printf("Teuer\n"); else; /* Fehler: Semikolon hier beendet die Verzweigung! */ printf("Billig\n"); /* Wird IMMER ausgeführt */

❌ Fehler 2: = statt == verwenden

Der Compiler übersetzt auch die Anweisung if (preis = 1.5) ohne Fehlermeldung. Allerdings haben Sie damit nicht geprüft, ob der Preis 1,50 Euro beträgt, sondern den Preis mit 1,50 Euro festgelegt. Dies führt nicht zu den erwarteten Ergebnissen.

/* FALSCH! */ if (preis = 1.5) /* Zuweisung statt Vergleich! */ printf("Preis ist 1.50\n"); /* RICHTIG! */ if (preis == 1.5) /* Vergleich */ printf("Preis ist 1.50\n");

❌ Fehler 3: Geschweifte Klammern vergessen

Ohne geschweifte Klammern gehört nur die erste Anweisung zur if-Bedingung!

/* FALSCH! */ if (preis > 0.99) printf("Teuer\n"); printf("Überlegen Sie es sich\n"); /* Wird IMMER ausgeführt! */ /* RICHTIG! */ if (preis > 0.99) { printf("Teuer\n"); printf("Überlegen Sie es sich\n"); }

📚 Zusammenfassung

Was haben wir gelernt?

  • Verzweigungen ermöglichen unterschiedliche Programmabläufe abhängig von Bedingungen
  • if-Anweisung: Code wird nur ausgeführt, wenn Bedingung wahr ist
  • if-else-Anweisung: Alternative für den Fall, dass Bedingung falsch ist
  • Vergleichsoperatoren: >, <, >=, <=, ==, !=
  • Logische Operatoren: && (UND), || (ODER), ! (NICHT)
  • Vorrangregeln: Vergleichsoperatoren werden vor logischen Operatoren ausgewertet

🎯 Wichtigste Punkte:

  • = ist Zuweisung, == ist Vergleich
  • Kein Semikolon nach if oder else
  • Geschweifte Klammern bei mehreren Anweisungen verwenden
  • Bedingungen können mit && und || kombiniert werden

🚀 Nächste Schritte

In der nächsten Vorlesung:

  • 🔄 Schleifen (while, for, do-while)
  • 🔁 Wiederholungen in Programmen
  • 🎮 Iterationen und ihre Anwendungen

Hausaufgaben:

  • 📝 Übungsaufgabe "Rabatt-Rechner" lösen
  • 💻 Verschiedene Verzweigungen ausprobieren
  • 🧪 Experimente mit logischen Operatoren durchführen

🧠 Algorithmisches Denken

Wie entwickle ich ein Programm?

Bevor Sie mit dem Programmieren beginnen, sollten Sie einen Plan haben!

📋 Die 5 Schritte der Programmentwicklung:

  1. Aufgabe verstehen - Was soll das Programm tun?
  2. Eingaben identifizieren - Welche Daten brauche ich?
  3. Ausgaben definieren - Was soll berechnet/ausgegeben werden?
  4. Algorithmus entwerfen - Wie komme ich von Eingabe zu Ausgabe?
  5. Code schreiben - Umsetzung in C

💡 Wichtig: Nur Schritt 5 ist das eigentliche Programmieren! Die Schritte 1-4 sind das Denken - und das ist mindestens genauso wichtig!

📖 Schritt 1: Aufgabe verstehen

Beispielaufgabe: Altersprüfung für Kinofilm

Schreiben Sie ein Programm, das das Alter einer Person abfragt und prüft, ob sie einen Film ab 16 Jahren sehen darf. Wenn die Person 16 Jahre oder älter ist, soll "Zutritt erlaubt" ausgegeben werden. Andernfalls soll "Zutritt verboten" ausgegeben werden.

🤔 Fragen, die Sie sich stellen sollten:

  • ✅ Was ist das Ziel des Programms? → Altersprüfung durchführen
  • ✅ Welche Entscheidung muss getroffen werden? → Zutritt ja oder nein
  • ✅ Gibt es Bedingungen? → Ja, Alter >= 16
  • ✅ Was passiert in jedem Fall? → Zwei mögliche Ausgaben

🎯 Tipp: Lesen Sie die Aufgabe mehrmals! Markieren Sie wichtige Wörter wie "wenn", "sonst", "prüfen", "berechnen".

📥 Schritt 2: Eingaben identifizieren

Was braucht mein Programm?

Für unser Beispiel (Altersprüfung):

Eingabe Beschreibung Datentyp Variable
Alter Alter der Person int alter

💡 Fragen für Eingaben:

  • Welche Daten brauche ich vom Benutzer?
  • Welcher Datentyp passt? (int, double, char, ...)
  • Wie soll die Variable heißen? (sprechend und verständlich!)
  • Gibt es Grenzwerte? (z.B. Alter kann nicht negativ sein)
/* Eingaben als Variablen deklarieren */ int alter; /* Eingabe vom Benutzer einlesen */ printf("Wie alt sind Sie? "); scanf("%d", &alter);

📤 Schritt 3: Ausgaben definieren

Was soll das Programm ausgeben?

Für unser Beispiel (Altersprüfung):

Ausgabe Bedingung
"Zutritt erlaubt" Wenn alter >= 16
"Zutritt verboten" Sonst (alter < 16)

💡 Fragen für Ausgaben:

  • Was soll auf dem Bildschirm erscheinen?
  • Gibt es verschiedene mögliche Ausgaben?
  • Wovon hängt die Ausgabe ab?
  • Muss etwas berechnet werden?

🎨 Schritt 4: Algorithmus entwerfen (Flussdiagramm)

Ein Flussdiagramm visualisiert den Programmablauf:

START
Eingabe: alter
alter >= 16?
JA ↓
↓ NEIN
"Zutritt
erlaubt"
"Zutritt
verboten"
ENDE

📐 Flussdiagramm-Symbole

Symbol Bedeutung Verwendung
Oval
Start / Ende Programmstart und -ende
Rechteck
Anweisung Eingabe, Ausgabe, Berechnung
Raute
Bedingung if-Anweisungen, Verzweigungen
Pfeil Programmfluss, Richtung

💡 Tipp: Zeichnen Sie Flussdiagramme immer zuerst auf Papier! Das hilft Ihnen, die Logik zu verstehen, bevor Sie Code schreiben.

💻 Schritt 5: Code schreiben

Jetzt umsetzen in C!

Wenn Sie die Schritte 1-4 gemacht haben, ist das Programmieren einfach:

#include <stdio.h> int main() { /* Schritt 2: Eingaben deklarieren */ int alter; /* Schritt 2: Eingabe einlesen */ printf("Wie alt sind Sie? "); scanf("%d", &alter); /* Schritt 4: Algorithmus (Bedingung prüfen) */ if (alter >= 16) { /* Schritt 3: Ausgabe Fall 1 */ printf("Zutritt erlaubt\n"); } else { /* Schritt 3: Ausgabe Fall 2 */ printf("Zutritt verboten\n"); } return 0; }

✅ Sehen Sie? Mit guter Planung schreibt sich der Code fast von selbst!

🎯 Komplexeres Beispiel: Notenberechnung

Aufgabenstellung:

Schreiben Sie ein Programm, das Punkte aus einer Klausur einliest (0-100) und eine Note ausgibt:
• 90-100 Punkte: Note 1 (Sehr gut)
• 80-89 Punkte: Note 2 (Gut)
• 70-79 Punkte: Note 3 (Befriedigend)
• 60-69 Punkte: Note 4 (Ausreichend)
• 0-59 Punkte: Note 5 (Nicht bestanden)

🤔 Schritt 1: Verstehen

  • ✅ Ziel: Punkte in Note umwandeln
  • ✅ Es gibt 5 verschiedene Fälle (5 Notenstufen)
  • ✅ Wir brauchen mehrere Bedingungen

📥 Schritt 2: Eingaben

  • int punkte - Punktzahl (0-100)

📤 Schritt 3: Ausgaben

  • Text mit der Note (1-5) und Beschreibung

🎨 Schritt 4: Algorithmus (Notenberechnung)

Logik aufschreiben (Pseudocode):

WENN punkte >= 90 DANN Ausgabe: "Note 1 (Sehr gut)" SONST WENN punkte >= 80 DANN Ausgabe: "Note 2 (Gut)" SONST WENN punkte >= 70 DANN Ausgabe: "Note 3 (Befriedigend)" SONST WENN punkte >= 60 DANN Ausgabe: "Note 4 (Ausreichend)" SONST Ausgabe: "Note 5 (Nicht bestanden)"

💡 Pseudocode: Eine Zwischenstufe zwischen menschlicher Sprache und Programmiersprache. Hilft beim Denken!

⚠️ Wichtig: Die Reihenfolge ist entscheidend! Wir prüfen von oben nach unten.

💻 Schritt 5: Code (Notenberechnung)

#include <stdio.h> int main() { int punkte; printf("Punktzahl (0-100): "); scanf("%d", &punkte); /* Verschachtelte if-else Anweisungen */ if (punkte >= 90) { printf("Note 1 (Sehr gut)\n"); } else if (punkte >= 80) { printf("Note 2 (Gut)\n"); } else if (punkte >= 70) { printf("Note 3 (Befriedigend)\n"); } else if (punkte >= 60) { printf("Note 4 (Ausreichend)\n"); } else { printf("Note 5 (Nicht bestanden)\n"); } return 0; }

🔀 else if - Mehrere Alternativen

Syntax:

if (Bedingung1) { // Fall 1 } else if (Bedingung2) { // Fall 2 } else if (Bedingung3) { // Fall 3 } else { // Alle anderen Fälle }

💡 Wie funktioniert else if?

  • Die Bedingungen werden der Reihe nach geprüft
  • Sobald eine Bedingung wahr ist, wird dieser Block ausgeführt
  • Die restlichen Bedingungen werden übersprungen
  • Das else am Ende ist optional (aber empfohlen!)

⚠️ Achtung: else if ist NICHT dasselbe wie mehrere separate if-Anweisungen!

🎫 Übung: Ticketpreis berechnen

Aufgabe:

Ein Museum hat folgende Preise:
• Kinder (unter 6 Jahre): Eintritt frei
• Kinder/Jugendliche (6-17 Jahre): 5 Euro
• Erwachsene (18-64 Jahre): 12 Euro
• Senioren (65+ Jahre): 8 Euro

Schreiben Sie ein Programm, das das Alter einliest und den Ticketpreis ausgibt.

✏️ Ihre Aufgaben:

  1. Analysieren Sie die Aufgabe (Eingaben? Ausgaben?)
  2. Zeichnen Sie ein Flussdiagramm
  3. Schreiben Sie Pseudocode
  4. Implementieren Sie das Programm in C
  5. Testen Sie mit verschiedenen Alterswerten!

💡 Tipp: Denken Sie zuerst nach, dann programmieren! 5 Minuten Planung sparen 30 Minuten Debugging.

🐛 Debugging: Fehler finden und beheben

Was tun, wenn das Programm nicht funktioniert?

1️⃣ Compiler-Fehler (Syntaxfehler)

  • Das Programm lässt sich nicht kompilieren
  • Lesen Sie die Fehlermeldung genau!
  • Häufige Ursachen: Fehlende Semikolons, Klammern, Tippfehler

2️⃣ Logische Fehler

  • Das Programm läuft, aber macht nicht das Richtige
  • Prüfen Sie Ihre Bedingungen (>=, <=, ==, !=)
  • Verwenden Sie printf zum Debuggen
  • Testen Sie mit verschiedenen Eingabewerten

💡 Debug-Strategie:

/* Zwischenwerte ausgeben */ printf("Debug: alter = %d\n", alter); if (alter >= 16) { printf("Debug: Bedingung ist WAHR\n"); printf("Zutritt erlaubt\n"); }

🧪 Testfälle entwickeln

Wie teste ich mein Programm richtig?

Arten von Testfällen:

Testfall-Typ Beschreibung Beispiel (Alter >= 16)
Normalfall Typische Eingaben alter = 20, alter = 10
Grenzwerte Werte an den Grenzen alter = 16, alter = 15
Extremwerte Sehr große/kleine Werte alter = 0, alter = 120
Ungültige Eingaben Fehlerhafte Werte alter = -5 (negativ)

⚠️ Wichtig: Testen Sie IMMER die Grenzwerte! Die meisten Fehler passieren an den Grenzen (z.B. >= vs. >).

✨ Code-Qualität: Guter Code vs. Schlechter Code

Was macht guten Code aus?

❌ Schlechter Code:

#include <stdio.h> int main() { int x; scanf("%d",&x); if(x>=16) printf("ok\n"); else printf("nein\n"); return 0; }
  • ❌ Keine Kommentare
  • ❌ Schlechte Variablennamen
  • ❌ Keine Einrückung
  • ❌ Unklare Ausgaben

✅ Guter Code:

#include <stdio.h> int main() { /* Alter einlesen */ int alter; printf("Alter: "); scanf("%d", &alter); /* Prüfung */ if (alter >= 16) printf("Zutritt erlaubt\n"); else printf("Zutritt verboten\n"); return 0; }
  • ✅ Klare Kommentare
  • ✅ Sprechende Namen
  • ✅ Saubere Einrückung
  • ✅ Verständliche Ausgaben

📋 Checkliste: Bevor Sie anfangen zu programmieren

✅ Meine Programmier-Checkliste:

  1. Aufgabe verstehen
    • □ Aufgabe mehrmals gelesen
    • □ Ziel des Programms klar
    • □ Wichtige Wörter markiert
  2. Eingaben identifizieren
    • □ Welche Daten brauche ich?
    • □ Datentypen festgelegt
    • □ Variablennamen gewählt
  3. Ausgaben definieren
    • □ Was soll ausgegeben werden?
    • □ Verschiedene Fälle identifiziert
  4. Algorithmus entwerfen
    • □ Flussdiagramm gezeichnet
    • □ Pseudocode geschrieben
    • □ Logik überprüft
  5. Code schreiben
    • □ Kommentare hinzugefügt
    • □ Sauber eingerückt
    • □ Kompiliert ohne Fehler
  6. Testen
    • □ Normalfälle getestet
    • □ Grenzwerte getestet
    • □ Alle Zweige durchlaufen

🚫 Top 10 Anfängerfehler bei Verzweigungen

# Fehler Richtig
1 if (alter = 16) if (alter == 16)
2 if (alter >= 16); if (alter >= 16)
3 Klammern um Bedingung vergessen Immer if (Bedingung)
4 Geschweifte Klammern vergessen Bei mehreren Zeilen: { ... }
5 if (10 < alter < 20) if (alter > 10 && alter < 20)
6 else; { ... } else { ... }
7 Falsche Operator-Priorität Klammern verwenden: (a && b) || c
8 Grenzwerte nicht getestet Immer Grenzwerte testen!
9 Bedingungen in falscher Reihenfolge Bei else-if: Spezielle vor allgemeine
10 Keine Kommentare im Code Kommentare für bessere Lesbarkeit

📚 Zusammenfassung

Teil 1: Verzweigungen

  • if, else, else if für verschiedene Fälle
  • ✅ Vergleichsoperatoren: >, <, >=, <=, ==, !=
  • ✅ Logische Operatoren: &&, ||, !

Teil 2: Algorithmisches Denken

  • ✅ 5 Schritte: Verstehen → Eingaben → Ausgaben → Algorithmus → Code
  • ✅ Flussdiagramme helfen beim Visualisieren
  • ✅ Pseudocode als Zwischenschritt
  • ✅ Systematisches Testen mit verschiedenen Testfällen

💡 Erst denken, dann programmieren!
Gute Planung = Weniger Bugs = Mehr Erfolg

🚀 Nächste Schritte & Hausaufgaben

📝 Hausaufgaben:

  1. Rabatt-Rechner aus Übungsaufgabe implementieren
  2. Ticketpreis-Programm für das Museum schreiben
  3. Notenrechner mit eigenen Punktegrenzen anpassen
  4. Für jede Aufgabe:
    • Flussdiagramm zeichnen
    • Pseudocode schreiben
    • Code implementieren
    • Mindestens 5 Testfälle durchführen

🔮 Ausblick auf nächste Vorlesung:

  • 🔄 Schleifen (while, for, do-while)
  • 🔁 Wiederholungen automatisieren
  • 🎮 Kombination von Schleifen und Verzweigungen

💪 Übung macht den Meister!
Je mehr Programme Sie schreiben, desto leichter wird es!

🎉

Vielen Dank!

Fragen?

Prof. Dr. Alexandra Mikityuk

🏢 Büro: Raum C308

📅 Sprechstunde: Mittwoch 15:30-16:30

💡 Denken Sie daran:

Programmieren ist wie eine Fremdsprache lernen.
Am Anfang schwer, aber mit Übung wird es zur zweiten Natur!

1 / 33