Житомирський військовий інститут
Національного авіаційного університету
Структуровані типи даних: записи та множини. Використання процедур та функції мови TurboPascal. Поняття про записи. Прості записи
Житомир 2010
План
1. Ієрархічні записи
2. Записи з варіантними полями
3. Множини
4. Загальні відомості про процедури та функції
5. Процедури з параметрами
6. Процедури без параметрів
7. Особливості використання функцій
8. Методи звертань до процедур і функцій
1. Поняття про записи. Прості записи
Записи призначені для складання програм, які забезпечують дії з таблицями, відомостями, списками, каталогами і т.д., де містяться дані різних типів.
Розглянемо суть запису на прикладі 1:
Приклад 1:
Нехай маємо таблицю відомостей про типи зброї:
№ | Тип зброї | Індекс зброї | Дальність дії | Висота дії |
N | W | I | D | H |
Кожному рядку такої таблиці відповідає запис, який має своє власне ім’я (також, як і змінна), наприклад: TWOO. Запис складається із окремих часток відповідно стовпчикам таблиці – поля записів (у прикладі 1 5 полів).
Типи даних, які записують у полях, можуть бути різноманітними. Для прикладу 1:
№ - тип INTEGER;
тип зброї W – може бути обмеженим, який вводиться оператором, наприклад WOOR (або може використовувати тип STRING);
індекс I – також може бути обмежений цілочисловий (IND);
дальність D та висота H – типу REAL.
Таким чином, тип записів, як такий, не існує. Він містить різнотипові елементи.
Кожне поле має складене ім’я з двох компонентів, які відокремлюються крапкою:
IZ.IP.
Для прикладу 1:
TWOO . N;
TWOO . W;
TWOO . I;
TWOO . D;
TWOO . H.
Опис записів виконують двома способами:
1) у розділі типів та змінних;
2) у розділі змінних.
!Особливість! необхідно спочатку описати не стандартні типи даних ( наприклад WOOR, IND).
Порядок опису записів:
1) у розділі типів та змінних:
type
<ім’я типу> = RECORD
<ім’я поля> : <тип поля>;
……………………………..;
<ім’я поля> :<тип поля>;
end;
var <ім’я типу>
2) у розділі змінних:
3)
var <ім’я типу> : RECORD
<ім’я поля> : <тип поля>;
……………………………..;
<ім’я поля> : <тип поля>;
Для прикладу 1 маємо:
1) type
WOOR = (str, art, zrk, avia);
IND = (1..100);
TZW = RECORD
N : integer;
W : WOOR;
I : IND;
D, H : real;
End;
Var
YWOO : TZW;
Або 2-й спосіб:
Type
WOOR = (str, art, zrk, avia);
IND = (1..100);
Var
TWOO : RECORD
N : integer;
W : WOOR;
I : IND;
D, H : real;
End;
Особливість:
а) над кожним складеним іменем можна виконувати будь-які операції, допустимі для даного типу, до якого відносяться дані поля;
б) на тип полів не накладаються ніякі обмеження. Таким чином для полів використовують як складні так і прості типи даних. В частості поля можуть бути масивами або записами.
Приклад 2:
Розробитипрограму для обчислення щільності (густини) потужності активної завадипередавачазавад за формулою
P = (P*G)/f;
де Р – потужність передавача завад;
G– коефіцієнт підсилення;
f - ширина спектра завад.
Дані про передавач завад можна занести до таблиці:
Р | G | f |
Тобто представимо у вигляді трьох полів: P, G, f. Ім’я запису визначимо як PMAP. Тип даних полів як REAL.
Такий принцип використання імен значно збільшує об’єм тексту програми, тому в мові ТР передбачений спеціальний оператор приєднання WITH, який виносить наперед ім’я запису, а всередині оператора використовується тільки ім’я полів.
Формат оператора приєднання:
WITH <ім’я запису> DO <оператор>.
Для прикладу 2 змінюються оператори виведення та присвоюваня:
WITH PMAP DO
Begin
Read(P, G, Df);
RO := P*G/Df;
End;
Внутрішнім оператором виступає складений оператор BEGIN…END.
Program plotnost(input, output);
Var
RO : real;
P, G, Df : real;
End;
Begin
WriteLn(‘ввести таблицю P, G, Df’);
Read (PMAP . P, PMAP . G, PMAP . Df);
RO := PMAP . P * PMAP . G/PMAP . Df;
WriteLn(‘щільність RO = ‘, RO);
End.
Таким чином, для звертання до полів у програмі використовується складне ім’я:
<ім’я запису> . <ім’я поля>
PMAP . P;
PMAP . G;
PMAP . Df.
Таким чином при використанні оператора WITH збільшується швидкість використанняпрограми, бо ім’я запису PMAPв пам’яті буде обчислене тільки один раз при обробці конструкції WITHPMAPDO.
Ще більшої ефективності можнадосягнути, якщо запис є, наприклад, елементом масиву:
Var
M : array[1..100] ofchar;
Begin
WithM[ i ] do
Якщо фрагмент програми містить операції над декількома записами, то в операторі приєднання можна указати список необхідних імен записів через кому:
WITH V1, V2, V3 DO S
де V1, V2, V3 – імена записи;
S – операнд.
Така форма еквівалентна :
WITH V1 DO
WITH V2 DO
WITH V3 DO S.
Особливість:
1) якщо деякий ідентифікатор F є полем, він інтерпретується як V2.F, тобто ідентифікатор поля зв’язується з останнім записом у списку WITH.
2. всі ідентифікатори в межах оператора приєднання перевіряються на можливість їх інтерпретації як полів записів, заданих у заголовку.
2. Ієрархічні записи
Поля окремих записів також можуть бути записами. Тому складені імена можуть містити не дві, а більшу кількість компонент, тобто мати ієрархічний характер.
Наприклад:
A . B . C;
A . B[ i ] . Cі т.д.
Розглянемо приклад : відомості про студентів
№ | Група | Прізвище | Ім’я | По батькові | Рік народження |
N | GR | F | I | O | GOD |
Присвоюємо ім’я запису W, який буде містити 6 полів. Поєднаємо поля F, I, O у запис з іменем FIO, який буде мати 3 поля і входити у запис W.
Опис такого запису можна представити так:
Type
SPISOK = string[50];
GROUP = (GR1, GR2, GR3, GR4);
IND = (1980..1985);
Var
W : RECORD {опис запису вцілому}
N : integer;
GR : groupe;
FIO : RECORD {опис внутрішнього запису}
F : SPISOK;
I : SPISOK;
O : SPISOK;
{кінець внутрішнього запису}
End;
GOD : IND
End;{кінець запису}
Тоді в розділі операторів можна поставити конструкцію:
WITH W, FIO DO
N := 1;
GR := 3;
F := ‘ Кравченко’;
I := ‘Сергій’;
O := ‘Петрович’;
GOD := 1980;
3. Записи з варіантними полями
Взагалі запис може складатися з двох частин: фіксованої і варіантної (тобто декілька варіантів структури цього типу). Варіантна частина містить декілька альтернатив, кожна з яких у круглих дужках задає список полів даного варіанта. Списку передує мітка, яка є конкретним значенням поля – критерій вибору варіантів. Перелік альтернатив починається з визначення цього поля.
Приклад 3: нехай TIP – ім’я змінної типу Т, яке приймають значення М1 і М2. ЗаписZ містить фіксовану частину (поле N) і варіантну з двома списками імен полів.
Опис запису має вигляд:
TypeT = (M1, M2);
Var TIP : T;
Z : RECORD
N : integer; {фіксована частина}
CASE TIP of {варіантна частина}
M1 : (список полів 1);
М2 : (список полів 2);
End;
Таким чином:
1) початок варіантного запису відмічається службовим словом CASE, після визначення поля признаку вибору варіантів записується службове слово of.
2) варіантна частина повинна знаходитись після фіксованої наприкінці запису перед службовим словом END, тобто тільки одна варіантна частина.
Приклад 4: варіанти характеристики систем зброї
Тип зброї | Індекс | Маса |
W (ZRK, RLS) | I | M |
Для ZRK:
Дальність дії | Висота дії |
D | H |
Для RLS:
Потужність передавача | Довжина хвилі | Спосіб обзору |
P | L | SZ |
Опис запису:
Type SS = (neprer, impuls);
TW = (ZRK, RLS);
Var WW : TW;
W : RECORD
I : integer;
M : real;
CASE WW of
ZRK : (D, H : real);
RLS : (P, L: real; SZ : SS);
End;
Якщо тепер в програмі виконати оператор :
WW :=ZRK;
то далі можна використовувати оператори:
W.I :=124;with w do
W.M :=15;-I := 124;
W.D :=40;M := 15;
W.H :=24;D := 40;
H := 24;
Якщо виконано оператор
WW := RLS;
with w do
I := 203;
M := 18;
P := 10;
L := 0.3;
SZ := impuls;
Особливості:
1) для розміщення змінної комбінованого типу завжди відводиться фіксований об’єм пам’яті, який визначається найбільшим варіантом. Таким чином, різні варіанти одного запису якби “накладаються” один на одного у пам’яті, тобто займають одну і ту ж область.
2) мова Паскаль не має засобів контролю за правильністю роботи з варіантами, тому оператор повинен складати програму дуже коректно.
Синтаксичні діаграми:
1) комбінований тип:
record -> <список полів>-> end;
2) список полів:
<фіксована частина> -> ;-> <варіантна частина> ->;
3) фіксована частина:
<індентифікатор> -> : -> <тип> -> ;