Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2_16_Перерахування.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
122.88 Кб
Скачать

7

Перерахування.

Структури можна розглядати як новий тип даних, визначуваний користувачем. Існує ще один спосіб створення призначених для користувача типів даних, званий перерахуванням. Перерахування відносяться до типових засобів програмування в стилі C++, і їх використання може помітно спростити процес створення програми.

Перерахування використовуються в тих випадках, коли змінні створюваного типу можуть приймати заздалегідь відому кінцеву (і, як правило, невелику) безліч значень.

Приклад 6. dayenum.срр Дні тижня - застосування перерахувань.

В даному прикладі перерахування використовуються для створення типу даних, що зберігає дні тижня.

#include <iostream.h>

// оголошення перераховуваного типу

enum days_of_week { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

Int main()

{

days_of_week day1, day2; // визначення змінних, що зберігають дні тижня

day1 = Mon; // ініціалізація змінних

day2 = Thu;

int diff = day2 - day1; // арифметична операція

cout << "Різниця в днях: " << diff << endl;

if( day1 < day2) // порівняння

cout << "day1 наступить раніше, ніж day2\n";

return 0;

}

  • Оголошення типу починається із слова enum і містить перерахування всіх можливих значень змінних створюваного типу. Ці значення називаються константами перераховуваного типу.

  • Змінним перераховуваного типу можна привласнювати будь-яке із значень, вказаних при оголошенні типу.

  • Внутрішньо перераховуванні типи даних представляються і обробляються як цілі числа. Цей факт пояснює можливість застосування до змінних перераховуваного типу арифметичних операцій і операцій відношення.

Фактично перше значення в списку розглядається як число 0, друге - як число 1, і т.д. В наший програмі значення від Sun до Sat є цілими числами в діапазоні 0...6.

  • Відмінність між типом int і перераховуваними типами:

Перерахування - це список всіх можливих значень.

Тип int задається за допомогою діапазону значень.

Приклад 7. wdcount.срр // підрахунок числа слів в реченні з використанням перерахувань.

Програма підраховує кількість слів в реченні, яке вводиться з клавіатури користувачем.

#include <iostream.h>

#include <conio.h> // для getche()

enum Word { NO, YES }; // NO=0, YES=1

Int main()

{

Word word1 = NO; // word1 дорівнює YES, коли вводиться слово, і NO, коли вводяться пропуски

char ch='a'; // прочитування символу з клавіатури

int wordcount = 0; // число слів

do {

ch = getche(); // введення символу

if( ch==' ' || ch=='\r' ) // якщо введений пропуск

{

if( word1 == YES ) // а до цього вводилося слово,

{ // значить, слово закінчилося

wordcount++; // підрахунок слова

word1 = NO; // скидання прапора

}

} // інакше

else // введення слова продовжується

if ( word1 == NO ) // якщо почалося введення слова

word1 = YES; // те встановлюємо прапор

} while( ch !='\r ' ); // вихід по натисненню Enter

cout << "\n---число слів: " << wordcount << "---\n";

return 0;

}

Програма прочитує символи з клавіатури в циклі do. Коли з клавіатури вводиться пропуск, лічильник кількості слів збільшується на одиницю, після чого програма ігнорує всі пропуски, до появи першого непробільного символу. і т.д. Для того, щоб реалізувати подібний алгоритм, програмі необхідно розрізняти, чи вводиться в даний момент слово або послідовність пропусків. Для цього використовується змінна word1 перераховуваного типу Word, визначеного таким чином:

enum Word { N0, YES };

Змінні типу Word можуть мати тільки два різні значення: N0 і YES. Зверніть увагу на те, що перерахування починається із значення N0; це означає, що цьому значенню відповідатиме внутрішнє уявлення у вигляді цілого числа 0, яке може інтерпретуватися ще і як хибне значення.

На початку роботи програми змінної word1 привласнюється значення N0. Як тільки з клавіатури буден отриманий перший непробільний символ, значення змінної зміниться на YES і сигналізуватиме про те, що в даний момент вводиться слово. Значення YES зберігатиметься за змінній word1 до тих пір, поки з клавіатури не буде введений пропуск, який означає кінець слова. Тому змінна word1 набуде значення N0, яке зберігатиметься до тих пір, поки не з'явиться непробільний символ.

  • Завдання цілих значень для перераховуваних констант.

Першої з перераховуваних констант відповідає ціле значення, рівне 0, другою - значення, рівне 1, і т.д. Для того, щоб змінити значення, з якого починається нумерація, можна за допомогою операції привласнення задати це значення першої з перераховуваних констант:

enum days_of_week { Sun = 1, Mon, Tue, Wed, Thu, Fri, Sat };

В цьому випадку наступним у списку константам відповідатимуть числа 2, 3 і 4 відповідно. Фактично ми можемо змінити величину цілого числа, відповідного будь-якому елементу списку, застосувавши до нього операцію привласнення.

  • Недолік перерахувань.

Важливим недоліком перераховуваних типів даних є те, що вони не розпізнаються засобами введення/виводу C++. Наприклад, результатом виводу у фрагменті

enum direction { north, south, east, west };

direction dir = south;

cout << dir;

буде не south, що формально є значенням змінної dir, а її внутрішнє уявлення, тобто ціле число 1.

Для виводу екран значень перераховуваного типу можна використовувати конструкцію вибора switch:

switch (dir)

{

case 0: cout << “north” << endl; break;

case 1: cout << “south” << endl; break;

case 2: cout << “east” << endl; break;

case 3: cout << “west” << endl; break;

}

Приклади перераховуваних типів

enum months{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec}; // місяці року

enum switch { off, on }; // перемикач

enum meridian { am, pm }; // меридіан

enum chess { pawn, knight, bishop, rook, queen, king }; // шахові фігури

Приклад 8. cardenum.срр // карточная игра с использованием перечислений

Групу констант типу const int, призначених для представлення карткових мастей:

const int clubs = 0;

const int diamonds = 1;

const int hearts = 2;

const int spades = 3;

Замінимо на перераховуваний тип:

enum Suit { clubs, diamonds, hearts, spades };

--------------------------------------------------------------------------

#include <iostream.h>

const int jack = 11; // именованные достоинства карт

const int queen = 12;

const int king = 13;

const int ace = 14;

enum Suit { clubs, diamonds, hearts, spades };

--------------------------------------------------------------------------

struct card

{

int number; // достоинство карты

Suit suit; // масть

};

--------------------------------------------------------------------------