Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Підручник по ТР.DOC
Скачиваний:
11
Добавлен:
19.11.2019
Размер:
1.79 Mб
Скачать

§ 11.2 Записи

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

  • телефонні довідники, де розміщено відомості про абонентів (прізвище, ім’я, по батькові, адреса, номер телефону);

  • медична картка з різноманітними записам про пацієнта, але більшість з них співпадають (прізвище, ім’я, по батькові, дата народження, адреса, вага, зріст);

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

У програмуванні подібні однотипні записи прийнято називати записами. Запис – це структурований тип даних, який об’єднує в собі різнотипні елементи, які називають полями запису. Запис описується спеціальною конструкцією, яка розпочинається словом Record. Наприклад, для ведення власного бібліотечного каталогу можна було б використати таку конструкцію:

Type { розділ опису типів}

Book = Record { початок запису }

AuthorFamile : string[20]; { прізвище автора }

AuthorName : string[15]; { ім’я автора }

Title : string[90]; { назва книги }

Date : word; { рік видання }

Page : integer; { кількість сторінок }

Klass : byte; { для визначення тематики книги }

End; { кінець запису }

Описаний тип можна графічно представити так:

B ook

AuthorFamile AuthorName Title Date Page Klass

Тобто ми маємо тип, у якого характерним є те, що він містить у собі дані різних типів (поля). У свою чергу, поля можуть бути записами, так наприклад, ми могли б більш точно задати поле Date, розбивши його в свою чергу на поля Day (день), Month (місяць), Year (рік).

Для роботи з такими даними ми повинні у розділі змінних ввести довільні змінні, наприклад BookOld та BookNew типу Book і працювати з ними далі можна як і з звичайними змінними. Відмітимо, що крім доступу до змінних, ми ще можемо мати доступ і до окремих полів. Так, якщо нам, наприклад, потрібно зробити запис у поле Year, то це здійснюється при допомозі команди BookNew.Year := 1999. Як видно, ми спочатку вказуємо назву змінної, а потім, через крапку, назву поля.

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

Задача: 245 Скласти програму заповнення та редагування бази даних про домашній електронний телефонний довідник.

Розв’язання: Перед тим, як приступити до створення програми до поставленого завдання, ми повинні чітко усвідомити, які дані буде містити наша програма. Оскільки в задачі про це нічого не сказано, всю відповідальність покладено на нас.

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

Program demoRecord;

uses dos, crt;

const n = 10;

Name : array[1..n] of string[15] = ('Петренко','Козлюк',

'Василенко','Носенко','Деричуб','Вернигора',

'Котигорошко','Iвасюк','Iваненко','Коваленко');

Type Abonent = Record

FName : string[15];

Phone : integer;

end;

Var Klient : array[1..2*n] of abonent;

i, kol : integer;

o, m : byte;

Procedure NewKlient;

begin

inc(kol);

write('Прiзвище нового абонента: '); readln(Klient[kol].FName);

write('Телефон нового абонента: '); readln(Klient[kol].Phone);

writeln;

end;

Procedure EditKlient;

begin

write('Номер по списку абонента: '); readln(m);

if (m > kol) or (m<1) then writeln('Будьте уважнi!')

else begin

write('Новий телефон абонента: ');

readln(Klient[m].Phone);

end;

writeln;

end;

Begin

for i := 1 to n do

begin

Klient[i].Fname := Name[i];

Klient[i].Phone := Random(10001)+20001;

end;

kol := n;

writeln;

repeat

for i := 1 to kol do writeln(i:2,'. ',Klient[i].Phone,' - ',Klient[i].Fname);

writeln;

write('1-Новий абонент 2-Редагувати телефон 3-Закiнчити роботу');

readln(o);

if o = 1 then NewKlient;

if o = 2 then EditKlient;

until o > 2;

end.

Як видно з приведеного тексту програми, робота з записами не вимагає нічого аж занадто складного, просто потрібно уважно працювати з відповідними змінними, не забуваючи вказувати потрібні поля. Ще раз наголошуємо, що при створенні власних програм, що будуть працювати з записами найбільш відповідальним є момент створення структури самого запису. Уявімо собі таку ситуацію, що у запропонованому варіанті розв’язання останньої задачі ми захотіли ввести прізвище ’Недеридоверхуноса’. Прізвище цілком можливе у тому розумінні, що може зустрітися прізвище, у якому більше ніж 15 символів. Що ж буде у цьому випадку? Нічого такого, що могло б заставити програму видати повідомлення про помилку – просто у поле FName буде занесено значення ’Недеридоверхуно’. Як бачите, наша примітивна база даних поступила досить розумно – вона просто відкинула від прізвища “зайві” символи, тобто ніби укоротила прізвище. У нашому випадку це не становить нічого страшного, але у випадку солідної програми, що працює ну хоча б в банку, така ситуація просто недопустима. Тому на етапі проектування структури запису потрібно бути дуже уважним і передбачити всі крайні випадки. Більше того, у нашій програмі ми поле для номера телефону зробили типу Integer, тобто ми наперед свідомо “запрограмували” можливість помилок в роботі програми.

Давайте ще раз запустимо на виконання нашу програму і введемо нового абонента з довільним прізвищем і телефоном ’2–22–22’. Спробуйте, і побачите, що програма видасть помилку і перестане працювати. Як ви вже здогадались, це пов’язано з тим, що ми вводили значення типу String, а програма очікувала отримати дані типу Integer. Спробуйте самостійно і досконало розібратись з питанням захисту програми від помилок під час її роботи, а ми до цього питання повернемось у наступному параграфі.

Важливою особливістю записів є те, що звертання до полів запису є трохи громіздким, особливо при використанні довгих імен змінних та полів. Для розв’язання цієї проблеми в мові Паскаль передбачено використання оператора with, який дозволяє лише один раз вказавши змінну типу запис в операторі with працювати з іменами полів як з звичайними змінними.

Так, у приведеній вище програмі, замість послідовності операторів

...

Klient[i].Fname := Name[i];

Klient[i].Phone := Random(10001)+20001;

...

можна було б записати так:

...

with Klient[i] do

begin

Fname := Name[i];

Phone := Random(10001)+20001;

end;

...

Для кращого розуміння оператора with рекомендуємо самостійно модифікувати попередню програму, використавши в ній вказаний оператор.