Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Паскал.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
1.21 Mб
Скачать

Тип запис

Тип запис, також як і масив, є структурованим типом даних, тобто таким, змінні якого складені з декількох частин. У Турбо-Паскале існує можливість об'єднати в одній змінній дані різних типів (тоді як у масиві всі елементи мають однаковий тип). Приведемо приклад такого типу. Нехай у земінній потрібно зберігати відомості про деяку людину: ПІБ, стать, адреса, телефон. Тоді для збереження цих даних буде зручний такий тип:

type tPerson = record

Name,Surname,SecondName: string[30];

Male: boolean;

Address: string;

Phone: longint;

end;

Оголошення змінної типу запис виконується стандартно, за допомогою var. Частини запису (у нашому випадку: Name, Surname, SecondName, Male, Address, Phone) називаються полями. Звертання до поля запису в програмі виконується за допомогою знака ‘.’ (крапка). Приклад звертання до полів:

var p: tPerson;

...

begin

...

p.Surname:='Іванов';

p.Name:='Іван';

p.SecondName:=’Іванович’;

...

if (p.Phone<0) or (p.Phone>999999)

then writeln(‘Помилка’);

...

end.

Помітимо, що в цьому прикладі постійно приходиться звертатися до полів однієї і тієї ж змінної типу запис, і, отже, постійно писати її ім'я. Існує можливість позбутися від цієї незручності. У Турбо Паскалі є оператор приєднання (with), що дозволяє один раз указати, яким записом ми користаємося і надалі писати лише імена полів. Цей оператор має такий вигляд:

with <ім'я_запису> do <оператор>;

Найчастіше як оператор використовується складений оператор.

Приклад:

with p do begin

Surname:=' Іванов';

Name:=’Іван’;

...

end;

Записи можна включати до складу більш складних змінних, наприклад масивів і інших записів. При необхідності збереження інформації про співробітників деякої організації може виявитися корисним масив:

const N = 30;

type tStaff = array [1..N] of tPerson;

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

type tPoint = record

x,y: integer;

end;

tRectangle = record

LeftTop: tPoint;

Width, Height: integer;

Color: integer;

end;

Для такого запису можна застосовувати ще одну форму оператора with, що може «приєднувати» кілька імен записів, наприклад:

var rect: tRect;

with rect, LeftTop do begin

x:=100;

y:=150;

Color:=11;

...

end;

Без використання with з'явилися б вирази виду rect.Color, rect.LeftTop.x, rect.LeftTop.y і т.п.

Покажемо тепер, як можна використовувати масиви усередині записів. Припустимо, що потрібно зберігати інформацію вже не про прямокутник, а про довільний багатокутник. У цьому випадку буде потрібно задати кількість точок у ньому і список усіх цих точок, тобто масив. Потрібно передбачити можливість збереження відомостей про багатокутники з різним числом вершин, тому зробимо масив досить великим, а реальне число вершин будемо зберігати в окремому полі запису. Усе це буде виглядати так:

const MaxVertex = 200;

type tPolygon = record

size: integer;

V: array [1..MaxVertex] of tPoint;

Color: tColor;

end;

Існує різновид записів, що містить так називану варіантну частину. Для кращого розуміння розглянемо їх на прикладі. Нехай запис повинний зберігати повну інформацію про геометричну фігуру: колір, положення і розміри (для окружності — координати центра і радіус, для прямокутника — координати лівої верхньої і правий нижньої вершин, для квадрата — координати лівої верхньої вершини і довжина сторони). У принципі, можна було б включити в запис усі перераховані вище поля, але в такому випадку більшість з них часто залишалися б незайнятими, тому зручніше буде таке рішення:

type tFKind = (fCir,fRect,fSqr);

tFigure = record

Color: integer;

case kind: tFKind of

fCir: (Center: tPoint; r: integer);

fRect: (LeftTop,RightBottom: tPoint);

fSqr: (LT: tPoint; size: integer);

end;

У цьому записі мається одне звичайне поле (Color), а інші 6 і являють собою варіантну частину. Для кола в ній є поля Center і r, для прямокутника — LeftTop і RightBottom, для квадрата — LT і size. Фраза kind: tFKind не є обов'язкової, вона служить для розуміння того, які поля до яких фігур відносяться. Можна написати просто case integer of ... і нумерувати варіанти цілими числами. Помітимо також, що в оголошенні нашого запису немає слова end, що відноситься до case.

Ми можемо звертатися до будь-якого поля варіантної частини, однак варто пам'ятати, що при записі даних у поле для однієї фігури поля для інших фігур можуть змінитися. Щоб зрозуміти, чому так відбувається, досить розглянути спосіб збереження змінної типу tFigure:

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