Структурні типи даних

Раніше ми розглядали прості типи даних. Об'єкт даних будь-якого простого типу має ту властивість, що він містить одне й тільки одне значення. Однак для розв'язання більшості задач за допомогою програм потрібно мати можливість опису об’єктів даних, що містять багато значень. Такі об'єкти описуються структурними типами даних, що необхідні з двох причин. По-перше, для розробки програм низхідним методом потрібно вміти описувати дані на різних рівнях. За мірою уточнення проекту внутрішня структура даних буде все більше деталізуватися. Таким чином, первинна структура даних описується в термінах складних структур даних, що, у свою чергу, описуються в термінах простіших структур даних доти, доки наприкінці не з'явиться опис у термінах простих об'єктів даних, з яких, урешті-решт, складається структура.

Розгляд способів, якими нам би хотілося структурувати дані, вимагає двох різних механізмів. По-перше, механізм масивів, що дозволяє групувати набір об'єктів ідентичного типу таким чином, що кожен об'єкт вибирається за допомогою індексу чи номера. По-друге, механізм записів (структур), що дозволяє групувати набір об'єктів різних типів таким чином, що вибір кожного окремого об'єкта здійснюється за допомогою імені компоненти. Саме на другому механізмі ґрунтується об'єктно-орієнтоване програмування. Ці два механізми можна комбінувати при побудові структур даних довільної складності.

Крім механізмів масивів і записів, існує механізм множин, що забезпечує специфічні можливості.

Поки ми розглянемо механізми масивів і записів для структурування даних.

Масиви

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

typedef float vec[10] ;

задає тип vec як об'єднання 10 значень типу float у групу, що індексується цілими числами від 0 до 9. Тепер можна описувати об'єкти типу vec у звичайний спосіб, наприклад

vec x,y;

Елементи цих масивів позначаються ім'ям масиву та індексом у квадратних дужках, що йде за іменем. Наприклад, x[2], y[i] позначають другий елемент масиву x та i -й елемент масиву y, відповідно.

У деяких мовах з масивами можна виконувати деякі операції з об'єк­тами регулярного типу, розглянутими як єдине ціле, не торкаючись їхньої внутрішньої структури (напр., присвоювати масиви). Однак у мовах С-С++ цього робити не можна. Тому, наприклад, при описі

float x[15], y[15];

операція x=y; не допускається.

Масив можна уявити як реалізацію функції відображення. У наведеному вище фрагменті програми об’єкти х та у визначають відображення із множини цілих чисел від 0 до 14 на множину значень типу float. Таке відображення можна визначити для будь-якого дискретного простого типу даних, а не тільки для цілих. Це можна зробити шляхом перевантаження операції індексування масиву.

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

typedef float matr[10][10];

визначає тип matr як двовимірний масив.

Структури

На відміну від механізму масивів, механізм структур дозволяє групувати набір різнотипних об'єктів. Кожному об'єкту у структурі дається компонентне ім'я, за допомогою якого на нього можна посилатися. Наприклад,

enum range {yellow, black, white};

struct car{

floatvolume;

range colour;

int year;

}

визначає тип структури, названої car. На поле цієї структури посилаються додаванням до імені структури імені поля, що розділяються крапкою. Наприклад, якщо є

struct car my;

то оператор присвоювання

my.year=1987;

присвоїть полю year екземпляра структури my значення 1987.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: