Зміст вступ 5
Вид материала | Документы |
§ 11.2 Записи |
- Зміст, 429.02kb.
- Зміст, 329.83kb.
- Зміст вступ, 361.97kb.
- Зміст, 242.29kb.
- Зміст, 384.58kb.
- Зміст, 410.71kb.
- Зміст вступ, 388.95kb.
- Зміст перелік скорочень, 569.12kb.
- Зміст вступ, 540.64kb.
- Зміст Вступ, 574.44kb.
§ 11.2 Записи
Досить часто в повсякденному житті ми маємо справу не з одним видом інформації, а з комбінацією деяких видів інформації. Як приклад можна привести:
- телефонні довідники, де розміщено відомості про абонентів (прізвище, ім’я, по батькові, адреса, номер телефону);
- медична картка з різноманітними записам про пацієнта, але більшість з них співпадають (прізвище, ім’я, по батькові, дата народження, адреса, вага, зріст);
- облікова картка володаря автомобіля (марка автомобіля, державний та заводський номери, дата проходження технічного огляду, колір) і т.д.
У програмуванні подібні однотипні записи прийнято називати записами. Запис – це структурований тип даних, який об’єднує в собі різнотипні елементи, які називають полями запису. Запис описується спеціальною конструкцією, яка розпочинається словом Record. Наприклад, для ведення власного бібліотечного каталогу можна було б використати таку конструкцію:
Type { розділ опису типів}
Book = Record { початок запису }
AuthorFamile : string[20]; { прізвище автора }
AuthorName : string[15]; { ім’я автора }
Title : string[90]; { назва книги }
Date : word; { рік видання }
Page : integer; { кількість сторінок }
Klass : byte; { для визначення тематики книги }
End; { кінець запису }
Описаний тип можна графічно представити так:
Book
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 рекомендуємо самостійно модифікувати попередню програму, використавши в ній вказаний оператор.