ознаки
Описання типу запису в розглянутому прикладі може мати вид:
Приклад 11.4
Book = record
Author : FullName; {фіксована частина}
BookName: String;
BookCode: Code;
Station : (Readed, inFile, inArchive);
case Station of {поле ознаки}
Readed: Reader : FullName; {варіантна частина}
ReadCode : Integer;
ReadDate : Date;
inFile: FilAdress : Adress;
inArc : ArcName : Srting;
ArcAdress: Adress
end
end;
У нашому прикладі на варіанти вказує поле Station. У залежності від значення цього поля запис має ту чи іншу структуру. Це часта ситуація. Звичайно на варіант запису вказує одне з полів фіксованої частини цього запису. Тому синтаксисом допускається скорочення: опис компоненти, що визначає варіант, (яка називається полем ознаки – дискримінантом), включається в заголовок варіанта. У нашому прикладі 11.4 це виглядає так:
Type BookStation = (Readed, inFile, inArc);
Book = record
Author : FullName;
BookName : String;
BookCode : Code;
case Station : BookStation of
Readed : Reader : FullName;
ReadCode : Integer;
ReadDate : Date;
inFile : FilAdress: Adress;
inArc : ArcName : String;
ArcAdress: Adress
end
end;
Всі імена полів повинні бути різними, навіть якщо вони зустрічаються в різних варіантах. (Наприклад, Author, Reader – імена людей, а FilAdress і ArcAdress – адреси, що вказують на місцезнаходження книги на полках сховища). У випадку, коли один з варіантів не містить варіантної частини, він повинен бути оформлений наступним чином:
EmptyVariant :( ) {EmptyVariant - мітка порожнього варіанта}
11.4. Оператор приєднання
Якщо А – змінна типу Student із приклада 11.1, її значення можна змінити групою операторів:
A.F1 := ' Іванов '; A.F2 := ' Ілля '; A.F3 := 'Інокентійович ';
A.Day := 14; A.Month := 9; A.Year := 1976;
A.StudDoc := 123;
Приведені вище позначення можна скоротити за допомогою оператора приєднання. Заголовок цього оператора відкриває область дії “внутрішніх” імен полів запису, які можуть бути використані як імена змінних.
Оператор приєднання має вид:
With <змінна-запис > {,<змінна-запис >} do < оператор >
Приклад 11.5
with A do begin
F1 := ' Іванов ';
F2 := ' Ілля ';
F3 := ' Інокентійович ';
Day := 14;
Month := 9;
Year := 1986;
StudDoc := 123;
end { оператора with }
Більш того, в групі операторів обробки змінної StudGroup[i] (приклад 11.3) запис може бути сформований наступним чином:
With StudGroup[3], StudName do begin
Name1 := ' Івченко ';
Name2 := ' Інна ';
Name3 := ' Іванівна ';
BirthDay.Day := 14;
BirthDay.Month := 9;
BirthDay.Year := 1976;
StudDoc := 123
end;
Таким чином, оператор виду
With r1,...,rn do S
еквівалентний оператору
With r1 do with r2 ... with rn do S.
Зауваження: В операторі With R do S вираз R не повинен містити змінні, що змінюються в операторі S. Наприклад, оператор With S[j] do j := j+1 недопустимий!
Приклад 11.6. Як приклад розглянемо програму, яка оброблює масив записів, кожен з яких містить відомості про людину, необхідні для зв’язка з ним по пошті. Обробка запису полягає у пошуку всіх осіб, які народилися в даний день.
Запис має вид:
Повне ім’я (Прізвище Ім’я по батькові)
День народження (День, Місяць, Рік)
Адреса (Індекс, Країна, Місто, Вулиця, № будинку, № квартири)
Program Adress;
Const
n = 100;
Type
{ описання типів Name, FullName, Date із приклада 3 }
Mail = Record
Index : LongInt; { довге (4 байта) ціле число }
Country,
Sity,
Street : Name;
House,
Flat : Integer
end;
Person = Record
Who : FullName;
When : Date;
Where : Mail
end;
Var
Today : Date;
Department : array [1..N] of Person;
i : Integer;
Function theSame(var X : Date, var Y : Person): Boolean;
Begin
With Y, When do
theSame := (X.Day = Day) and (X.Month = Month)
End;
{Procedure ReadDepartment - введення масиву записів}
Procedure ReadDate(var Z : Date);
Begin
With Z do Read(Day, Month)
End;
Procedure WriteMail(var X : Person);
Begin
With X, Who do Writeln(Name1, ' ', Name2, ' ', Name3);
With X, Where do begin
Writeln(Street, ' ',House, ' ', Flat);
Writeln(Index, ' ', Sity, ' ', Country);
end
End;
Begin
ReadDepartment; { введення масиву записів}
ReadDate(Today);
For i := 1 to N do
if theSame(Today, Department[i])
then WriteMail(Department[i])
End;
11.5. Рядки і засоби їх обробки
Значенням рядкового типу даних є рядки. Стандарт мови передбачає використання рядків тільки як констант, що використовуються в операторах виведення Write, Writeln. У розширенні мови Turbo-Pascal рядковий тип даних визначений більш повно.
Визначення рядкового типу слідує діаграмі:
Тут ціле належить діапазону 1..255 і означає максимальну кількість символів у рядку цього типу. Якщо описання типу String використовується без вказівки максимальної кількості символів, це (за замовченням) означає, що під цей тип резервується 255 символів.
Наприклад:
Type
Name = String[20]; { рядки з 20-ти символів }
Post = String; { рядки з 255-ти символів }