Enums in Switch-Anweisungen
Teil des Abschnitts Logic & Flow 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 Sie Enum-Konstanten als Fälle in einer Switch-Anweisung verwenden, wird der Code selbstdokumentierend. Anstatt mysteriöse Zahlen wie case 0: oder case 5: zu sehen, sehen Sie 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 Ihren Code viel einfacher zu verstehen und zu ändern. Jeder, der diesen Code liest, weiß sofort, was jeder Fall darstellt, und das Hinzufügen neuer Fälle oder das Ändern der Logik wird unkompliziert. Der Compiler hilft auch dabei, Fehler zu finden – wenn Sie eine Enum-Konstante falsch schreiben, erhalten Sie einen Kompilierungsfehler anstelle eines stillen Fehlers.
Aufgabe
EinfachErstellen Sie ein C-Programm, das ein Enum mit einer Switch-Anweisung verwendet, um ein einfaches Wetterberatungssystem aufzubauen. Ihr Programm sollte:
- Definieren Sie ein
enumnamensWeatherConditionmit den folgenden Konstanten in genau dieser Reihenfolge:SUNNYCLOUDYRAINYSTORMYSNOWY
- Schreiben Sie eine Funktion namens
getWeatherAdvice, die:- Einen
enum WeatherConditionParameter namensweatherentgegennimmt - Nichts zurückgibt (void)
- Eine
switch-Anweisung verwendet, um wetterspezifische Ratschläge basierend auf der Bedingung auszugeben:- Für
SUNNY: geben SiePerfect day for outdoor activities!aus - Für
CLOUDY: geben SieGood day for a walk, no sun protection needed.aus - Für
RAINY: geben SieDon't forget your umbrella!aus - Für
STORMY: geben SieStay indoors and avoid travel.aus - Für
SNOWY: geben SieDrive carefully and dress warmly.aus
- Für
- Einen
- Schreiben Sie eine Funktion namens
getActivitySuggestion, die:- Einen
enum WeatherConditionParameter namensweatherentgegennimmt - Nichts zurückgibt (void)
- Eine
switch-Anweisung verwendet, um Aktivitäten basierend auf dem Wetter vorzuschlagen:- Für
SUNNY: geben SieSuggested activity: Beach or hikingaus - Für
CLOUDY: geben SieSuggested activity: Photography or gardeningaus - Für
RAINY: geben SieSuggested activity: Reading or indoor gamesaus - Für
STORMY: geben SieSuggested activity: Movie marathonaus - Für
SNOWY: geben SieSuggested activity: Skiing or hot cocoaaus
- Für
- Einen
- In der main-Funktion:
- Deklarieren Sie eine Variable vom Typ
enum WeatherConditionnamenscurrentWeather - Lesen Sie eine Ganzzahl von der Eingabe ein, die die Wetterbedingung repräsentiert (0, 1, 2, 3 oder 4)
- Weisen Sie
currentWeatherbasierend auf der Eingabe den entsprechenden Enum-Wert zu - Geben Sie die aktuelle Wetterbedingung in genau diesem Format aus:
Current weather: [numeric_value] - Rufen Sie die Funktion
getWeatherAdvicemitcurrentWeatherauf - Rufen Sie die Funktion
getActivitySuggestionmitcurrentWeatherauf
- Deklarieren Sie eine Variable vom Typ
Diese Herausforderung demonstriert die Stärke der Kombination von Enums mit Switch-Anweisungen, um lesbaren und wartbaren Code zu erstellen. Anstatt verwirrende numerische Fälle in Ihren Switch-Anweisungen zu verwenden, nutzen Sie aussagekräftige Enum-Konstanten, die die Logik des Programms klar ausdrücken. Die Switch-Anweisung wird selbstdokumentierend, was es einfach macht zu verstehen, was jeder Fall darstellt, und das Verhalten bei Bedarf anzupassen.
Spickzettel
Die Verwendung von enum-Werten mit switch-Anweisungen erzeugt eine lesbare und wartbare Kontrollflusslogik:
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 den Code selbstdokumentierend, indem aussagekräftige Namen anstelle von mysteriösen Zahlen wie case 0: oder case 5: verwendet werden. Der Compiler hilft dabei, Fehler zu finden, indem er Kompilierungsfehler für falsch geschriebene Enum-Konstanten erzeugt, anstatt unbemerkte Bugs zu verursachen.
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 Logic & Flow
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