Зчислення (enumerations) у мові C++. Ключове слово enum. Переваги використання зчислень. Приклади
Зміст
- 1. Загальні відомості про зчислення. Переваги використання зчислень у програмах
- 2. Загальна форма оголошення зчислення. Ключове слово enum. Особливості роботи зчислення
- 3. Яким чином у зчисленні можна задати значення перечислювальним константам? Приклад
- 4. Константні значення яких типів даних дозволяється використовувати у зчисленнях?
- 5. Чи можуть у зчисленнях використовуватись від’ємні значення перечислювальних констант?
- 6. Приклади оголошення різних видів зчислень з різними варіантами початкової ініціалізації
- 7. Приклади оголошення та використання зчислень у програмах
- 8. Яка область видимості константи, оголошеної у зчисленні?
- 9. Оголошення типу зчислення з використанням засобу typedef. Загальна форма. Приклад
- Зв’язані теми
Пошук на інших ресурсах:
1. Загальні відомості про зчислення. Переваги використання зчислень у програмах
Тип даних “зчислення” використовується для полегшення створення ідентифікаторів, які мають ім’я та представляють деяке ціле константне значення.
Зчислення дозволяють об’єднати групи константних значень в єдине ціле. Формується тип зчислення на основі якого може бути оголошена змінна, яка приймає значення з набору, що описується в зчисленні.
При використанні зчислень у програмах можна виділити такі взаємозв’язані переваги:
- можна створювати різні типи зчислень, кожне з яких містить групи констант які формуються за деякою ознакою;
- константи у зчисленні групуються. Якщо у програмі є великі набори констант, то це полегшує читабельність та подальший супровід програми.
⇑
2. Загальна форма оголошення зчислення. Ключове слово enum. Особливості роботи зчислення
Щоб оголосити зчислення у мові C++ використовується ключове слово enum.
Загальна форма оголошення зчислення наступна:
enum TypeName
{
name1 [=const1],
name2 [=const2],
...
nameN [=constN]
};
тут
- TypeName – ім’я типу зчислення (ім’я шаблону);
- name1, name2, …, nameN – імена ідентифікаторів-констант, які приймають відповідно значення const1, const2, …, constN. Необов’язково ідентифікатори-константи повинні приймати значення. Квадратні дужки [ ] означають, що константне значення відсутнє;
- const1, const2, …, constN – необов’язкові значення, що задають значення константам, які перераховуються у зчисленні.
Якщо значення константи у зчисленні не задано, то воно приймає значення, яке є на 1 більше ніж попереднє константне значення. Наприклад, якщо попередня константа мала значення 5, то наступна буде мати значення 6. У випадку типу char наступна константа є наступним символом у таблиці символів.
Після оголошення типу (шаблону) зчислення, можна оголошувати змінні цього типу, наприклад
TypeName varName;
тут
- TypeName – ім’я раніше оголошеного типу (шаблону) зчислення;
- varName – ім’я змінної типу TypeName.
Якщо оголошено змінну, то ця змінна у програмі може приймати значення імен зі зчислення, наприклад
varName = name2;
⇑
3. Яким чином у зчисленні можна задати значення перечислювальним константам? Приклад
Значення перечислювальним константам можна задати одним з двох способів:
- з допомогою явної ініціалізації. У цьому випадку, після імені константи ставиться знак дорівнює = і значення, яке приймає дана константа;
- за замовчуванням. У цьому випадку першій константі ставиться у відповідність 0, а кожна наступна константа приймає значення на 1 більше.
Приклад.
// явна ініціалізація enum DAYS_IN_MONTHS { January = 31, February = 28, March = 31, April = 30, May = 31, June = 30, July = 31, August = 31, September = 30, October = 31, November = 30, December = 31 }; // ініціалізація за замовчуванням enum DIGITS { Zero, // Zero=0 - за замовчуванням One, // One=1 Two, Three, Four, Five, Six, // Six = 6 Seven, Eight, Nine // Nine = 9 };
⇑
4. Константні значення яких типів даних дозволяється використовувати у зчисленнях?
У зчисленнях допускається використовувати константні значення таких типів:
- цілочисельних типів (int, long int, …);
- символьного типу char;
- логічного типу bool.
Забороняється використовувати константні значення типів з плаваючою комою float, double. При спробі оголосити константне значення типу double або float
...
enum DBL { x = 2.65 };
...
компілятор видасть помилку
Error 1 : constant expression is not integral
⇑
5. Чи можуть у зчисленнях використовуватись від’ємні значення перечислювальних констант?
Так, можуть. Наприклад
enum VALUES { val1 = 2, val2 = 'c', val3 = true, val4 = -9 };
У зчисленні VALUES використовується від’ємна константа
val4 = -9
⇑
6. Приклади оголошення різних видів зчислень з різними варіантами початкової ініціалізації
Приклад 1. Оголошується зчислення, яке реалізує місяці року.
// зчислення, що реалізує константи, які відповідають місяцям року enum MONTHS { Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
Першому місяцю року ставиться у відповідність константа з іменем Jan. Значення константи рівне 1. Наступна константа має ім’я Feb, значення константи рівне 2 (на 1 більше). За таким самим принципом формуються константи, які слідують після Feb. Значення кожної наступної константи більше на 1.
Приклад 2. Оголошується зчислення vegetables, яке описує овочі.
// зчислення, яке описує овочі enum Vegetables { tomato, potato, carrot, cabbage, pepper, onion, radish };
⇑
7. Приклади оголошення та використання зчислень у програмах
Приклад 1. Використання зчислення у поєднанні з оператором switch. Розробити програму, яка за значенням константи зі зчислення MONTHS виводить назву відповідного місяця.
#include <iostream> using namespace std; void main(void) { // зчислення, що реалізує константи, які відповідають місяцям року enum MONTHS { Jan = 1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; // змінна mn типу зчислення MONTHS MONTHS mn; // присвоїти значення змінній mn mn = Mar; // mn = 3 // використання mn в операторі switch // за значенням mn вивести назву відповідного місяця switch (mn) { case Jan: cout << "January" << endl; break; case Feb: cout << "February" << endl; break; case Mar: cout << "March" << endl; break; case Apr: cout << "April" << endl; break; case May: cout << "May" << endl; break; case Jun: cout << "June" << endl; break; case Jul: cout << "July" << endl; break; case Aug: cout << "August" << endl; break; case Sep: cout << "September" << endl; break; case Oct: cout << "October" << endl; break; case Nov: cout << "November" << endl; break; case Dec: cout << "December" << endl; break; } }
Якщо спробувати вивести значення mn, то буде виводитись його цілочисельне цифрове значення. Наприклад, у коді
mn = Oct;
cout << mn; // 10
буде виводитись число 10. Ідентифікатор ‘Oct’ виводитись не буде.
Приклад 2. Використання зчислень з оператором if. Реалізація зчислення, що описує пори року. У програмі за значенням змінної типу зчислення виводиться назва відповідної пори року.
#include <iostream> using namespace std; void main() { // зчислення, що реалізує пори року enum SEASON { winter, spring, summer, autumn }; int i; SEASON sz; sz = spring; // за значенням sz вивести назву відповідної пори року if (sz == winter) cout << "Winter" << endl; if (sz == spring) cout << "Spring" << endl; if (sz == summer) cout << "Summer" << endl; if (sz == autumn) cout << "Autumn" << endl; }
⇑
8. Яка область видимості константи, оголошеної у зчисленні?
Константа, оголошена у зчисленні, має область видимості в межах дужок, в яких оголошується шаблон (тип) зчислення.
Наприклад.
Дано зчислення NUMBERS, в якому оголошено 3 константи з іменами num1, num2, num3. Якщо у цьому ж блоці операторних дужок { } оголосити змінну з іменем num2
... { // область видимості імен num1, num2, num3 enum NUMBERS { num1 = 15, num2 = 77, num3 = -1232 }; // спроба оголосити ім'я num2 int num2 = 122; // помилка!!! }
то компілятор видасть помилку
Error: 'num2' : redefinition; previous definition was 'enumerator'
⇑
9. Оголошення типу зчислення з використанням засобу typedef. Загальна форма. Приклад
Зчислення можна також оголошувати з використанням ключового слова typedef. У цьому випадку загальна форма такого оголошення наступна
typedef enum TypeName { // перелік констант та константних значень // ... };
тут TypeName – ім’я нового типу зчислення, який створюється.
Приклад. З допомогою ключового слова typedef оголошується тип TDAYS, який є зчисленням. Потім оголошується змінна типу TDAYS.
// оголосити новий тип TDAYS, який є типом-зчисленням typedef enum TDAYS { Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat }; // оголосити змінну типу TDAYS TDAYS td; // присвоїти змінній td значення з набору типу TDAYS td = TDAYS::Sun;
⇑
Зв’язані теми
- Складені типи даних. Шаблон структури. Структурна змінна. Структури в середовищі CLR. Оголошення та ініціалізація структурної змінної
- Виділення пам’яті для структури. Вкладені структури. Масиви native-структур
- Робота з managed-структурами в середовищі CLR. Кваліфікатори ref і value. Оголошення структурних змінних. Масиви managed-структурних змінних. Ініціалізація managed-структур
- Структури і функції. Передача структури в функцію в середовищі CLR. Повернення структури з функції
- Об’єднання. Ключове слово union. Приклади використання об’єднань
⇑