Здавалка
Главная | Обратная связь

Записи. Види записів. Робота з записами



Питання для вивчення:

1. Поняття записів.

2. Оголошення записів.

3. Масиви записів.

4. Записи з варіантами

 

Поняття записів. Запис - структурований тип даних. Записи є неоднорідними неупорядкованими структурами з прямим доступом до компонентів. Компоненти запису називають полями запису.

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

рекордсмен

країна

статус змагань (Олімпіада, чемпіонат світу)

довжина дистанції

рік рекорду

час

Оголошення записів. Запис може бути оголошена в розділі type:

ідентифікатор типу = Record

поле1: тип;

поле2: тип;

...

полеN: тип

end;

Наприклад,

type beg = record

fam: string [25];

srtana: string [20];

status: boolean; {Олімпіада - true; чемпіонат світу — false}

dlina: longint;

god: 1900 .. 2009;

vr: string [15];

end;

Var a: beg;

До кожного елементу запису можна звернутися, використовуючи складене ім'я, яке має наступну структуру:

<Ім'я змінної>. <Ім'я поля>

Наприклад,

a.fam; a.dlina і т.п.

Якщо, наприклад, потрібно полю "status" присвоїти значення «true», то це робиться так:

a.status: = true;

Поля запису можуть мати будь-який тип, крім файлу, зокрема, самі можуть бути записами. Наприклад,

type beg1 = record

fam: string [25];

srtana: string [20];

status: boolean; {Олімпіада - true; чемпіонат світу — false}

dlina: longint;

god: 1900 .. 2009;

vr: record min: longint;

sec: real

end

end;

Var a: beg1;

Поля такого запису, що знаходяться на третьому рівні, ідентифікуються потрійним складовим ім'ям. Наприклад,

a.vr.min

a.vr.sec

Масиви записів. У програмі можуть використовуватися масиви записів.

Будь-яка обробка записів, у тому числі введення і виведення, проводиться поелементно. Наприклад,

var b: array [1 .. 200] of beg1;

...

write ('Кількість рекордсменів?'); readln (n);

for i: = 1 to n do

with b [i] do

begin

write ('Прізвище спортсмена?'); readln (fam);

write ('Громадянин якої країни спортсмен?'); readln (strana);

write ('Статус змагання?'); readln (status);

write ('Довжина дистанції?'); readln (dlina);

write ('Рік проведення змагання?'); readln (god);

write ('Час, за який спортсмен пробіг дистанцію (хв, сек)?'); readln (vr.min,

vr.sec);

end;

...

У прикладі був використаний оператор приєднання, який має наступний вигляд:

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

Він дозволяє, один раз вказавши ім'я змінної типу "запис" після слова with, працювати в межах одного оператора (простого чи складеного) з іменами полів як з звичайними змінними, тобто не писати громіздких складових імен. Обсяг пам'яті, займаний записом, визначається сумарним обсягом, займаним її полями:

type beg1 = record

fam: string [25]; {26 байт}

srtana: string [20]; {21 байт}

status: boolean; {1 байт}

dlina: longint; {4 байти}

god: 1900 .. 2009; {2 байти}

vr: record min: longint; {4 байти}

sec: real {6 байт}

end

end;

Всього отримано: 26 +21 +1 +4 +2 +4 +6 = 65 байт

Масив, описаний вище, займає 65 байт × 200 елементів = 13000 байт оперативної пам'яті.

Записи з варіантами. При визначенні типу запису в неї можна включати варіантну частину. Це означає, що різні змінні, хоча вони відносяться до одного типу, можуть мати різні структури. Варіантна частина запису починається вибором case і слід за загальною частиною; після її закінчення в запису не можуть з'являтися ніякі інші поля, тому case закривається службовим словом end.

Будь-який запис може мати тільки одну варіантну частину, яка повинна розміщуватися в кінці запису (після фіксованої частини). Однак, усередині якого-небудь варіанта, в свою чергу, може бути присутнім інша варіантна частина, вкладена в першу.

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

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

Type pol = (m, w);

people = record

fam: string [20];

godro: 1900 .. 2007;

case mw: pol of

m: (voen: boolean; spec: string [15]);

w: (merry: boolean; child: byte)

end;

var p1, p2: people;

Всі імена елементів повинні бути різними, навіть якщо вони зустрічаються в різних варіантах. До елементів варіантної частини можна звертатися так само, як до елементів фіксованої частини запису.

P1.mw: = m; p1.voen: = true; p2.child: = 2;

У процесі виконання програми в структуру запису включається той варіант, елементам якого в даний момент було присвоєно значення. Як тільки якому-небудь елементу іншого варіанту присвоюється деяке значення, в структуру запису включається цей варіант, а елементи попереднього варіанта стають невизначеними. Дана обставина враховується і при підрахунку обсягу пам'яті, що відводиться під запис з варіантами. Статичні поля враховуються звичайним чином, а серед варіативної частини відшукується той випадок, де сумарний обсяг пам'яті для полів максимальний.

Type pol = (m, w);

people = record

fam: string [20]; {21}

godro: 1900 .. 2007; {2}

case mw: pol of {1}

m: (voen: boolean; spec: string [15]); {1 +16 = 17}

w: (merry: boolean; child: byte) {1 +1 = 2}

end;

21 + 2 + 1 + max (17, 2) = 41 (байт)

Питання для контролю вивченого матеріалу:

1. Чим відрізняється тип "запис" від інших структурованих типів?

2. Чи можуть поля запису бути одного і того ж типу?

3. Як звернутися до окремого поля запису?

4. Як заповнити масив записів?

Література:

Фаронов В.В. Турбо Паскаль 7.0. Начальный курстор. – М: Диалектика, 1997. – 487 стор. 95 — 103

 

Урок № 30

(згідно робочої навчальної програми)







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.