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Задание
ЛегкоСоздайте программу на языке C, которая определяет перечисление enum для цветов светофора и демонстрирует его использование. Ваша программа должна:
- Определить
enumс именемTrafficLightсо следующими константами именно в таком порядке:REDYELLOWGREEN
- В функции main:
- Объявить переменную типа
enum TrafficLightс именемcurrentLight - Считать целое число из входных данных, представляющее состояние светофора (0, 1 или 2)
- Присвоить соответствующее значение перечисления переменной
currentLightна основе входных данных:- Если введено 0, присвоить
RED - Если введено 1, присвоить
YELLOW - Если введено 2, присвоить
GREEN
- Если введено 0, присвоить
- Вывести текущий статус светофора в точном формате:
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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела 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()Итоги: основные строковые функции