Enums in Switch-Anweisungen
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 57 von 63.
Eine der leistungsfähigsten Kombinationen in der C-Programmierung ist die Verwendung von enum-Werten mit switch-Anweisungen. Diese Paarung erzeugt eine außergewöhnlich lesbare und wartbare Kontrollflusslogik, die den Entscheidungsprozess Ihres Programms klar zum Ausdruck bringt.
Wenn du Enum-Konstanten als Fälle in einer switch-Anweisung verwendest, wird der Code selbstdokumentierend. Anstatt mysteriöse Zahlen wie case 0: oder case 5: zu sehen, siehst du aussagekräftige Namen, die ihren Zweck sofort vermitteln:
switch (day) {
case MONDAY:
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
case FRIDAY:
printf("It's a weekday\n");
break;
case SATURDAY:
case SUNDAY:
printf("It's a weekend\n");
break;
}Dieser Ansatz macht deinen Code deutlich leichter verständlich und zu ändern. Jeder, der diesen Code liest, weiß sofort, wofür jeder Fall steht, und das Hinzufügen neuer Fälle oder das Ändern der Logik wird unkompliziert. Der Compiler hilft außerdem dabei, Fehler zu erkennen – wenn du eine Enum-Konstante falsch schreibst, erhältst du einen Kompilierungsfehler statt eines unbemerkten Fehlers.
Aufgabe
EinfachErstelle ein C-Programm, das ein enum mit einer switch-Anweisung verwendet, um ein einfaches Wetterberatungssystem zu erstellen. Dein Programm sollte:
- Ein
enumnamensWeatherConditionmit den folgenden Konstanten in genau dieser Reihenfolge definieren:SUNNYCLOUDYRAINYSTORMYSNOWY
- Eine Funktion namens
getWeatherAdviceschreiben, die:- Einen Parameter vom Typ
enum WeatherConditionnamensweatherentgegennimmt - Nichts zurückgibt (void)
- Eine
switch-Anweisung verwendet, um abhängig von der Bedingung wetterspezifische Ratschläge auszugeben:- Für
SUNNY:Perfect day for outdoor activities!ausgeben - Für
CLOUDY:Good day for a walk, no sun protection needed.ausgeben - Für
RAINY:Don't forget your umbrella!ausgeben - Für
STORMY:Stay indoors and avoid travel.ausgeben - Für
SNOWY:Drive carefully and dress warmly.ausgeben
- Für
- Einen Parameter vom Typ
- Eine Funktion namens
getActivitySuggestionschreiben, die:- Einen Parameter vom Typ
enum WeatherConditionnamensweatherentgegennimmt - Nichts zurückgibt (void)
- Eine
switch-Anweisung verwendet, um Aktivitäten abhängig vom Wetter vorzuschlagen:- Für
SUNNY:Suggested activity: Beach or hikingausgeben - Für
CLOUDY:Suggested activity: Photography or gardeningausgeben - Für
RAINY:Suggested activity: Reading or indoor gamesausgeben - Für
STORMY:Suggested activity: Movie marathonausgeben - Für
SNOWY:Suggested activity: Skiing or hot cocoaausgeben
- Für
- Einen Parameter vom Typ
- In der main-Funktion:
- Eine Variable vom Typ
enum WeatherConditionnamenscurrentWeatherdeklarieren - Eine Ganzzahl aus der Eingabe lesen, die die Wetterbedingung darstellt (0, 1, 2, 3 oder 4)
- Den entsprechenden enum-Wert abhängig von der Eingabe
currentWeatherzuweisen - Die aktuelle Wetterbedingung in genau diesem Format ausgeben:
Current weather: [numeric_value] - Die Funktion
getWeatherAdvicemitcurrentWeatheraufrufen - Die Funktion
getActivitySuggestionmitcurrentWeatheraufrufen
- Eine Variable vom Typ
Diese Herausforderung zeigt die Vorteile der Kombination von enums mit switch-Anweisungen, um lesbaren und wartbaren Code zu erstellen. Anstatt verwirrende numerische Fälle in deinen switch-Anweisungen zu verwenden, nutzt du aussagekräftige enum-Konstanten, die die Logik des Programms klar ausdrücken. Die switch-Anweisung wird dadurch selbstdokumentierend, sodass leicht verständlich ist, wofür jeder Fall steht und wie sich das Verhalten bei Bedarf ändern lässt.
Probier es selbst
#include <stdio.h>
// TODO: Definieren Sie hier das WeatherCondition-Enum
// TODO: Implementieren Sie hier die Funktion getWeatherAdvice
// TODO: Implementieren Sie hier die Funktion getActivitySuggestion
int main() {
// Eingabe lesen
int weatherInput;
scanf("%d", &weatherInput);
// TODO: Deklarieren Sie die Variable currentWeather und weisen Sie den Enum-Wert basierend auf der Eingabe zu
// TODO: Geben Sie die aktuelle Wetterbedingung im Format "Current weather: [numeric_value]" aus
// TODO: Rufen Sie die Funktion getWeatherAdvice auf
// TODO: Rufen Sie die Funktion getActivitySuggestion auf
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