§ 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)), трэба прысвоіць полю ініцыялізуемае значэнне.