Menu
Coddy logo textTech

enum для именованных констант

Часть раздела Logic & Flow путешествия по C на Coddy — урок 55 из 63.

При написании программ на языке C вам часто приходится работать с наборами связанных константных значений. Например, вам может понадобиться представить дни недели, месяцы года или различные состояния в программе. Вместо использования простых чисел, таких как 0, 1, 2, вы можете использовать enum для создания осмысленных имен для этих констант.

Перечисляемый тип, или enum, позволяет определить группу именованных целочисленных констант. Это делает ваш код гораздо более читаемым и простым в обслуживании. Вот базовый синтаксис:

enum DayOfWeek {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

По умолчанию первое имя получает значение 0, второе — 1 и так далее. Таким образом, MONDAY равно 0, TUESDAY равно 1, а SUNDAY равно 6. Этот подход гораздо понятнее, чем запоминание того, что день 0 означает понедельник, а день 6 — воскресенье.

Использование enum делает ваш код самодокументируемым и помогает предотвратить ошибки, которые могут возникнуть при использовании «магических чисел» во всей вашей программе.

Вы можете объявлять переменные перечисляемого типа (enum) и присваивать им значения перечисления:

enum DayOfWeek today;
today = MONDAY;  // присваивает 0 переменной today
challenge icon

Задание

Легко

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

  1. Определить enum с именем TrafficLight со следующими константами именно в таком порядке:
    • RED
    • YELLOW
    • GREEN
  2. В функции main:
    • Объявить переменную типа enum TrafficLight с именем currentLight
    • Считать целое число из входных данных, представляющее состояние светофора (0, 1 или 2)
    • Присвоить соответствующее значение перечисления переменной currentLight на основе входных данных:
      • Если введено 0, присвоить RED
      • Если введено 1, присвоить YELLOW
      • Если введено 2, присвоить GREEN
    • Вывести текущий статус светофора в точном формате: Current light: [enum_name]
    • Вывести числовое значение текущего света в точном формате: Numeric value: [number]
    • Определить и вывести действие на основе текущего света:
      • Если RED: вывести Action: Stop
      • Если YELLOW: вывести Action: Caution
      • Если GREEN: вывести Action: Go
    • Рассчитать и вывести следующий свет в последовательности:
      • Если текущий свет RED (0), следующий — GREEN (2)
      • Если текущий свет YELLOW (1), следующий — RED (0)
      • Если текущий свет GREEN (2), следующий — YELLOW (1)
    • Вывести следующий свет в точном формате: Next light: [enum_name]

Эта задача демонстрирует, как константы enum делают код более читаемым по сравнению с использованием обычных чисел. Вместо того чтобы запоминать, что 0 означает красный, 1 — желтый, а 2 — зеленый, вы можете использовать осмысленные имена, такие как RED, YELLOW и GREEN. Вы попрактикуетесь в определении перечисления, использовании констант перечисления в присваиваниях и сравнениях, а также в доступе к базовым целочисленным значениям констант перечисления.

Шпаргалка

Перечисление enum позволяет определить группу именованных целочисленных констант, что делает код более читаемым, чем при использовании обычных чисел:

enum DayOfWeek {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
};

По умолчанию первое имя получает значение 0, второе — 1 и так далее. Таким образом, MONDAY равно 0, TUESDAY равно 1 и т. д.

Вы можете объявлять переменные типа enum и присваивать им значения перечисления:

enum DayOfWeek today;
today = MONDAY;  // присваивает 0 переменной today

Попробуйте сами

#include <stdio.h>

// TODO: Определите перечисление TrafficLight здесь

int main() {
    // Считать ввод
    int input;
    scanf("%d", &input);
    
    // TODO: Объявите переменную currentLight и присвойте значение перечисления на основе ввода
    
    // TODO: Вывести текущий статус светофора
    
    // TODO: Вывести числовое значение
    
    // TODO: Вывести действие на основе текущего света
    
    // TODO: Рассчитать и вывести следующий свет
    
    return 0;
}
quiz iconПроверьте себя

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

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