§ 16. Тип данных структура (struct)

16.1. Описание структур

Примером структуры может послужить любой объект, который определяется набором своих характеристик. Например, точка на плоскости определяется абсциссой и ординатой, дата — днем, месяцем и годом, для книги такими характеристиками могут быть: автор, название, год издания, количество страниц и т. д. Для описания таких объектов на языке программирования С++ используется ключевое слово struct (структура).

Структура представляет собой сложный тип данных, составленный из простых типов, позволяющий использовать группу связанных между собой данных как единое целое. Отдельный элемент структуры называют полем.

Общая форма объявления структуры:

struct имя_типа

{

  тип_1  элемент_1;

  тип_2  элемент_2;

  тип_n  элемент_n;

};

Описывается структура до функции main. После закрывающей фигурной скобки «}» в объявлении структуры обязательно ставится точка с запятой.

В примере 16.1 приведено описание структур. Описание структуры создает новый тип данных. Для того чтобы использовать структуру, нужно описать переменную соответствующего типа (пример 16.2).

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

Для структур определена единственная операция — присваивание. Все остальные действия при обработке структур происходят с ее полями. Обращение к полю структуры происходит через точку «.» (пример 16.4). С полями структуры можно выполнять все  действия, определенные для типа, которым описано поле.

В качестве поля структуры может быть использована другая структура. Она должна быть описана до того, как используется (пример 16.5). При использовании структур среда программирования выводит подсказку со списком всех полей структуры после того, как пользователь поставит точку. Имя поля можно выбрать из списка (пример 16.6).

Структуры могут передаваться в функции как параметры. Функция может возвращать значение в виде структуры.

Пример 16.1. Описание структур.

Структура для описания точки на плоскости:

struct tchk

{

  double x, y;

};

 Структура для описания даты:

struct date

{

  int d, m, g;

};

Структура для описания книги:

struct kniga

{

  string avt, nazv;

  int str, god;

};

Структура, описывающая студента, поступившего в ВУЗ по результатам ЦТ:

struct student

{

  string fam, gorod;

  int god_r;

  vector <int> otm = vector<int>(3);

  int sr_bal;

};

В данном примере для каждого студента хранится его фамилия (fam), город из которого он приехал (gorod), год рождения (god_r). В векторе otm[1] хранятся три отметки, полученные на ЦТ, поле sr_bal предназначено для хранения среднего балла аттестата.

Пример 16.2. Описание переменных типа структура.

tchk A, B;

date d1, d2;

kniga K;

vector <student> gruppa (30);

Здесь описаны переменные А и В типа tchk (две точки); переменные d1 и d2 типа date (две даты); переменная K типа kniga и переменная gruppa, являющаяся массивом, содержащим описание для 30 студентов.

Пример 16.3. Инициализация структуры:

= {3.2, -4.1};

= {"Н.Я.Виленкин", "Комбинаторика", 400, 2013};

Точка А имеет координаты (3.2; -4.1): книга K — «Комбинаторика», автор — Н. Я. Виленкин, в ней 400 страниц, издана в 2013 г.

Пример 16.4. Обращение к полям структуры.

B.= 1; B.= -1;

cin >> d1.>> d1.>> d1.g;

if (K.str > 100);

cout << gruppa[2].otm[1]

Пример 16.5. Описание структуры для хранения отрезка, концы которого являются точками.

struct otrezok

{

  tchk beg, en;

};

Использование:

otrezok AB;

AB.beg.= 0;

AB.beg.= 0;

AB.en.= 2;

AB.en.= -3;

Или так

tchk A = {0,0}, B = {2, -3};

otrezok AB = {A, B};

Пример 16.6. Подсказка системы.



[1] При описании вектора в качестве поля структуры нельзя инициализировать элементы данных сразу в скобках (vector <int> otm(3)), нужно присвоить полю инициализируемое значение.