Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНА РОБОТА PRL-03-03.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
87.03 Кб
Скачать

Лабораторна робота №03-04 «Структури і масиви структур»

  1. Теоретичні відомості загальні поняття

Структури – це складний об'єкт, в який входять елементи будь-яких типів, за винятком функцій. На відміну від масиву, який є однорідним об'єктом, структура може бути неоднорідною. Тип структури визначається записом виду:

Struct { список визначень }

У структурі обов'язково повинен бути вказаний хоча б один компонент. Визначення структур має наступний вигляд:

тип-даних описувач;

де тип-даних вказує тип структури для об'єктів, визначених в описувачах. У простій формі описувачі є ідентифікаторами або масивами.

Приклад:

struct { double x,y; } s1, s2, sm[9];

struct { int year; char moth, day; } date1, date2;

Змінні s1, s2 визначаються як структури, кожна з яких складається з двох компонент х і у. Змінна sm визначається як масив з дев'яти структур. Кожна з двох змінних date1, date2 складається з трьох компонентів year, moth, day.

Існує і інший спосіб асоціювання імені з типом структури, він заснований на використанні тега структури. Тег структури аналогічний тегу перелічуваного типу. Тег структури визначається таким чином:

struct тег { список описів; };

де тег є ідентифікатором.

У приведеному нижче прикладі ідентифікатор student описується як тег структури:

struct student { char name[25]; int id, age; char prp; };

Тег структури використовується для подальшого оголошення структур даного вигляду у формі:

struct тег список-ідентифікаторів;

Приклад:

struct studeut st1,st2;

Використання тегів структури необхідне для опису рекурсивних структур. Нижче розглядається використання рекурсивних тегів структури.

struct node { int data; struct node * next; } st1_node;

Тег структури node дійсно є рекурсивним, оскільки він використовується в своєму власному описі, тобто у формалізації покажчика next. Структури не можуть бути прямо рекурсивними, тобто структура node не може містити компоненту, що є структурою node, але будь-яка структура може мати компоненту, що є покажчиком на свій тип, як і зроблено в приведеному прикладі.

Доступ до компонентів структури здійснюється за допомогою вказівки імені структури і наступного через крапку імені виділеного компоненту, наприклад:

st1.name="Іванов";

st2.id=st1.id;

st1_node.data=st1.age;

Об'єднання (суміші)

Об'єднання подібно структурі, проте в кожен момент часу може використовуватися (або іншими словами бути у відповідь) тільки один з елементів об'єднання. Тип об'єднання може задаватися в наступному вигляді:

Union {опис елементу 1;

...

опис елементу n; };

Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється одна і та ж область пам'яті, тобто вони перекриваються. Хоча доступ до цієї області пам'яті можливий з використанням будь-якого з елементів, елемент для цієї мети повинен вибиратися так, щоб одержаний результат не був безглуздим.

Доступ до елементів об'єднання здійснюється тим же способом, що і до структур. Тег об'єднання може бути формалізований точно так, як і тег структури.

Об'єднання застосовується для наступних цілей:

  • ініціалізації використовуваного об'єкту пам'яті, якщо в кожен момент часу тільки один з багатьох об'єкт є активним;

  • інтерпретації основного представлення об'єкту одного типу, неначебто цьому об'єкту був привласнений інший тип.

Пам'ять, яка відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найдовшого елементу об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити невживану пам'ять. Всі елементи об'єднання зберігаються в одній і тій же області пам'яті, починаючи з однієї адреси.

Приклад:

union { char fio[30];

char adres[80];