Форум программистов, компьютерный форум CyberForum.ru

Перечисляемый тип - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.68
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
16.02.2013, 19:16     Перечисляемый тип #1
Помогите разобрать! Обясните, и расскажите что знаете : как, зачем, и когда применять?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
16.02.2013, 19:22     Перечисляемый тип #2
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
как
Описано в книгах и здесь на форуме есть примеры.
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
зачем
Например, чтобы избежать магических чисел.
Цитата Сообщение от aleksandr_t94 Посмотреть сообщение
и когда применять?
Когда захочешь.
AndreyD93
17 / 17 / 1
Регистрация: 13.11.2012
Сообщений: 154
16.02.2013, 19:24     Перечисляемый тип #3
Вчера была лекция по этому типу данных!! Вот она, может поможет чем-то!!



VT_NONE – тип переменной не определен;
VT_INT – целочисленный тип;
VT_FLOAT – вещественный тип;
VT_CHAR – символьный тип.

Этого можно достичь, если type_var определить как перечисляемый тип, который задается с помощью ключевого слова enum следующим образом:

C++
1
enum tag_type {VT_NONE, VT_INT, VT_FLOAT, VT_CHAR};
При этом объявление перечисляемого типа выполняется подобно объявлению структуры или объединения:

C++
1
enum tag_type type_var;
В результате для введенной переменной перечисляемого типа допустимо использование следующих операторов:

C++
1
2
3
type_var = VT_INT; //переменная type_var принимает значение VT_INT 
if(type_var == VT_NONE) // проверка 
for(type_var = VT_NONE; type_var <= VT_CHAR; type_var++)     //цикл
Анализ последнего оператора for показывает, что значения перечисляемого типа VT_NONE,…,VT_CHAR являются числами, которые имеют свои имена. Причем, VT_NONE = 0, VT_INT = 1, …, VT_CHAR = 3. В некоторых случаях использование имен удобнее использования цифр, т.к. их запоминать и ориентироваться в них проще, чем в числах.

Перепишем пример хранения разнородной информации с использованием перечисляемого типа, получим:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
enum tag_type {VT_NONE, VT_INT, VT_FLOAT, VT_CHAR}; 
struct tag_var { 
union tag_value value; 
enum tag_type type_var; 
}; 
int main() 
{ 
struct tag_var var[3]; 
var[0].type_var = VT_INT; 
var[0].value.var_i = 10; 
var[1].type_var = VT_FLOAT; 
var[1].value.var_f = 2.3; 
var[2].type_var = VT_CHAR; 
var[2].value.var_ch = ‘d’; 
for(int i = 0;i < 3;i++) 
{ 
switch(var[i].type_var) 
{ 
case VT_INT:printf(“var=%d\n”,var[i].value.var_i);break; 
case VT_FLOAT:printf(“var=%f\n”,var[i].value.var_f);break; 
case VT_CHAR:printf(“var=%c\n”,var[i].value.var_ch);break; 
default: printf(“Значение переменной не определено\n”); 
} 
} 
return 0; 
}
Из приведенного примера видно, что использование перечисляемого типа делает программу более понятной и удобной при программировании. Здесь следует отметить, что если объявлены два перечисления

C++
1
2
enum color {red, green, blue} clr; 
enum color_type {clr_red, clr_green, clr_blue} type;
то числовые значения red, green, blue будут совпадать с соответствующими числовыми значениями vt_int, vt_float, vt_char. Это значит, что программный код if(clr == red) будет работать также как и if(clr == clr_red). Часто это не имеет принципиального значения, но, например, следующий оператор выдаст сообщение об ошибке:

C++
1
2
3
4
5
6
switch(clr) 
{ 
case red:printf(“Красный цвет\n”);break; 
case green:printf(“Зеленый цвет\n”);break; 
case clr_red:printf(“Красный оттенок\n”);break; 
};
Ошибка возникнет из-за того, что значение red и значение clr_red равны одному числу – 0, а оператор switch не допускает такой ситуации. Для того чтобы избежать такой ситуации, при задании перечисляемого типа допускаются следующие варианты:

C++
1
2
3
enum color_type {clr_red = 10, clr_green, clr_blue}; 
enum color_type {clr_red = 10, clr_green = 20, clr_blue = 30}; 
enum color_type {clr_red, clr_green = 20, clr_blue};
В первом случае значения clr_red = 10, clr_green = 11, clr_blue = 12. Во втором - clr_red = 10, clr_green = 20, clr_blue = 30. В третьем - clr_red = 0, clr_green = 20, clr_blue = 21. Как видно из полученных значений, величины могут инициализироваться при задании перечисления, а если они не объявлены, то принимают значение на единицу больше предыдущего значения.
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
16.02.2013, 19:50  [ТС]     Перечисляемый тип #4
Цитата Сообщение от Vourhey Посмотреть сообщение
Описано в книгах и здесь на форуме есть примеры.

Например, чтобы избежать магических чисел.

Когда захочешь.
Спасибо, но не могли бы вы привести самый простой пример на си. Надо для наглядности.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,584
Записей в блоге: 17
16.02.2013, 20:02     Перечисляемый тип #5
Каком Си ? В Си только #define ....
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
16.02.2013, 20:05  [ТС]     Перечисляемый тип #6
Цитата Сообщение от Avazart Посмотреть сообщение
Каком Си ? В Си только #define ....
Ок, видимо это было про паскаль. У нас то про СИ препод говорит, то про паскаль. Путаюсь Спасибо.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.02.2013, 20:06     Перечисляемый тип #7
Цитата Сообщение от Avazart Посмотреть сообщение
Каком Си ? В Си только #define ....
Лолшто? В Си есть энумы. И константы.
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
16.02.2013, 20:27  [ТС]     Перечисляемый тип #8
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Лолшто? В Си есть энумы. И константы.
Всё, меня походу тут совсем запутали. Приведите пример на си пожалуйста. Простой и понятный(только на СИ)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.02.2013, 20:34     Перечисляемый тип #9
C
1
2
3
4
5
6
7
8
9
enum foobar {
   FOO,
   BAR,
};
 
// ...
 
enum foobar zog = FOO;
zog = BAR:
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
16.02.2013, 20:58  [ТС]     Перечисляемый тип #10
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
enum foobar {
   FOO,
   BAR,
};
 
// ...
 
enum foobar zog = FOO;
zog = BAR:
А что с этим делать-то? Как запринтефить это дело? Просто у меня в тетрадке по лекции тоже самое написано, но как применить на практике понять не могу.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.02.2013, 21:08     Перечисляемый тип #11
Ну как, лол. Вот вы пишете, скажем... не знаю... да что угодно с какой-то текстовой менюшкой. И там есть выбор типа "Нажмите 1, чтобы уничтожить Землю. Нажмите 2, чтобы погладить котёнка" и т. п. Надо ж как-то различать эти выборы.

Можно, конечно, таскать по всей программе чиселки. Но потом где-то придётся мучительно вспоминать, что значит вариант № 42, а то и получать чёрти что в ответ, потому что вы случайно перепутали вариант выбора с суммой элементов, потому что переменные отличаются на две буквы, а тип у них одинаковый. Удобнее поименовать эти варианты и сделать энум.

А выводить на экран придётся руками. Или массив из строк, где по соответствующим индексам расположены соответствующие строки. Или какой-то мега-свич или гирлянда из ифов, если у вас по каким-то причинам значения констант идут не подряд.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2013, 21:17     Перечисляемый тип
Еще ссылки по теме:

C++ Перечисляемый тип и Структуры
Как сконвертировать свой тип в тип double? C++
Не могу преобразовать тип char в тип double C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
aleksandr_t94
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 100
16.02.2013, 21:17  [ТС]     Перечисляемый тип #12
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ну как, лол. Вот вы пишете, скажем... не знаю... да что угодно с какой-то текстовой менюшкой. И там есть выбор типа "Нажмите 1, чтобы уничтожить Землю. Нажмите 2, чтобы погладить котёнка" и т. п. Надо ж как-то различать эти выборы.

Можно, конечно, таскать по всей программе чиселки. Но потом где-то придётся мучительно вспоминать, что значит вариант № 42, а то и получать чёрти что в ответ, потому что вы случайно перепутали вариант выбора с суммой элементов, потому что переменные отличаются на две буквы, а тип у них одинаковый. Удобнее поименовать эти варианты и сделать энум.

А выводить на экран придётся руками. Или массив из строк, где по соответствующим индексам расположены соответствующие строки. Или какой-то мега-свич или гирлянда из ифов, если у вас по каким-то причинам значения констант идут не подряд.
Кажется врубился)) Спасибо =)
Yandex
Объявления
16.02.2013, 21:17     Перечисляемый тип
Ответ Создать тему
Опции темы

Текущее время: 23:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru