При програмуванні інженерних задач досить часто доводиться мати справу з даними, які природно складаються з інших даних. Наприклад, відомості про студентів містять прізвище, ім'я та по батькові, місяць та рік народження, домашню адресу та інші дані. Для подання подібної інформації мова Object Pascal використовує структуру, що носить ім'я «запис» (record). З одного боку, запис можна розглядати як єдину структуру, а з іншого як набір окремих елементів, компонентів. Характерною особливістю запису є те, що кожен компонент запису має своє ім'я.
Запис це структура даних, яка складається з окремих іменованих компонентів різного типу, що називаються полями. На відміну від масиву, компоненти (поля) запису можуть бути різного типу Для того щоб посилання на той чи інший компонент запису був можливий, поля іменуються.
Структура оголошення гину запису така:
ім'я типу - recordсписок полів end;
Тут: ім'я типу - правильний ідентифікатор; record, end - зарезервовані слова (запис, кінець); список полів – список полів, що являє собою послідовність розділів запису, між якими ставиться крапка з комою. Кожен розділ запису складається з одного або декількох ідентифікаторів полів, які відділяються один від одного комами. За ідентифікаторами ставиться двокрапка та опис типу полів, наприклад:
Type
student=record
prizv:string[15];
stat:string12];
dity:string[4];
rik,dohod:integer;
end;
Var
m,n: Student ;
…
У цьому прикладі тип student (студент) є записом з полями prizv, stat, dity, rik, dohod (прізвище, стать, діти, рік, доход); змінні m та n містять запис типу student.
Так само, як і в масивах, значення змінних типу «запис» можна присвоювати іншим змінним того ж типу, наприклад:
r:=m;
При зверненні до елементу запису спочатку зазначається ім'я змінної, потім ставиться крапка та назва відповідного елемента.
Var
k:student;
Begin
k.prizv:='Іванов';
k.stat:='M';
…
В разі потреби задати значення великій кількості елементів змінній-запису, кожного разу попередньо указувати її ім'я незручно. Object Pascal має ключове слово with, яке дозволяє опускати ім'я змінної у логічному блоці. При цьому перед кожним згадуванням елемента у цьому блоці ім'я змінної буде ставитися автоматично.
with k do
Begin
prizv:='Іванов';
stat:='M';
end;
Якщо у логічному блоці, охопленому словом with, необхідно використати також змінну, ім'я якої співпадає з назвою одного з елементів запису, то перед нею потрібно указати назву модуля (ім'я програми), в якому ця змінна описана.
Var
k: student;
name:string;
Begin
name:='Київ';
with k do
Begin
name: = 'Дінамо';
city:=Prcjectl.Name;
end;
Якщо у блоці with модуль для конкретної змінної не зазначено, то компілятор перш за все шукає її ім'я у списку назв елементів запису і тільки потім - серед звичайних змінних.
Після ключового слова with можна указувати не одне, а декілька імен змінних-записів:
with k, t, р do
Begin
…
Object Pascal дозволяє використовувати записи з так званими варіантними полями, наприклад:
Type
Forma=record
Name:=string;
case byte of
0:(Birthplace:string[50]);
1: (Courtry: string [25];
EntryPcrt: string [15];
EntryDate: l..31;
ExitDate: l..31);
end;
У цьому прикладі тип Forma визначає запис з одним зафіксованим полем Name та варіантною частиною, яка додається реченням case...of. Вapiaнтна части на складається з декількох варіантів (у прикладі - з двох варіантів: 0 та 1). Кожен варіант визначається константою вибору, після якої стоїть двокрапка та список полів, замкнений у круглі дужки. У будь-якому запису може бути тільки одна варіантна частина; в разі її присутності вона має розташовуватися після усіх фіксованих полів.
Приємною особливістю варіантної частини є та обставина, що усі задані у ній варіанти «накладаються» один на другий, тобто кожному з них виділяється одна й та ж область пам'яті. Це відкриває додаткові можливості перетворення типів, наприклад:
Var
Mem4: record
casebyteof
0:(by: array[0..4] of byte);
1:(wo: array[0..2] of word);
2:(lo: LongInt);
end;
У цьому прикладі запис Mem4 має три варіанти, кожен з яких займає у пам'яті одну і ту саму ділянку з 4байтів. У залежності від того, до якого поля запису ми звергаємося в ОР-програмі, ця ділянка може розглядатися як масив з 4 байтів (поле by), масив з двох цілих типу word (поле wo) та, нарешті, як одне ціле число типу Longlnt (поле lo). Наприклад, цьому запису можна спочатку присвоїти значення довгого цілого, а потім проаналізувати результат за байтами або словами:
Var
x: word;
xb: byte;
xl: LongInt;
Begin
…
withmdo
Begin
lo:=trunk(2*ln(x));
ifwo[1]=0
Then
ifby[l]=0
Then
xb:=x[0]
Else
x:=wo[0]
Else
xl:=lo
end;
…
End.
Речення case...of, що відкриває варіантну частину, зовні схоже на відповідний оператор вибору, але практично лише відіграє роль своєрідного службового слова, яке означає початок варіантної частини. Ось тому у кінці варіантної частини не слід ставити end як пару до case...of. (Оскільки варіантна частина - завжди остання у запису, за нею все ж таки стоїть end, але лише як пара до record.) Ключ вибору у реченні case...of фактично ігнорується компілятором: єдина вимога до нього в Object Pascal полягає у тому, що ключ має визначати деякий стандартний або попередньо оголошений порядковий тип. Імена полів мають бути унікальними у межах того запису, де вони оголошені, але якщо записи містять поля-записи, тобто вкладені одне водне, імена можуть повторюватися нарізних рівнях вкладення.
Оператор (інструкція) withдозволяє використовувати імена полів без вказівки імені змінної-запису. У загальному вигляді оператор withзаписують таким чином:
withім'я do
Begin
{оператори OP-програми}
end;
Тут: with- зарезервоване слово мови Pascal, яке визначає, що далі до слова endпри зверненні до полів змінної-запису ім 'я можна не зазначати ім'я змінної-запису; ім'я - ім'я змінної-запису.
Наприклад, якщо у програмі оголошено змінну-запис
student: record// Інформація про студента
name: string [20]; // прізвище
namel: string[15] ; // ім'я
rik: integer;// рік народження
end;
та дані про студента знаходяться у полях Editl, Edit2, Edit3діалогового вікна, то для заповнення полів запису замість операторів
student.name:=Edi11.Text;
student.namel:=Edit2.Text;
student.rik:=Edit3.Text;
можна записати:
withstudent do
Begin
name:=Editl.Text;
namel:= Edit2.Text;
rik:= Edit3.Text;
end;
САМОСТІЙНА ПІДГОТОВКА ДО ВИКОНАННЯ ЛАБОРАТОРНОЇ РОБОТИ
4. Записати в зошит тему, мету, обладнання, практичні завдання свого варіанту (вибирається згідно номеру комп’ютера).
5. По літературі до лабораторної роботи вивчити основи роботи з записами в інтегрованому середовищі розробки Delphi.
6. По інструкції до лабораторної роботи ознайомитись з порядком виконання роботи.