- •Визначувані типи
- •Опис визначуваного типу
- •Класифікація відомих визначуваних типів
- •Використання визначуваного типу
- •Підтипи
- •Перелічувані типи. 1
- •Перелічувані типи. 2
- •Об'єднаний тип
- •Складений тип
- •Рядковий тип
- •Представлення рядків
- •Представлення рядкового літерала в мові Pascal
- •Операції над рядковими знченнямив мові Pascal
- •Представлення рядкового літерала в мові с
- •Індексовані типи
- •Устрій одновимірних мультизначень
- •Устрій двовимірних мультизначень
- •Опис устрою мультизначення індексованого типу
- •Устрій паспорту індексованого типу
- •Приклади опису устрою індексованого типу. 1
- •Приклади опису устрою індексованого типу. 2
- •Індексатор
- •Основні властивості індексованих типів
- •Опис об'єктів індексованого типу. 1
- •Опис об'єктів індексованого типу. 2
- •Ініціалізація об'єктів індексованого типу
- •Ініціалізація при створенні об'єкту
- •Ініціалізація об'єкту оператором привласнення
- •Особливості індексованого типу в мові с.1
- •Особливості індексованого типу в мові с.2
- •Іменовані (комбіновані) типи
- •Механізм обробки значень іменованого типу
- •Відмінності в застосуванні іменованого та індексованого типів
- •Використання типізованих вказівних змінних іменованого типу
- •Спеціальний випадок використання типізованих вказівних змінних іменованого типу
- •Структури даних. Визначення
- •Структури даних. Визначення
- •Лінійні структури даних
- •Лінійний список
- •Лінійний список
- •Підходи до реалізації списку
- •Моделювання лінійного списку. 1
- •Векторне представлення лінійного списку. 1
- •Векторне представлення лінійного списку. 2
- •Векторне представлення стеку
- •Векторне представлення черги
- •Моделювання лінійного списку. 2
- •Зв’язане представлення черги. 2
- •Нелінійні структури даних
- •Представлення дерев
- •Устрій дерева як структури даних
- •Види дерев як структур даних
- •Моделювання дерева. Приклад 2
Особливості індексованого типу в мові с.1
У мові С позначення об'єкту індексованого типу є позначенням вказівної типізованої змінної, розіменований вміст якої вказує на нульовий компонент мультизначення.
Наприклад:
const int MAX = 3;
int nArr[max];
Особливості індексованого типу в мові с.2
Тому можливо записати наступне:
int *pnArr ≡ nArr; де ≡ - символ тотожності
int * pnArr ≡ &nArr[0];
*(pnArr + indexer) ≡ nArr[indexer];
*(nArr + indexer) ≡ pnArr[indexer];
pnArr ≡ &nArr[0];
*pnArr ≡ nArr[0];
Отже, у мові С обробка значень індексованого типу грунтується на адресній арифметиці:
nArr[2] ≡ (nArr+2);
Іменовані (комбіновані) типи
Типи, значення (мультизначення) яких утворюються з компонентів різних типів, доступних по позначенню, називаються іменованими (named types). Мультизначення іменованого типу називається структурою, або записом (record).
Щоб описати значення комбінованого типу, необхідно описати тип значення кожного компонента (поля) і поставити їм у відповідність позначення, унікальні в контексті даного опису. Таке позначення називається покажчиком поля, або селектором. Для представлення селектора використовується ідентифікатор. Селектор набуває сенсу тільки в поєднанні з позначенням об'єкту, що має значення іменованого типу.
Механізм обробки значень іменованого типу
Характерний для іменованого типу є те, що зв'язок
"позначення об’єкта – селектор – значення компонента"
установлюється під час компіляції, тоді як зв'язок
"позначення об'єкта – значення індексатора – значення компонента мультизначення індексованого типу",
як правило, установлюється в періоді виконання програми. У цьому полягає істотна відмінність механізмів обробки значень іменованого та індексованого типів, яка береться до уваги при виборі типу для опису об'єктів, якщо компоненти мультизначень описуваного об’єкта мають один і той самий тип.
Відмінності в застосуванні іменованого та індексованого типів
Вибір типу (іменований або індексований) для застосування в програмі визначається:
ефективністю – компоненти значень іменованого типу не завжди в пам'яті розміщуються впритул на відміну від індексованого типу;
гнучкістю – зв'язок із компонентом індексованого типу зазвичай обчислюється динамічно під час виконання програми;
зручністю – в значенні іменованого типу можна зібрати скільки завгодно компонентів, але всі необхідно навести в описі типу, наділивши унікальними селекторами.
Опис та застосування іменованого типу
Pascal:
type
my = record
m_sSurname : string [40];
m_c Gender : char;
m_nAge : integer;
end;
var
my_Mаn : my;
Зображення значень іменованого типу здійснюються з використанням зображень значень типів, які утворюють мультизначення, наприклад для типу my : {“Іванов”, ‘M', 17}
Застосування іменованого типу. 1
Для значень іменованого типу дозволено застосовувати оператор присвоювання двох сумісних об'єктів. Доступ до компонентів мультизначення здійснюється шляхом використання позначення об'єкта (змінної) та позначення відповідного селектора.
Pascal:
var
my_Mаn : my;
my_Women : my;
begin
…
my_Mаn := my_Women;
Застосування іменованого типу. 2
Pascal:
my_Women.m_sSurname := 'Петрова';
my_Women.m_c Gender := 'W';
my_Women.m_nAge := 38;
или
with my_Women do
begin
m_sSurname := 'Петрова';
m_c Gender := 'W';
m_nAge := 38;
end;
Застосування іменованого типу. 3
С:
struct my{
char *m_sSurname;
char m_c Gender;
int m_nAge;
}
my my_Women;
my_Women.m_sSurname = “Петрова”;
my_Women.m_c Gender = 'W';
my_Women.m_nAge = 38;
Ініціалізація об’єктів іменованого типу
Ініціалізація об'єктів іменованого типу може відбуватися як при описі об'єкта, так і шляхом застосування оператора присвоювання.
Для ініціалізації при описі в мові Pascal використовується список пар, які утворюються позначенням селектора та R-виразом.
Наприклад, m_sSurname : 'Петрова'; m_c Gender := 'W'
Для ініціалізації в мові С застосовується список R – виразів.
Наприклад, 'Петрова', 'W'
Порядок позначення у списку ініціалізації позиційний, тобто має відповідати порядку опису компонентів в описі типу.
Pascal:
type
point = record
m_Jx: real;
m_Jy: real;
end;
const
my_Point1 : point = (m_Jx: 1.1; m_Jy: 1.2);
var
my_Point2 : point;
begin
my_Point2.m_Jx := 10.2;
my_Point2.m_Jy := 15.5;
С:
struct point{
float m_Jx;
float m_Jy;
}
void main()
{
point my_Point1 = {1.1, 1.2};
point my_Point2;
my_Point2.m_Jx = 10.2;
my_Point2.m_Jy = 15.5;
