
- •4. Инкремент и декремент
- •5. Операции сравнения (операции отношения)
- •7. Ввод- вывод
- •10. Оператор цикла с постусловием do-while
- •13. Работа с символами
- •15. Указатели и Массивы.
- •16. Некоторые функции из библиотеки string.H
- •17. Перечисления (enum)
- •19. Функции
- •20. Передача данных в функцию по значению, по указателю, по ссылке.
- •21. Передача массивов в функцию. Указатель на функцию
- •22. Встраиваемые функции. Перегрузка функций. Передача массивов в функцию. Указатель на функцию
- •23. Параметры функций по умолчанию, функции с переменным числом параметров.
- •25. Работа с файлами
- •26. Директивы препроцессора
- •27. Базовые принципы объектно-ориентированного программирования
- •29. Базовые блоки ооп. Объект. Класс
- •30. Реализация механизма сокрытия информации
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.