Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП ист 22 ответы.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
151.85 Кб
Скачать

17. Перечисления (enum)

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

С помощью перечислений можно задать дни недели, месяцы, ну или что-нибудь подобное. В качестве примера рассмотрим стороны света. Стороны света на экране расположены так: вверху - север (north), справа - восток (east), слева - запад (west) и внизу - юг (south).

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

Здесь мы определили перечисление cardinal_dirs. В начале строки стоит ключевое слово enum (enumeration - перечисление). Затем указывается имя перечисления, после которого, через пробел, в фигурных скобках задаются значения, которые смогут принимать переменные типа cardinal_dirs. После фигурных скобок ставится точка с запятой.

После того, как определено перечисление, можно создавать переменные нового типа:

cardinal_dirs ch = north;

Обратите внимание, что переменные типа cardinal_dirs могут принимать только четыре значения: north, south, east, west. Кроме того, элементы в перечислении нумеруются от нуля. Т.е. north = 0, east = 1, south = 2, west = 3. Вместо перечисления мы могли бы создать четыре константы:

const int north = 0;

const int east = 1;

const int south = 2;

const int west = 3;

Результат одинаковый.

Как видите использовать перечисления довольно легко. Но стороны света у нас закодированы клавишами стрелочек, поэтому нам нужно инициализировать элементы перечисления числами. Как я уже писал, отсчёт ведётся с нуля. Но, к счастью, это можно изменить. Если мы переопределим какой-либо элемент значением 75, то следующий, получит значение 76. Нам нужно переопределить все четыре значения.

enum cardinal_dirs { north = 72, west = 75, east = 77, south = 80 };

Про структуры и перечисления всё. Есть ещё некоторые важные моменты по структурам, но нам они пока не нужны.

Ещё раз повторюсь, точно такого же результата можно было бы добиться с помощью четырёх констант.

Объединения (union)

Объединения используются когда необходимо получить доступ к одним и тем же данным разными способами.

Допустим мы хотим вывести все поля структуры tank. Пока что у нас есть только один способ сделать это:

cout << t34.x << "\n";

cout << t34.y << "\n";

cout << t34.fuel << "\n";

Гораздо удобнее это было бы сделать с помощью цикла. Но тогда нам пришлось бы использовать массив, а определение структуры выглядело бы вот так:

struct tank

{

int t[3];

};

Теперь вывести структурную переменную на экран проще:

for (int i; i < 3; i++)

{

cout << t34.t[i] << "\n";

}

Но при использовании массивов переменная потеряла в гибкости, и код стал не таким понятным:

t34.x = 3; // До..

t34.y = 4;

t34.t[0] = 3; // ... и после.

t34.t[1] = 4;

Можно объединить эти два способа с помощью объединения. :)

При этом структура tank будет выглядеть вот так:

union tank

{

struct

{

int x,y;

int fuel;

};

int t[3];

};

Во-первых мы заменили struct на union (union - объединение). Внутри объединения расположена безымянная структура в которой определены все те переменные, которые были в структуре tank.

После безымянной структуры определён массив целых чисел из трёх элементов.

Теперь создадим переменную и обратимся к её полям:

tank t34;

t34.x = 5;

t34.y = 1;

t34.fuel = 20;

cout << t34.t[0] << "\n";

cout << t34.t[1] << "\n";

cout << t34.t[2] << "\n";

На экран будет выведено:

5

1

20

Дело в том, что x и t[0] - разные имена одного и того же участка памяти, также как и: y и t[1], fuel и t[2].

18.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]