Тип данных перечисление (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