Скачиваний:
29
Добавлен:
29.03.2016
Размер:
293.19 Кб
Скачать

Лабораторная работа №6 Структурные типы данных. Записи.

Введение

В лабораторной работе рассматривается работа с типом запись. Рассматриваются также некоторые методы работы с данным типом.

Тип запись

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

<идентификатор типа>=record <имя поля>:<тип поля>; <имя поля>:<тип поля>;

...

[<вариантная часть>]

end;

где <идентификатор типа> – правильный идентификатор; record – зарезервированное слово;

<имя поля> – правильный идентификатор, уникальный в пределах объявления типа запись;

<тип поля> – любой тип Object Pascal, в том числе и структурный. <вариантная часть> – необязательная часть записи, рассматривается ниже.

Рассмотрим пример объявления типа запись для описания информации о некоторой персоне.

type TPerson=record

 

name: string[12];

//имя

familia: string[16];//фамилия

Age: byte;

//возраст

end;

 

Значения переменных типа записи можно присваивать переменным того же типа. var a, b:TPerson;

begin

...

a:=b;

...

end.

Для того чтобы получить доступ к каждому из компонентов записи необходимо использовать составное имя. Для этого после имени переменной необходимо поставить точку и имя поля.

var a, b:TPerson;

begin

...

a.name:=’Иван’; a.familia:=’Иванов’; a.age:=18;

...

end.

Так как поле в типе запись может быть любого типа, в том числе и быть записью, то для таких полей необходимо продолжать уточнения, например

type TBirthDay=record Day, //день Month:byte;//месяц Year :word;//год end;

TPerson=record

name :string[12]; //имя familia:string[16]; //фамилия BirthDay:TBirthDay; //дата рождения end;

var Person:TPerson;

begin

...

Person.name:=’Иван’; Person.familia:=’Иванов’; Person.BirthDay.Day:=1; Person.BirthDay.Month:=1; Person.BirthDay.Year:=2000;

...

end.

Для упрощения доступа к полям записи можно использовать следующий оператор

with <переменная> do <оператор>;

где with, do – зарезервированные слова;

<переменная> – переменная типа запись, за которой, возможно следует список вложенных полей;

<оператор> – любой оператор Object Pascal.

Для примера перепишем фрагмент программы приведенный выше с использованием оператора with do.

var Person:TPerson;

begin

...

with Person do begin name:=’Иван’; familia:=’Иванов’; BirthDay.Day:=1; BirthDay.Month:=1; BirthDay.Year:=2000; end;

...

end.

В выше приведенном фрагменте можно применить еще раз оператор with do.

var Person:TPerson;

begin

...

with Person do begin name:=’Иван’; familia:=’Иванов’;

with BirthDay do begin Day:=1;

Month:=1;

Year:=2000; end;{BirthDay}

end;{Person}

...

end.

Использование типизированных констант

Возможно создание типизированных констант типа запись. Синтаксис объявления выглядит следующим образом:

(имя поля: значение; имя поля: значение; ... )

Например, для приведенных примеров записей, объявление констант будет выглядеть так

const cPerson:TPerson=(name: 'Иван'; familia: 'Иванов'; age: 15);

и так, соответственно

const cPerson:TPerson=( name: 'Иван'; familia: 'Иванов'; BirthDay: (

Day: 1;

Month: 1; Year: 2000));

Обратите внимание, что для вложенных записей значения задаются рекурсивно. Пример задания константы в виде массива записей.

const cPersons: array [0..2] of TPerson=(

(name:

'Иван';

familia:'Иванов';

BirthDay: (Day: 1; Month:1; Year: 2000)),

(name:

'Петр';

familia:'Петров';

BirthDay: (Day: 7; Month:3; Year: 2000)),

(name:

'Дмитрий';

familia:'Сидоров';

BirthDay: (Day: 21; Month:8; Year: 2000)));

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

Использование вариантных полей

Object Pascal разрешает использовать в записи так называемые вариантные поля. Синтаксис определения вариантных полей приведен ниже.

case <порядковый тип> of <значение>: ( <имя поля>:<тип поля>;

<имя поля>:<тип поля>;

...);

< значение >: ( <имя поля>:<тип поля>;

<имя поля>:<тип поля>;

...);

...

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

Пример использования записей с вариантной частью приведен ниже.

type TPerson=record

name :string[12]; //имя familia:string[16]; //фамилия case byte of//род занятий 0:( //первый вариант

Type_computer:string[20]; //компьютеры MByte:Integer;

Compatible:Boolean); 1: //второй вариант

Instrument: array[1..3] of string[10]; //музыка

end;

В данном примере определено два варианта: первый вариант предназначен для человека увлекающегося компьютерами, а второй для человека увлекающегося музыкой. Особенностью вариантных полей является то, что нельзя использовать одновременно поля для различных вариантов, т.к. им выделяется одна и та же область памяти. Вариантные поля обычно используют для хранения взаимоисключающей информации с целью экономии памяти. На месте ключа в конструкции case of может стоять любой встроенный или пользовательский порядковый тип. Выбор этого типа не имеет значения и, по сути, игнорируется компилятором.

Обращение к вариантным полям происходит также как и к обычным, например

var Person:TPerson;

begin

...

with Person do begin name:=’Иван’; familia:=’Иванов’; Type_computer:=’AMD Athlon’; MByte:=1024; Compatible:=true;

end;

...

end.

Ввод и вывод переменных типа запись

Для операций ввода-вывода для записей в Object Pascal не предусмотрено ни каких средств, поэтому ввод и вывод данных для записей необходимо реализовывать самостоятельно. Ниже приведен пример организации ввода и вывода записи.

Листинг 1 – Ввод записей

program InOutRec; {$APPTYPE CONSOLE} type TStudent=record

name :string[12]; //имя familia:string[16]; //фамилия gruppa :string[4]; //группа end;

var Student:TStudent; begin

writeln('Vvedite dannie');

//ввод записи

with Student do begin

Соседние файлы в папке ЛР по программированию FreePASCAL