Menu
Coddy logo textTech

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, вы получите ошибку компиляции, а не скрытый баг.

challenge icon

Задание

Легко

Создайте программу на языке C, которая использует перечисление (enum) с оператором switch для создания простой системы рекомендаций по погоде. Ваша программа должна:

  1. Определить enum с именем WeatherCondition со следующими константами в указанном порядке:
    • SUNNY
    • CLOUDY
    • RAINY
    • STORMY
    • SNOWY
  2. Написать функцию с именем 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.
  3. Написать функцию с именем 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
  4. В функции 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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow