Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335

Зачем нужны перечисления в С++?

19.02.2020, 17:08. Показов 5794. Ответов 56
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
int main(братья)
Снова зову коллективный разум!
Дошел в книжке до перечислений и не пойму зачем они вообще нужны, когда есть массивы и структуры (ну может еще что-то о чем я пока не подозреваю)
Вот код из книги который я немного переделал и результат получил тот же:
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
27
#include <windows.h>
#include <iostream>
using namespace std;
 
enum days_of_week {sun, mon, tue, wed, thu, fri, sat}; // объявление перечисляемого типа
                //  0    1    2    3    4    5    6  нумерация соответствующая расположению дней
int main()
{
system("chcp 1251>0"); // изменение кодировки консоли
 
 
//days_of_week day1, day2;  // 2 переменные - day1 и day2, типа - days_of_week
 
 
//day1 = mon;               // присваиваем значение переменной - day1
//day2 = thu;               // присваиваем значение переменной - day2
int diff = thu - mon;   // вычисляем разницу в днях (это возможно за счет того как расположены дни в перечислении!)
cout << " Разница в днях: " << diff << endl;
 
 
if(mon < thu)           // сравниваем, и если понедельник меньше четверга, то ...
cout << "day1 наступит раньше, чем day2\n";
 
 
system("pause>0");
return 0;
}
Ну то есть я убрал переменные - day1, day2
Да, я только учусь и много где могу быть не прав, это новая предметная область для меня!
В книгах все это обясняется, но до меня не доходит практическое применение
Здесь на форуме тоже читал темы, не могу понять зачем они, в чем их преимущество...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.02.2020, 17:08
Ответы с готовыми решениями:

насчет перечисления(зачем я объявляю переменную в перечислении? Приведите примеры где удобно использовать перечисление?)
зачем я объявляю переменную в перечислении? Чтобы мог обращаться к элементам перечисления? Правильно ли мое суждение и приведите примеры...

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

Перечисления (enum): для чего они нужны? Как, когда и какими перечислениями уместнее пользоваться?
Предположим есть такой код: #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;Windows.h&gt; enum airplanes {SU6, SU29, SU34}; //...

56
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
19.02.2020, 17:18
Лучший ответ Сообщение было отмечено R_U_S_V как решение

Решение

ну смотри, без них бы ты писал что то вроде

C++
1
2
3
const int sun = 0;
const int mon = 1;
const int tue = 2;
Плюсов много всяческих, допустим автоматический подсчет всех элементов в enum

C++
1
2
3
4
5
6
7
8
9
enum class COLOR{
RED,
GREEN,
BLUE,
 
TOTAL,
};
 
COLOR colors[COLOR::TOTAL];
сколько бы ты различных цветов не добавил перед TOTAL у тебя всегда автоподсчет количества.

автоматическая генерация уникальных айдишников или описаний для характеристик объекта:
добавляя в enum элемент ты не паришься о его нумерации, ты знаешь точно что все что в enum - уникально, если конечно сам не перезаписал значение.

C++
1
2
3
4
5
6
7
enum class TYPE
{
    HUMAN,
    ANIMAL,
};
 
if(my.type == TYPE::HUMAN) { ... }
сколько бы элементов в enum не было, мы знаем точно что все их значения разные.

группирование и именование типа констант вместе по каким либо критериям
удобнее использовать COLOR color; чем непонятный int.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
19.02.2020, 17:23
Ну например у вас элемент mon имеет значение 1. Если где то в коде написать 1 то не понятно что это... 1 литр, 1кг или может 1 доллар? вместо этого можно написать mon, и сразу понятно что речь идёт про первый день недели - понедельник. Используя enum вы сгруппировали все дни недели в одном перечислении что так же удобно для восприятия данных внутри кода. Так же enum имеет возможность ввести тип перечисления. Так, например можно создать тип enum day_of_week {...}. Этому типу будут соответствовать все значения этого перечисления
1
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
19.02.2020, 17:29
Чистой воды символизм, который позволяет уйти от т.н. "магических чисел", сделать код более удобочитаемым и удобопонимаемым.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.02.2020, 17:51
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Дошел в книжке до перечислений и не пойму зачем они вообще нужны
Как минимум для совместимости с С. Для программирования сложных ветвлений удобно использовать для switch-case. Описание конечных состояний автоматов удобно. Это самодокументирующий набор констант и тип переменной которой их можно присваивать. Тут контроль типов защищает от непреднамеренных ошибок в дополнение к "говорящему коду".
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
19.02.2020, 17:51  [ТС]
Спасибо!
Про удобство понял..
То есть получается, что самое существенное отличие перечислений от массмива в том, что мы можем переопределять нумерацию?
0
Just Do It!
 Аватар для XLAT
4198 / 2653 / 654
Регистрация: 23.09.2014
Сообщений: 8,948
Записей в блоге: 3
19.02.2020, 17:56
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Вот код из книги который я немного переделал и результат получил тот же:
есть один момент:
некоторые штуки в крестах создавались именно для того, чтобы кодер мог пейсать код
в 3kk строчек и если его вдруг задавит дорожный каток,
то другой прогер мог без затруднений продолжить его дело.

Можно ваще выкинуть из крестов все тамошние фичи и пейсать код в машинном виде.
Но это будет значит только то, что тот, кто так сделал просто пошёл мимо опушки нискось лесом.

иллюстрация одного важного прибамбаса enum:
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
27
#include <iostream>
using namespace std;
 
enum days_of_week {sun = 0, mon, tue, wed, thu, fri, sat};
 
int get_diff(days_of_week a, days_of_week b)
{   return a - b;
}
 
int main()
{   system("chcp 1251>0");
 
    days_of_week day1, 
                 day2;
 
    day1 = mon;
    day2 = thu;
    int diff = get_diff(day1, day2);
    
        diff = get_diff(0, 2); /// <<<--- Ошибка компиляции!!!!!!!!!!!!!!!!!!
    
    cout << " Разница в днях: " << abs(diff) << endl;
 
 
    system("pause>0");
    return 0;
}
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
19.02.2020, 17:59  [ТС]
Чето я в этом форуме вообще не понимаю, как писать!

А как тогда можно обратиться к конкретному слову в списке перечисления?
C++
1
enum days_of_week {sun, mon, tue, wed, thu, fri, sat};
С массивами то проще!
Вот cout << sotrudniki[0];
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
19.02.2020, 18:02
R_U_S_V,
Мы не к слову обращаемся не путайте перечисления и массивы.
Напишите cout << mon; и получите 1 в ответ.
То есть эти слова нужны не для того что бы делать так: cout << enum[0].
Иначе это был бы массив строк а не enum
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.02.2020, 18:09
Цитата Сообщение от R_U_S_V Посмотреть сообщение
То есть получается, что самое существенное отличие перечислений от массмива в том, что мы можем переопределять нумерацию?
Нет. Когда мы просто используем тип int, скажем, мы уже "переопределяем нумерацию". Перечеслители могут и подряд идти (не удобно расширять и дополнять) и использоваться для индексации. Это если о массивах говорить. Например, если есть массив указателей на функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef void (*ReactionOnFood)() ;
 
ReactionOnFood reactionOnFood[]={&good, &neutral, &bad, &horrible } ; //где то объявлены функции с такими именами
enum reactionOnFoodInd ={goodIng, neutralInd, badInd, horribleInd};
 
foo(reactionOnFoodInd ind)
{
switch(ind)
{
case goodInd:(*reactionOnFood[goodiing])(); break;
//end so on
 
default : (*reactionOnFood[horribleInd])(); break;
}
}
Хотя проще сразу вызвать нужную функцию по индексу и уйти от свича.
/не проверял (но идея - главное) /
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
19.02.2020, 18:13  [ТС]
Я просто видимо не способен понять
Вот код который не работает:
Тут задача сделать так, чтобы при вводе первой буквы слова, выводилось само слово!
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
//              0         1         2
enum staffs {manager, director, secretary};  // объявляем перечисление
 
 
int main()
{
system("chcp 1251>0");
 
staffs m, d, s;
m = manager;
d = director;
s = secretary;
 
char ch;
cout << "\n Введите первую букву должности: ";
cin >> ch;
 
switch(ch)
{
case m:
    cout << "\n должность - " << manager; break;
case d:
    cout << "\n должность - " << director; break;
case s:
    cout << "\n должность - " << secretary; break;
}



В итоге я все это сделал на массивах, поскольку не пойму эти перечисления
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
string sotrudniki[4] = {"secretary","courier","manager","doctor"};  // строчный массив из 4 ячеек
 
char ch, s, k, m, d;                       // объявляем переменную - ch для ввода буквы, и переменные начальных букв строк массива
while(ch!='s'||ch!='c'||ch!='m'||ch!='d')   
    {
cout << "\n начальная буква слова: ";
cin >> ch;                                 // вводим начальную букву слова
 
    switch (ch)                            // оператор - switch ()
    {
    case 's':                              // если введено - s
    cout << sotrudniki[0]; break;          // то выводим строку из нулевой ячейки массива
    case 'c':
    cout << sotrudniki[1]; break;
    case 'm':
    cout << sotrudniki[2]; break;
    case 'd':
    cout << sotrudniki[3]; break;
    }
    }
слова другие, но это не важно.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
19.02.2020, 18:26
R_U_S_V,
В решении этой задачи особой пользы от использования перечислений не будет
Вот так можно было решить без массивов и перечислений:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    char ch;
    cout << "Введите первую букву должности: ";
    cin >> ch;
 
    cout << "\n должность - ";
 
    switch(ch)
    {
    case 'm':
        cout << "manager"; break;
    case 'd':
        cout << "director"; break;
    case 's':
        cout << "secretary";
    }
}
Цитата Сообщение от R_U_S_V Посмотреть сообщение
поскольку не пойму эти перечисления
C++
1
2
3
4
5
6
7
8
int main()
{
    enum {sun, mon};
    cout << "sun = " << sun; // печатает 0
    cout << "mon = " << sun; // печатает 1
    // вот и все по основам enum
    // что именно вам не понятно? )
}
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.02.2020, 18:28
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main()
{
enum staffs {manager, director, secretary};  // объявляем перечисление
int ch;
cout << "\n Enter the staff name as listed: manager=0, director=1, secretary=2 ";
cin >> ch;
staffs ch_staffs= staffs(ch) ;
 
switch(ch_staffs)
{
    case manager:
        cout << "\n staff is - " << "manager"; break;
    case director:
        cout << "\n staff is - " << "director"; break;
    case secretary:
        cout << "\n staff is - " << "secretary"; break;
        default : cout << "\n Fingers vibrate?  " ; break;
}
return 0;
}
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
19.02.2020, 18:30
Цитата Сообщение от IGPIGP Посмотреть сообщение
Enter the staff name as listed: manager=0, director=1, secretary=2
не катит
потому что
Цитата Сообщение от R_U_S_V Посмотреть сообщение
Тут задача сделать так, чтобы при вводе первой буквы слова, выводилось само слово!
а у вас предлагается вводить цифры
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
19.02.2020, 18:32  [ТС]
Я забыл упомянуть , что до упаду сидел со структурами, до этого, ... второй раз пытался понять и понял только то, что это "хлебная крошка" , то есть моя переменная приобретает кучу иерархических "родителей" которые усложняют код (по моему дилетантскому мнению) и не более того, что она напрочь меня запутывает откуда берется переменная и во что она перевоплощается! Вот видимо такой я чеоловек((( Мне проще было бы обычными переменными пользоваться ведь в среде они подсвечиваются все сразу!
0
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
19.02.2020, 18:40
R_U_S_V, перечисления создают удобства не на уровне времени исполнения, а на уровне написания и понимания кода. Вот еще пример использования, который часто-густо можно встретить при программировании, например, оконных приложений, когда приходится работать с большим количеством всяких атрибутов.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Window 
{
public:
    enum Attributes
    {
        WND_CAPTION = 0x1,
        WND_BORDER  = 0x2,
        WND_BUTTONS = 0x4
    };
 
    bool Create(int attrs)
    {
        // ...
        return true;
    }
 
};
 
int main()
{
    Window wnd;
    wnd.Create(Window::WND_BORDER | Window::WND_CAPTION);
}
Смотрите, при создании окна перечисления помогают понять какие флаги установлены, вместо того чтобы лезть в доки и искать что означают эти 0x1, 0x2 и т.д.
3
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
19.02.2020, 18:48
Цитата Сообщение от R_U_S_V Посмотреть сообщение
то есть моя переменная приобретает кучу иерархических "родителей"
В данном случае просто задаётся целочисленный тип, который "по идее" должен принимать строго определённое количество значений. Ну вот например в изначальном примере, допустим в переменную int запишут 8. И передадут в функцию как int. И что будет с выполнением программы, учитывая что у тебя предусмотрено только 7 дней недели? Ну и вот, если аргументом функции потребуешь передавать именно days_of_week , а не int, то вначале нужно будет преобразовывать из int в days_of_week, и только потом передавать. И на этапе отладки, обнаружив что при преобразовании "день недели" вдруг изменился (а изменился с неправильного) - это будет более заметно, чем глубоко внутри функции выискивать, от какого значения крашнулсь программа.
2
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
19.02.2020, 18:51  [ТС]
IGPIGP
не знаю как тут на форуме ответить с цитатой! поэтому только так!
Вы знаете мне вообще не понятно в чем прикол.

Мы создаем группу из дней недели - sun, mon, tue, wed, thu, fri, sat
Саму группу называем - days_of_week (дни недели)
дням недели автоматически присваиваем числовой идентификатор - от нуля и дальше ...

Дальше создаем 2 переменные - day1, day2 пользователького типа - days_of_week
days_of_week day1, day2;

Присваиваем этим переменным идентификаторы от переменных - mon && thu
day1 = mon;
day2 = thu;

то есть теперь
day1 = 1
day2 = 4

И производим какую-то арифметику

Мне столько человек уже ответило СПАСИБО!!!! я до сих пор не пойму нахрена так усложнять и вводить переменные посредники. Ведь можо оперироватиь и самими - sun, mon, tue, wed, thu, fri, sat они же у меня в перечислении есть, я же вижу что-они кто они...

Вообще странно, массивы - понял вопросов зачем нужны нет, функции начал изучать, тоже крутая штука сокращает код, вопросов нет, ту тут же блин вообще засада!
Я внимательно изучаю ветку Ваших ответов, надеюсь дойдет!!!!
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.02.2020, 19:05
Цитата Сообщение от Undisputed Посмотреть сообщение
не катит
потому что
Undisputed, перечитав Фаулера о IoC и DI убедился, что к singleton оно не имеет прямого отношения. А новичку то что нужно? Нужно понять принцип. Но для вас :
C++
1
enum staffs:char {manager='m', director='d', secretary='s'};
код свича чуть исправить.
Цитата Сообщение от R_U_S_V Посмотреть сообщение
IGPIGP
не знаю как тут на форуме ответить с цитатой! поэтому только так!
Вы знаете мне вообще не понятно в чем прикол.
Если у вас автомат на кучу состояний то легче понять зачем. Но нужно самому попробовать же. Тогда нужно понять как. Вот и простые примеры - дни недели, например. А если палитра на каких-то 16 цветов, уже и запутаться немудрено. Не торопитесь делать выводы.
1
10 / 9 / 1
Регистрация: 25.12.2019
Сообщений: 335
19.02.2020, 19:12  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Не торопитесь делать выводы.
Да, я понимаю, не мной придумано, значит нужная штука. Буду упражняться глядишь прочувствую. Медленно у меня идет процесс! Это расстраивает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.02.2020, 19:12
Помогаю со студенческими работами здесь

Зачем нужны классы?
Изучаю СИ++ после изучения СИ. Не пойму какой смысл в классах. То что они делают можно реализовать с помощью функций, структур и обычных...

Зачем нужны исключения?
Добрый вечер, прочитал статью об исключениях, не очень понимаю, почему бы не заменить их просто оператором if? Вот код с исключением: ...

Зачем нужны классы?
После Си решил попробовать Си++, после нескольких глав Дейтла понял что весь смысл плюсов в классах. Но мне совершенно не понятно зачем они...

Зачем нужны итераторы?
Практическое использование мне понятно - с их помощью обходят контейнеры и т.д и т.п.Но почему не реализовать нужные методы,перегрузить...

Зачем нужны указатели
Не могу понять синтаксис указателей. Понял, что это работа с адресами, что оператор &amp; это адрес. А вот * как я понял, это объявление...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru