Enum w instrukcjach switch
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 57 z 63.
Jednym z najpotężniejszych połączeń w programowaniu w C jest używanie wartości enum wraz z instrukcjami switch. To połączenie tworzy wyjątkowo czytelną i łatwą w utrzymaniu logikę przepływu sterowania, która jasno wyraża proces podejmowania decyzji przez program.
Gdy używasz stałych wyliczeniowych jako przypadków w instrukcji switch, kod staje się samodokumentujący. Zamiast widzieć tajemnicze liczby, takie jak case 0: lub case 5:, widzisz znaczące nazwy, które od razu wskazują ich przeznaczenie:
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;
}To podejście znacznie ułatwia zrozumienie i modyfikowanie kodu. Każdy, kto czyta ten kod, od razu wie, co oznacza każdy przypadek, a dodawanie nowych przypadków lub zmiana logiki staje się prosta. Kompilator pomaga też wychwytywać błędy — jeśli błędnie zapiszesz stałą wyliczeniową, pojawi się błąd kompilacji, a nie niezauważony błąd.
Wyzwanie
ŁatwyStwórz program w języku C, który wykorzystuje typ wyliczeniowy enum i instrukcję switch do zbudowania prostego systemu udzielającego porad dotyczących pogody. Twój program powinien:
- Zdefiniować typ wyliczeniowy
enumo nazwieWeatherConditionz następującymi stałymi w dokładnie tej kolejności:SUNNYCLOUDYRAINYSTORMYSNOWY
- Napisać funkcję o nazwie
getWeatherAdvice, która:- Przyjmuje parametr typu
enum WeatherConditiono nazwieweather - Nic nie zwraca (
void) - Używa instrukcji
switch, aby wyświetlić poradę dotyczącą pogody, zależnie od warunków:- Dla
SUNNY: wyświetlaPerfect day for outdoor activities! - Dla
CLOUDY: wyświetlaGood day for a walk, no sun protection needed. - Dla
RAINY: wyświetlaDon't forget your umbrella! - Dla
STORMY: wyświetlaStay indoors and avoid travel. - Dla
SNOWY: wyświetlaDrive carefully and dress warmly.
- Dla
- Przyjmuje parametr typu
- Napisać funkcję o nazwie
getActivitySuggestion, która:- Przyjmuje parametr typu
enum WeatherConditiono nazwieweather - Nic nie zwraca (
void) - Używa instrukcji
switch, aby zaproponować aktywności zależnie od pogody:- Dla
SUNNY: wyświetlaSuggested activity: Beach or hiking - Dla
CLOUDY: wyświetlaSuggested activity: Photography or gardening - Dla
RAINY: wyświetlaSuggested activity: Reading or indoor games - Dla
STORMY: wyświetlaSuggested activity: Movie marathon - Dla
SNOWY: wyświetlaSuggested activity: Skiing or hot cocoa
- Dla
- Przyjmuje parametr typu
- W funkcji main:
- Zadeklarować zmienną typu
enum WeatherConditiono nazwiecurrentWeather - Odczytać z wejścia liczbę całkowitą reprezentującą warunki pogodowe (0, 1, 2, 3 lub 4)
- Przypisać do
currentWeatherodpowiednią wartość typu wyliczeniowego na podstawie danych wejściowych - Wyświetlić aktualne warunki pogodowe w dokładnie takim formacie:
Current weather: [numeric_value] - Wywołać funkcję
getWeatherAdvicez argumentemcurrentWeather - Wywołać funkcję
getActivitySuggestionz argumentemcurrentWeather
- Zadeklarować zmienną typu
To wyzwanie pokazuje, jak połączenie typów wyliczeniowych z instrukcjami switch pozwala tworzyć czytelny i łatwy w utrzymaniu kod. Zamiast używać w instrukcjach switch nieczytelnych wartości liczbowych, użyjesz znaczących stałych typu wyliczeniowego, które jasno wyrażają logikę programu. Instrukcja switch staje się samodokumentująca, dzięki czemu łatwo zrozumieć, co reprezentuje każdy przypadek, i w razie potrzeby zmodyfikować działanie programu.
Spróbuj swoich sił
#include <stdio.h>
// TODO: Zdefiniuj tutaj typ wyliczeniowy WeatherCondition
// TODO: Zaimplementuj tutaj funkcję getWeatherAdvice
// TODO: Zaimplementuj tutaj funkcję getActivitySuggestion
int main() {
// Odczytaj dane wejściowe
int weatherInput;
scanf("%d", &weatherInput);
// TODO: Zadeklaruj zmienną currentWeather i przypisz jej wartość typu wyliczeniowego na podstawie danych wejściowych
// TODO: Wypisz aktualne warunki pogodowe w formacie "Current weather: [numeric_value]"
// TODO: Wywołaj funkcję getWeatherAdvice
// TODO: Wywołaj funkcję getActivitySuggestion
return 0;
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i sterowanie przepływem
1Podstawy wskaźników
Czym jest wskaźnik?Deklarowanie wskaźnikówOperator pobrania adresu (&)Operator dereferencji (*)Wskaźniki NULLPodsumowanie: podstawy wskaźników4Projekt: Proste narzędzie tekstowe
Przegląd projektuLiczenie znaków7Struktury (struct)
Czym jest struktura?Deklarowanie strukturyTworzenie zmiennych strukturyDostęp do składowych strukturyInicjalizacja strukturPodsumowanie: struktura danych studenta10Enum i typedef
enum dla nazwanych stałychDeklarowanie i używanie enumEnum w instrukcjach switchUżywanie typedef do tworzenia aliasów typówtypedef ze strukturamiPowtórka: ćwiczenia z typedef i enum2Wskaźniki i tablice
Nazwy tablic jako wskaźnikiElementy tablic — wskaźnikiArytmetyka wskaźnikówPorównywanie wskaźnikówPodsumowanie: przechodzenie po tablicy za pomocą wskaźników5Wskaźniki i funkcje
Przekazywanie przez wartośćPrzekazywanie wskaźników do funkcjiModyfikowanie zmiennych za pomocą wskaźnikówKlasyczny przykład: zamianaPrzekazywanie tablic do funkcjiPowtórka: argumenty wskaźnikowe funkcji8Struktury i wskaźniki
Wskaźniki do strukturOperator strzałki (->)Przekazywanie struktur przez wartośćPrzekazywanie wskaźników do strukturDynamiczna alokacja strukturPodsumowanie: modyfikowanie struktury — wskaźnik11Końcowe zadania powtórkowe
Powtórka: dynamiczne łączenie ciągów znakówPowtórka: tablica strukturPowtórka: licznik częstotliwości słów3Tablice znaków i ciągi znaków
Ciągi znaków jako tablice charZnak końca ciąguWczytywanie ciągu za pomocą scanfUżywanie strlen()Używanie strcpy()Używanie strcat()Używanie strcmp()Podsumowanie: podstawowe funkcje do obsługi ciągów znakówPoćwicz samodzielnie: Kompilator C online