C++. Зчислення (enumerations). Ключове слово enum. Переваги використання зчислень. Приклади

Зчислення (enumerations) у мові C++. Ключове слово enum. Переваги використання зчислень. Приклади


Зміст


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;

 


Зв’язані теми