Kapitel 7 Unit 31 von 36 Theorie + Übungen Dauer: ~100 Min.
Ömer
Ömer sagt:

Heute lernst du enum — eines meiner Lieblingsfeatures in C! Anstatt im Code mysteriöse Zahlen herumzuschleppen ("was war nochmal 3?"), gibst du deinen Zuständen echte Namen. Code der sich selbst erklärt ist guter Code. Los gehts! 🎯

enum deklarieren und verwenden typedef enum verstehen Automatische Nummerierung kennen enum in switch einsetzen Fehlercodes mit enum modellieren Spielzustand mit enum verwalten

Kurz-Referenz: enum Syntax

enum_referenz.cC
/* Deklaration ohne typedef */
enum Status { AKTIV, INAKTIV, GESPERRT };   /* 0, 1, 2 */
enum Status s = AKTIV;

/* Deklaration mit typedef (empfohlen!) */
typedef enum { ROT, GELB, GRUEN } Farbe;
Farbe ampel = GRUEN;             /* kein "enum" nötig */

/* Explizite Werte */
typedef enum { MO=1, DI, MI, DO, FR, SA, SO } Wochentag;
/* MO=1, DI=2, MI=3, DO=4, FR=5, SA=6, SO=7 */

✏️ Übungen

Übung 1

enum lesen – Werte bestimmen

Gegeben ist folgende Deklaration:

C
typedef enum { JAN=1, FEB, MAR, APR } Monat;

a) Welche Zahlenwerte haben FEB, MAR und APR?

enum-NameZahlenwertDeine Antwort
JAN1 (gegeben) 
FEB  
MAR  
APR  

b) Was gibt printf("%d", APR); aus?

c) Was ist der Unterschied zwischen JAN=1 und dem Standard (ohne =1)?

Wenn ein Eintrag den Wert N bekommt, zählen alle folgenden automatisch weiter: N+1, N+2, …
Übung 2

enum definieren – Jahreszeiten

Definiere ein typedef enum für die vier Jahreszeiten (FRUEHLING, SOMMER, HERBST, WINTER) und schreibe ein Programm, das alle vier Jahreszeiten mit ihrem Zahlenwert ausgibt.

Erwartete Ausgabe:

FRUEHLING = 0 SOMMER = 1 HERBST = 2 WINTER = 3
#include <stdio.h> /* Hier typedef enum fuer Jahreszeiten definieren */ int main() { /* Hier alle 4 Jahreszeiten mit printf ausgeben */ /* Verwende %d fuer den Zahlenwert */ return 0; }
Ohne expliziten Startwert beginnt enum bei 0. FRUEHLING bekommt also automatisch den Wert 0.
Übung 3

enum in switch – Ampelsteuerung

Das Gerüst einer Ampelsteuerung ist vorgegeben. Fülle die fehlenden switch-Cases aus. Für jede Ampelfarbe soll eine sinnvolle Nachricht ausgegeben werden.

#include <stdio.h> typedef enum { ROT, GELB, GRUEN } Ampelfarbe; void zeige_ampel(Ampelfarbe farbe) { switch (farbe) { case ROT: /* Hier printf fuer ROT */ break; case GELB: /* Hier printf fuer GELB */ break; case GRUEN: /* Hier printf fuer GRUEN */ break; default: printf("Unbekannte Ampelfarbe!\n"); break; } } int main() { zeige_ampel(ROT); zeige_ampel(GELB); zeige_ampel(GRUEN); return 0; }

Erwartete Ausgabe (Beispiel):

STOP – Rot! Achtung – Gelb! Los – Gruen!
Der switch mit enum funktioniert genauso wie mit int — enum-Werte sind intern Ganzzahlen!
Übung 4

Vollständiges Programm – Wochentag-Checker

Schreibe ein vollständiges C-Programm mit:

  1. einem typedef enum Wochentag mit MO bis SO (MO=1)
  2. einer Funktion int ist_wochenende(Wochentag t) die 1 zurückgibt wenn SA oder SO, sonst 0
  3. einer main()-Funktion die alle 7 Tage durchläuft und ausgibt ob es ein Wochentag oder Wochenende ist
#include <stdio.h> /* typedef enum Wochentag hier definieren */ /* Funktion ist_wochenende hier schreiben */ int main() { /* Schleife von MO bis SO */ /* ist_wochenende() aufrufen und Ergebnis ausgeben */ return 0; }

Erwartete Ausgabe:

Tag 1: Arbeitstag Tag 2: Arbeitstag Tag 3: Arbeitstag Tag 4: Arbeitstag Tag 5: Arbeitstag Tag 6: Wochenende! Tag 7: Wochenende!
Du kannst über enum-Werte mit einer for-Schleife iterieren: for (tag = MO; tag <= SO; tag++) — weil enum intern int ist!
Übung 5

Fehlercodes – enum als Fehlercode-System

In echten Programmen werden Fehlercodes oft als enum modelliert. Schreibe ein Programm mit:

  1. einem typedef enum Fehlercode mit: KEIN_FEHLER=0, DATEI_FEHLER, SPEICHER_FEHLER, NETZ_FEHLER
  2. einer Funktion void zeige_fehler(Fehlercode code) die je nach code eine aussagekräftige Fehlermeldung ausgibt
  3. einer main() die alle 4 Fehlercodes testet
#include <stdio.h> typedef enum { KEIN_FEHLER = 0, DATEI_FEHLER, SPEICHER_FEHLER, NETZ_FEHLER } Fehlercode; void zeige_fehler(Fehlercode code) { switch (code) { /* Hier alle cases implementieren */ /* z.B. case DATEI_FEHLER: printf("Fehler: Datei nicht gefunden!\n"); break; */ } } int main() { zeige_fehler(KEIN_FEHLER); zeige_fehler(DATEI_FEHLER); zeige_fehler(SPEICHER_FEHLER); zeige_fehler(NETZ_FEHLER); return 0; }

Fragen zum Nachdenken:

Warum ist es sinnvoll, KEIN_FEHLER den Wert 0 zu geben?

Viele C-Funktionen geben 0 für "Erfolg" zurück. Wenn KEIN_FEHLER=0 ist, passt das nahtlos zu diesem Muster und man kann if (!code) schreiben.
Übung 6 – Bonus

Spielstatus-Maschine

Simuliere einen einfachen Spielzyklus mit einem enum Spielstatus. Das Spiel soll folgende Zustände durchlaufen: MENU → SPIELEND → PAUSE → SPIELEND → GAME_OVER.

Schreibe eine Funktion void zeige_status(Spielstatus s) und simuliere in main() den Übergang durch alle Zustände mit einer Verzögerungsmeldung zwischen den Schritten.

#include <stdio.h> typedef enum { MENU, SPIELEND, PAUSE, GAME_OVER } Spielstatus; void zeige_status(Spielstatus s) { switch (s) { case MENU: printf("=== HAUPTMENU ===\n"); printf("Druecke Start...\n"); break; case SPIELEND: /* Hier ausgeben dass das Spiel laeuft */ break; case PAUSE: /* Hier Pause-Meldung ausgeben */ break; case GAME_OVER: /* Hier Game-Over-Nachricht ausgeben */ break; } } int main() { /* Spielzyklus simulieren: MENU -> SPIELEND -> PAUSE -> SPIELEND -> GAME_OVER */ Spielstatus zustand; zustand = MENU; zeige_status(zustand); printf("--- Spiel startet ---\n\n"); /* Hier die weiteren Zustandsuebergaenge ergaenzen */ return 0; }

Erwartete Ausgabe (Beispiel):

=== HAUPTMENU === Druecke Start... --- Spiel startet --- Spiel laeuft... --- Spieler pausiert --- PAUSE – Spiel angehalten --- Weiter --- Spiel laeuft... --- Spieler verliert --- *** GAME OVER *** Punktzahl wird gespeichert...

Erweiterung (optional):

Eine Zustandsmaschine (State Machine) ist ein fundamentales Programmierkonzept. enum ist das perfekte Werkzeug dafür — jeder Zustand hat einen klaren Namen, switch deckt alle Fälle ab.

✅ Selbst-Checkliste nach diesen Übungen