Раніше ми розглядали прості типи даних. Об'єкт даних будь-якого простого типу має ту властивість, що він містить одне й тільки одне значення. Однак для розв'язання більшості задач за допомогою програм потрібно мати можливість опису об’єктів даних, що містять багато значень. Такі об'єкти описуються структурними типами даних, що необхідні з двох причин. По-перше, для розробки програм низхідним методом потрібно вміти описувати дані на різних рівнях. За мірою уточнення проекту внутрішня структура даних буде все більше деталізуватися. Таким чином, первинна структура даних описується в термінах складних структур даних, що, у свою чергу, описуються в термінах простіших структур даних доти, доки наприкінці не з'явиться опис у термінах простих об'єктів даних, з яких, урешті-решт, складається структура.
Розгляд способів, якими нам би хотілося структурувати дані, вимагає двох різних механізмів. По-перше, механізм масивів, що дозволяє групувати набір об'єктів ідентичного типу таким чином, що кожен об'єкт вибирається за допомогою індексу чи номера. По-друге, механізм записів (структур), що дозволяє групувати набір об'єктів різних типів таким чином, що вибір кожного окремого об'єкта здійснюється за допомогою імені компоненти. Саме на другому механізмі ґрунтується об'єктно-орієнтоване програмування. Ці два механізми можна комбінувати при побудові структур даних довільної складності.
|
|
Крім механізмів масивів і записів, існує механізм множин, що забезпечує специфічні можливості.
Поки ми розглянемо механізми масивів і записів для структурування даних.
Масиви
Поняття масиву, очевидно, найвідоміше з усіх механізмів структурування даних і в тій чи іншій формі існує фактично в усіх мовах програмування. Власне кажучи, масив – це групування набору даних ідентичного типу. Масиву присвоюється ім'я, яке позначає всю групу й механізм індексації, що дозволяє посилатися на окремі елементи групи. Наприклад, опис
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.