Card c1, c2

В файле poker1.cpp

Структура как тип и совокупность данных

Лекция №25. Структуры и объединения

План:

1. Структура как тип и совокупность данных;

2. Объединения разнотипных данных;

3. Примеры с использованием структур и объединений.

 

 

Из основных типов языка С++ пользователь может конструировать произвольные типы, например, структуры и объединения, такие типы называют АТД (агрегатные типы данных). Вместе с массивами структуры и объединения отнесены к структурированным типам.

Такие определяемые пользователем типы данных, как стек, комплексные числа и колоды карт являются примерами реализации АТД. Значительная часть процесса объектно-ориентированного проектирования заключается в придумывании АТД, соответствующих задаче. Хороший АТД не только моделирует основные черты данной задачи, но часто также может использоваться в других программах.

 

 

Тип структуры позволяет программисту объединить компоненты в переменную с одним именем. Каждая структура включает в себя один или несколько объектов (переменных, массивов, указателей, структур и т. д.), называемых элементами структуры(structure members). Поскольку члены структуры бывают различных типов, программист может создавать агрегаты (данных), позволяющие описывать сложные данные.

В качестве простого примера определим структуру, описывающую игральную карту. Метки на карте, представляющие её достоинство, называются очками (pips). Например, тройка пик имеет достоинство (значение очков) – 3, и значение масти – пики. Можно объявить тип структуры, как показано в следующем фрагменте.

Enum suit (clubs, diamonds, hearts, spades); // масти

Typedef int pips; // pips является синонимом Int

Struct card { // карта

Suit s;

Pips p; // от 1 до 13 соответствует Т, 2, …. , В, Д, К

};

В С++ имя структуры или теговое имя (tag name) является типом. В данном объявлении struct – это ключевое слово, card – теговое имя структуры, а переменные p и s– это элементы структуры. Переменная р будет принимать значения от 1 до 13, что соответствует картам от туза до короля. Она является переменной типа pips, объявленного с помощью ключевого слова typedef и созданного как синоним int. Объявление с таким именем придаёт программе документированность и сводит сложные объявления к ясным идентификаторам. Объявление struct card можно рассматривать как «чертёж»: оно создаёт тип card, но не фактические экземпляры. Объявление

выделяет память для идентификаторов с1 и с2 типа card. Для доступа к членам структур с1 и с2 используется оператор выбора члена структуры, представляющий собой точку «.». допустим, мы хотим присвоить с1 значение, соответствующее пятёрке бубен, а с2 – дамы пик. Можно написать:

c1.p = 5;

c1.s = diamonds;

c2.p = 12;

c2.s = spades;

Конструкция вида

переменная_структуры.имя_элемента

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

Пример:

Struct fruit {

Char name[15];

Int calories;

};

 

Struct vegetable {

Char name[15];

Int calories;

};

fruit a;

vegetable b;

Сделав такое объявление, можно обращаться к a.calories и b.calories безо всякой двусмысленности.

Вообще, структура объявляется ключевым словом struct, за ним следует идентификатор (теговое имя), затем в фигурных скобках идёт список объявлений членов. Теговое имя необязательно, но если оно есть, то должно отражать суть моделируемого АТД. Когда теговое имя отсутствует, объявление структуры является безымянным и может использоваться только для немедленного (следующего сразу за объявлением безымянной структуры) объявления переменный этого типа, например:

Struct {

Int a, b, c;

} triples [2] = { {3, 3, 6}, {4, 5, 5} };