Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
паскаль.doc
Скачиваний:
7
Добавлен:
25.09.2019
Размер:
222.21 Кб
Скачать

4. Записи

Запись - наиболее общий и гибкий структурированный тип в Паскале.

Запись состоит из фиксированного числа компонентов, называемых полями, которые могут быть различных типов. Этим запись существенно отличается от массива, все компоненты которого должны быть одного и того же типа и доступ к компонентам осуществляется не по индексам (номерам), а по именам.

Пример: Type   Date = Record     Year: Integer;     Month: 1..12;     Day: 1..31;   End;   Book = Record     Title: String [40];     Author: String [50];     Entry: Date;   End; Var   D1: Date;   B: Book;

В Паскале разрешено использовать массивы записей. Записи также можно использовать в качестве компонент файлов. Однако поля записи не могут быть файлового типа. Чтобы обратиться к отдельной компоненте записи необходимо задать имя записи, за ним точку и сразу за точкой написать название нужного поля.

Пример1: D1.Day:=25; B.Author:= "Levy"; B.Entry.Year:= 1980;

а можно и

B. Entry: = 1980; так как Year первое поле Date.

Пример2: В памяти находится массив из 1000 элементов, каждый из которых имеет тип записи Book. Определить количество книг, год издания которых меньше или равен 1600 году. Для каждого из таких элементов массива распечатать название книги, имя автора, год издания:

Program Rarity; Type Date = Record . . . . . . . . . . . End; Book = Record . . . . . . . . . . . End; Var   S, I: Integer;   Mas: Array[1..1000] Of Book; Begin   S:= 0;   For I:= 1 To 1000 Do     If Mas[I].Entry.Year <= 1600 Then     Begin       Write (Mas[I].Title,}' , ',Mas[I].Author,',' , ',Mas[I].Entry.Year: 6);       S:= S+1;     End;    Writeln ('Число Книг' , S: 4); End.

Оператор присоединения With. Можно сократить длинные обозначения элементов записи:

With имя записи Do оператор.

Оператор With открывает область действия, содержащую имена полей указанной переменной типа записи так, что эти имена фигурируют в качестве имён переменных. Кроме экономии места при написании программ, оператор With экономит так же время при выполнении программы, так как ссылка на запись подготавливается только один раз.

Пример: With B Do Begin   Title: = ' ... ';   Author:= ' ... '; End; эквивалентно B.Title: = ' ... '; B.Author:= ' ... ';

5. Запись с вариантами

Вариантная часть начинается со слова Case. Это означает, что в записях можно задавать тип, содержащий определения нескольких вариантов структуры. Различие может касаться как числа компонент, так и их типов. Запись может содержать только одну вариантную часть (экономия памяти). Вариантная часть сама может содержать варианты (вложения). Пример: Type   N = String [20];   Status = (Женат, Вдов, Разведён, Холост);   Date = Record      Mo: 1..12;      Day: 1..31;      Year: Integer;   End;   Person = Record     Name: N;     Sex: (Муж, Жена);     Birth: Date;     Case Ms: Status Of     Женат, Вдов: (MDate: Date);     Разведён: (Date: Date; First: Boolean);     Холост: (Indept: Boolean);   End.

Замечательная особенность - наложение в памяти вариантных полей, то есть дополнительная возможность преобразования типов:

Var   M = Record   Case Byte Of     0: (By: Array[0..3] Of Byte);     1: (Wo: Array[0..3] Of Word);     2: (Lo: Longint);   End; . . . . . . . . . . . . . . With M Do Begin   Lo: . . . . . .;   If By [3] = 2 Then ... ;

Case Of, открывающее вариантную часть не имеет ничего общего с ветвлением Case Of; в данном случае это директива компилятору, сигнализирующая о том, что последующие поля нужно разместить начиная с одной и той же ячейки памяти, поэтому, если изменяется одно из полей - вариантов, изменяются и все остальные. Поле выбора должно быть порядкового типа.

В Турбо-Паскале, в отличие от классики, переменной, описанной в поле ключа выбора, можно присваивать значения, но это ни как не влияет на выбор поля. Значения констант выбора могут быть произвольными и даже повторяющимися. Вместо поля выбора можно иставить лишь идентификатор какого - либо типа, но в таком случае в программе невозможно будет узнать, каким из альтернативных полей используется память, а значит и то, значение какого типа там лежит, но это не всегда и нужно.

Пример: Type   Rec1 = Record     A: Byte;     B: Word;   End;   Rec2 = Record     C: Longint;     Case X: Byte Of       1: (D: Word);       2: (E: Record);       Case Boolean Of         3: (F: Rec1);         3: (G: Single);         '3': (C: Word);       End;     End; Var   2: Rec2    . . . . . . . . . . R.X: = 255; If R.E.G = 0 Then   Writeln (0K) Else   Writeln (R.E.G); Имена полей должны быть уникальными в пределах той записи, где они объявлены, однако если записи содержат поля-записи то есть вложены одна в другую, имена могут повторяться на разных условиях вложенности.