Enum в операторах switch
Часть раздела Logic & Flow путешествия по C на Coddy — урок 57 из 63.
Одним из самых мощных сочетаний в программировании на C является использование значений enum с операторами switch. Эта связка создает исключительно читаемую и поддерживаемую логику управления потоком, которая четко выражает процесс принятия решений в вашей программе.
Когда вы используете константы перечисления (enum) в качестве вариантов в операторе switch, код становится самодокументированным. Вместо того чтобы видеть загадочные числа вроде case 0: или case 5:, вы видите осмысленные имена, которые сразу передают их назначение:
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;
}Этот подход делает ваш код гораздо более понятным и простым для изменения. Любой, кто читает этот код, сразу понимает, что представляет собой каждый случай, а добавление новых случаев или изменение логики становится простым процессом. Компилятор также помогает отлавливать ошибки — если вы допустите опечатку в константе enum, вы получите ошибку компиляции, а не скрытый баг.
Задание
ЛегкоСоздайте программу на языке C, которая использует перечисление (enum) с оператором switch для создания простой системы рекомендаций по погоде. Ваша программа должна:
- Определить
enumс именемWeatherConditionсо следующими константами в указанном порядке:SUNNYCLOUDYRAINYSTORMYSNOWY
- Написать функцию с именем
getWeatherAdvice, которая:- Принимает параметр типа
enum WeatherConditionс именемweather - Ничего не возвращает (void)
- Использует оператор
switchдля вывода совета, соответствующего погоде:- Для
SUNNY: напечататьPerfect day for outdoor activities! - Для
CLOUDY: напечататьGood day for a walk, no sun protection needed. - Для
RAINY: напечататьDon't forget your umbrella! - Для
STORMY: напечататьStay indoors and avoid travel. - Для
SNOWY: напечататьDrive carefully and dress warmly.
- Для
- Принимает параметр типа
- Написать функцию с именем
getActivitySuggestion, которая:- Принимает параметр типа
enum WeatherConditionс именемweather - Ничего не возвращает (void)
- Использует оператор
switchдля предложения занятий в зависимости от погоды:- Для
SUNNY: напечататьSuggested activity: Beach or hiking - Для
CLOUDY: напечататьSuggested activity: Photography or gardening - Для
RAINY: напечататьSuggested activity: Reading or indoor games - Для
STORMY: напечататьSuggested activity: Movie marathon - Для
SNOWY: напечататьSuggested activity: Skiing or hot cocoa
- Для
- Принимает параметр типа
- В функции main:
- Объявить переменную типа
enum WeatherConditionс именемcurrentWeather - Считать целое число из входных данных, представляющее погодное условие (0, 1, 2, 3 или 4)
- Присвоить соответствующее значение перечисления переменной
currentWeatherна основе ввода - Вывести текущее погодное условие в точном формате:
Current weather: [numeric_value] - Вызвать функцию
getWeatherAdviceс аргументомcurrentWeather - Вызвать функцию
getActivitySuggestionс аргументомcurrentWeather
- Объявить переменную типа
Эта задача демонстрирует возможности сочетания перечислений с операторами switch для создания читаемого и поддерживаемого кода. Вместо использования запутанных числовых вариантов в операторах switch, вы будете использовать осмысленные константы перечисления, которые четко выражают логику программы. Оператор switch становится самодокументированным, что позволяет легко понять, что представляет собой каждый вариант, и при необходимости изменить поведение.
Шпаргалка
Использование значений enum с операторами switch создает читаемую и поддерживаемую логику управления потоком выполнения:
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;
}Этот подход делает код самодокументируемым за счет использования осмысленных имен вместо загадочных чисел, таких как case 0: или case 5:. Компилятор помогает отлавливать ошибки, генерируя ошибки компиляции для опечаток в константах enum, а не допуская скрытые баги.
Попробуйте сами
#include <stdio.h>
// TODO: Определите перечисление WeatherCondition здесь
// TODO: Реализуйте функцию getWeatherAdvice здесь
// TODO: Реализуйте функцию getActivitySuggestion здесь
int main() {
// Чтение входных данных
int weatherInput;
scanf("%d", &weatherInput);
// TODO: Объявите переменную currentWeather и присвойте ей значение перечисления на основе входных данных
// TODO: Выведите текущее состояние погоды в формате "Current weather: [numeric_value]"
// TODO: Вызовите функцию getWeatherAdvice
// TODO: Вызовите функцию getActivitySuggestion
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов7Структуры (structs)
Что такое структура?Объявление структурыСоздание переменных структурДоступ к членам структурыИнициализация структурПовторение: структура данных Student10Перечисления и typedef
enum для именованных константОбъявление и использование enumEnum в операторах switchИспользование typedef для псевдонимов типовtypedef со структурамиИтоги: практика по typedef и enum2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции