enum für benannte Konstanten
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 55 von 63.
Beim Schreiben von C-Programmen musst du oft mit Gruppen zusammengehöriger konstanter Werte arbeiten. Zum Beispiel musst du vielleicht die Wochentage, die Monate des Jahres oder verschiedene Zustände in einem Programm darstellen. Statt rohe Zahlen wie 0, 1, 2 zu verwenden, kannst du mit enum aussagekräftige Namen für diese Konstanten erstellen.
Ein Aufzählungstyp oder enum ermöglicht es dir, eine Gruppe benannter ganzzahliger Konstanten zu definieren. Dadurch wird dein Code viel besser lesbar und leichter zu warten. Hier ist die grundlegende Syntax:
enum DayOfWeek {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};Standardmäßig erhält der erste Name den Wert 0, der zweite den Wert 1 und so weiter. Also ist MONDAY gleich 0, TUESDAY gleich 1 und SUNDAY gleich 6. Dieser Ansatz ist viel klarer, als sich merken zu müssen, dass Tag 0 Montag oder Tag 6 Sonntag bedeutet.
Die Verwendung von enum macht deinen Code selbstdokumentierend und hilft, Fehler zu vermeiden, die auftreten können, wenn du im gesamten Programm magische Zahlen verwendest.
Du kannst Variablen vom Enum-Typ deklarieren und ihnen Enum-Werte zuweisen:
enum DayOfWeek today;
today = MONDAY; // weist today den Wert 0 zuEin Enum-Wert ist eine Ganzzahl, daher gibt printf("%d\n", today); 0 aus. C behält die Namen nicht bei, wenn das Programm ausgeführt wird. Um also das Wort MONDAY auszugeben, vergleiche den Wert und gib den Text selbst aus:
if (today == MONDAY) {
printf("MONDAY\n");
}Aufgabe
EinfachErstelle ein C-Programm, das ein enum für Ampelfarben definiert und dessen Verwendung demonstriert. Dein Programm soll:
- Ein
enumnamensTrafficLightmit den folgenden Konstanten in genau dieser Reihenfolge definieren:REDYELLOWGREEN
- In der Hauptfunktion:
- Eine Variable vom Typ
enum TrafficLightnamenscurrentLightdeklarieren - Eine Ganzzahl aus der Eingabe lesen, die den Ampelzustand darstellt (0, 1 oder 2)
- Der Variable
currentLightabhängig von der Eingabe den entsprechenden Enum-Wert zuweisen:- Wenn die Eingabe 0 ist,
REDzuweisen - Wenn die Eingabe 1 ist,
YELLOWzuweisen - Wenn die Eingabe 2 ist,
GREENzuweisen
- Wenn die Eingabe 0 ist,
- Den aktuellen Ampelstatus in genau diesem Format ausgeben:
Current light: [enum_name] - Den numerischen Wert der aktuellen Ampel in genau diesem Format ausgeben:
Numeric value: [number] - Die Aktion abhängig von der aktuellen Ampel bestimmen und ausgeben:
- Wenn
RED:Action: Stopausgeben - Wenn
YELLOW:Action: Cautionausgeben - Wenn
GREEN:Action: Goausgeben
- Wenn
- Die nächste Ampel in der Abfolge berechnen und ausgeben:
- Wenn die aktuelle Ampel
RED(0) ist, ist die nächsteGREEN(2) - Wenn die aktuelle Ampel
YELLOW(1) ist, ist die nächsteRED(0) - Wenn die aktuelle Ampel
GREEN(2) ist, ist die nächsteYELLOW(1)
- Wenn die aktuelle Ampel
- Die nächste Ampel in genau diesem Format ausgeben:
Next light: [enum_name]
- Eine Variable vom Typ
Diese Herausforderung zeigt, wie enum-Konstanten den Code lesbarer machen als die Verwendung von einfachen Zahlen. Anstatt dir merken zu müssen, dass 0 für Rot, 1 für Gelb und 2 für Grün steht, kannst du aussagekräftige Namen wie RED, YELLOW und GREEN verwenden. Du übst, ein Enum zu definieren, Enum-Konstanten in Zuweisungen und Vergleichen zu verwenden und auf die zugrunde liegenden Ganzzahlwerte von Enum-Konstanten zuzugreifen.
Probier es selbst
#include <stdio.h>
// TODO: Das TrafficLight-Enum hier definieren
int main() {
// Eingabe einlesen
int input;
scanf("%d", &input);
// TODO: Variable currentLight deklarieren und ihr anhand der Eingabe einen Enum-Wert zuweisen
// TODO: Aktuellen Ampelstatus ausgeben
// TODO: Numerischen Wert ausgeben
// TODO: Aktion anhand der aktuellen Ampel ausgeben
// TODO: Nächste Ampelphase berechnen und ausgeben
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen7Strukturen (structs)
Was ist ein Struct?Deklarieren eines StructsErstellen von Struct-VariablenZugriff auf Struct-MemberInitialisieren von StructsZusammenfassung: Studentendaten-Struct10Enums und typedef
enum für benannte KonstantenEnums deklarieren und verwendenEnums in Switch-Anweisungentypedef für Typ-Aliase verwendentypedef mit StructsWiederholung: Übung zu typedef & Enums2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-FunktionenÜbe selbstständig: Online-C-Compiler