Работа с перечислениями (enum)

Тип данных перечисление (enumeration) используется для создания мнемонических (смысловых) идентификаторов для набора целых констант. Синтаксис для описания переменной типа перечисление подобен описанию структурной переменной двумя способами:

1) совместное описание шаблона и переменной:

enum [имя_шаблона] { имя1[ =константа ],…} переменная1,…;

2) определение переменной с предварительно описанным шаблоном:

enum имя_шаблона переменная1,…;

где части, заключенные в [ ] можно опускать;

enum – ключевое слово;

имя_шаблона – идентификатор, именующий шаблон;

имя1 и т.д. – именованные константы, которые по умолчанию начинаются с 0, а последующие увеличиваются на 1;

константа – явно задаваемое значение именованной константе, причем следующая увеличивается на 1, если не задана явно;

переменная1,... – идентификаторы переменных типа enum.

Пример. Описание шаблона и переменных типа перечисления:

еnum days { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } weekday, anyday;

Можно описать тип перечисления и использовать для определения переменных этого типа, например,

typedef enum { Saturday=0, Sunday=0, Monday, Tuesday, Wednesday,
Thursday, Friday

} DAYS; /* новый тип перечисления */

DAYS workday, anyday; /* переменные типа перечисления */

Имя переменной перечисления может использоваться всюду в выражениях и описаниях типов. Переменной типа enum могут присваиваться только значения, задаваемые перечисляемыми именованными константами.

Пример. В программе требуется определить по номеру введенного дня (от 0 до 6) предыдущий и последующий дни недели. Используется новый тип перечисления DAYS, применяемый в функциях для определения переменных типа перечисления. Для определения названий дней недели применяется массив указателей.

Программа:

#include<stdio.h>

#include<conio.h>

#define NUMDAYS 7 /* количество дней недели */

typedef enum { /* именованные константы, начиная с 0: */

Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday

} DAYS; /* объявление нового типа */

void main () /* главная функция */

{ /* описание переменных и функций: */

DAYS today, before, after, day_before(), day_after();

void print_day (DAYS); /* прототип функции */

clrscr(); /* очистка экрана */

do /* цикл диалога */

{ printf (“Введите день недели (от 0 до 6):”);

scanf (“%d”, &today); /* ввод номера дня недели */

if (today <0 || today >= NUMDAYS) /* проверка значения
дня недели */

{ puts (“Ошибка!”);

goto next; /* переход к новому циклу */

}

after = day_after (today); /* определение следующего дня */

before = day_before (today); /* определение предыдущего дня */

printf (“если сегодня”);

print_day (today); /* вывод названия дня */

printf (“, то завтра будет”);

print_day (after); /* вывод названия дня */

printf (“,\na вчера был(а, о)”);

print_day (before) /* вывод названия дня */

printf (“.\n”); /* перевод курсора на экране */

next: printf (“Хотите продолжить? Если НЕТ, введите 0, “
“ДА – любую другую цифру:”);

scanf (“%d”, &today); /* ввод числа */

} while (today); /* окончание цикла диалога */

}

DAYS day_after (DAYS day) /*функция определения следующего дня */

{

return ((day+1) % numdays); /* остаток от деления по модулю */

}

DAYS day_before (DAYS day) /* функция для предыдущего дня */

{ int prev;

prev=(day-1) % NUMDAYS;

return (prev<0)? (NUMDAYS –1): prev; /* если prev == –1, то
NUMDAYS –1 == 6 */

}

void print_day (DAYS day) /* функция вывода дня недели */

{ int day_i = day; /* полученное значения дня недели */

static char days[ ]= { / * массив указателей на название дней недели: */

“воскресенье”, “понедельник”, “вторник”,

“среда”, “четверг”, “пятница”, “суббота”

};

printf (“%s”, days[day_i]); /* выбор из массива названия дня недели */

}

Результаты программы:

Введите день недели (от 0 до 6): 0

если сегодня воскресенье, то завтра будет понедельник,

а вчера был(а, о) суббота.

Хотите продолжить? Если НЕТ введите 0, ДА – любую другую цифру: 1

Введите день недели (от 0 до 6): 7

Ошибка!

Хотите продолжить? Если НЕТ введите 0, ДА – любую другую цифру:0


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: