Данные перечислимого типа

Переменная (или константа), которая может принимать значение из некоторого списка значений, называется переменной(или константой) перечислимого типа или перечислением.

Объявление перечисления начинается с ключевого слова enum.

Форма представления:

enum [Тег] { ТипДанных Идентификатор1 [= константное выражение1];

… … …

ТипДанных ИдентификаторN [= константное выражениеN];

} [СписокИдентификаторов];

enum Тег СписокИдентификаторов;

Объявление перечисления задает тип переменной перечисления и определяет список именованных констант, называемый списком перечисления. Значением каждого имени списка является некоторое целое число.

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

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

Пример:

Определить, какой месяц (из трех введенных) к какому сезону относится. Номер месяца вводить самостоятельно.

#include<stdio.h>

#include<conio.h>

void main()

{enum mes{JV,F,MT,AP,M,JU,JL,AV,ST,OKT,NV,DS};

enum sezon{ZIMA,VESNA,LETO,OSEN} s;

mes m;

int i;

for(i=MT;i<=M;i++)

{

clrscr();

printf("Введите номер месяца:\n");

printf("0-Январь,1-Февраль,...,11-Декабрь\n");

scanf("%d",&m);

switch (m) {

case DS,JV,F: {printf("ZIMA");s=ZIMA; break;}

case MT,AP,M: {printf("VESNA");s=VESNA; break;}

case JU,JL,AV: {printf("LETO");s=LETO; break;}

case ST,OKT,NV:{printf("OSEN");s=OSEN; break;}

}

printf("\nПорядковый номер сезона %d",s);

getch();

}

}

Пример: Корабль шел по курсу К1, а затем был дан приказ PR изменить направление курса. Определить новый курс К2.

#include<stdio.h>

#include<conio.h>

void main()

{enum kurs{sever,vostok,iug,zapad};

enum prikaz{vpered,vpravo,nazad,vlevo};

kurs k1,k2;

prikaz pr;

//ввод элементов cтруктуры

printf(" Задайте курс:\n");

printf("0-север; 1-восток;");

printf("2-юг; 3-запад;\n");

scanf("%d",&k1); /*ввод значения начального курса */

printf(" Измените курс:\n");

printf("0-вперед; 1-вправо;");

printf("2-назад; 3-влево;\n");

scanf("%d",&pr); /* задание приказа */

printf("Начальный курс\n");

switch (k1){ /* вывод значения начального курса на экран */

case 0:printf("север"); break;

case 1:printf("восток");break;

case 2:printf("юг");break;

case 3:printf("запад");break;

}

printf("\n Конечный курс\n");

k2=(k1+pr)%4; /*определение конечного курса */

switch (k2){ /* вывод значения конечного курса на экран */

case 0:printf(“север”); break;

case 1:printf(“восток”);break;

case 2:printf(“юг”);break;

case 3:printf(“запад”);break;

}

getch(); /*задержка*/

}

Необязательное имя тега перечисления, это идентификатор, который именует тег перечисления, определенный списком перечисления. Каждый идентификатор именует элемент перечисления. Все идентификаторы в списке enum должны быть уникальными. В случае отсутствия константного выражения первому идентификатору соответствует значение 0, следующему идентификатору - значение 1 и т.д. Имя константы перечисления эквивалентно ее значению.

Идентификатор, связанный с константным выражением, принимает значение, задаваемое этим константным выражением. Константное выражение должно иметь тип int и может быть как положительным, так и отрицательным. Следующему идентификатору в списке присваивается значение, равное константному выражению плюс 1, если этот идентификатор не имеет своего константного выражения.

Использование элементов перечисления должно подчиняться следующим правилам:

1. Переменная может содержать повторяющиеся значения.

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

3. Имена типов перечислений должны быть отличны от других имен типов перечислений, структур и смесей в этой же области видимости.

4. Значение может следовать за последним элементом списка перечисления.

Пример:

enum week { SUB = 0, /* 0 */ VOS = 0, /* 0 */ POND, /* 1 */ VTOR, /* 2 */ SRED, /* 3 */ HETV, /* 4 */ PJAT /* 5 */ } rab_ned;

В данном примере объявлен перечислимый тег week, с соответствующим множеством значений, и объявлена переменная rab_ned имеющая тип week.

Как и для структур, имя тега перечисления используется для ссылки на тип перечисления, определяемый где-то в другом месте. Имя тега перечисления должно относится к уже определенному тегу перечисления в пределах текущей области видимости. Так как тег перечисления объявлен где-то в другом месте, список перечисления не представлен в объявлении.

Пример:

enum week rab1;

В объявлении указателя на тип данных перечисления и объявляемых typedef для типов перечисления можно использовать имя тега перечисления до того, как данный тег перечисления определен. Однако определение перечисления должно предшествовать любому действию используемого указателя на тип объявления typedef. Объявление без последующего списка описателей описывает тег, или, если так можно сказать, шаблон перечисления.


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



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