Тип "Запись" (Record) и оператор присоединения With - Записи в Турбо Паскале

Запись - это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов. Определение типа записи начинается идентификатором record и заканчивается зарезервированным словом end. Между ними располагается список компонентов, называемых полями, с указанием идентификаторов полей и типа каждого поля. Тип "запись" определяется конструкцией

RECORD

Поле1: ТипПоля1;

Поле2: ТипПоля2;

ПолеМ : ТипПоляМ

END;

Если тип нескольких полей совпадает, то имена полей могут быть просто перечислены, например:

Type

PointRecType = record x, y: Integer end;

Пример.

Type

Car=Record

Number:

Integer;

{Номер}

Marka:

String[20];

{Марка автомобиля}

FIO:

String[40];

{Фамилия, инициалы владельца}

Address:

String[60];

{Адрес владельца}

End;

Var

M, V: Car;

В данном примере запись Car содержит четыре компонента: номер, название марки машины, фамилию владельца и его адрес. Доступ к полям записи осуществляется через переменную типа "запись". В нашем случае это переменные М и V типа Car.

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

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

Например, чтобы получить доступ к полям записи Car надо написать:

M. Number, M. Marka, M. FIO, M. Address.

Составное имя можно использовать везде, где допустимо применение типа поля. Для присваивания полям значений используется оператор присваивания.

Пример.

M. Number:=1678;

M. Marka:= 'Газ_24';

M. FIO:='Иванов И. И.'

M. Address:='ул. Пушкина 12-31';

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

Read(M. Number, M. Marka, M. FIO, M. Address);

Write(M. Number:4, M. Marka:7, M. FIO:12, M. Address:25);

Допускается применение оператора присваивания, и к записям в целом, если они имеют одинаковый тип. Например, V := М;

После выполнения этого оператора значения полей записи V станут равными значениям соответствующих полей записи М.

В ряде задач удобно пользоваться массивами из записей. Их можно описать следующим образом:

Type

Person= record

FIO: string[20];

Age : 1..99;

Prof: string[30];

End;

Var

List: array[1..50] of Person;

Обращение к полям записи имеет несколько громоздкий вид, что особенно неудобно при использовании мнемонических идентификаторов длиной более пяти символов. Для решения этой проблемы в языке Pascal предназначен оператор with, который имеет следующий формат

With ИмяПеременной_Записи DO Оператор;

Указав один раз переменную типа запись в операторе with, можно работать с именами полей как с обычными переменными, т. е. без указания перед идентификатором поля имени переменной, определяющей запись.

Пример: Присвоить значения полям записи Саг с помощью оператора with

With M do

Begin

Number:=1678;

Marka:= 'Газ_24';

FIO:='Петров В. И.'

Address:='ул. Остужева 2-31';

End;

Внутри области действия оператора with могут указываться и переменные, не имеющие отношения к записи. Но в этом случае надо следить, чтобы они не совпадали по написанию с полями записи.

PROGRAM MAIN;

Var

X, Y: Integer;

RecXY: record X, Y: Integer end;

Begin

X: =10; Y: =20;

{ значения переменных X и Y }

With RecXY do begin

{ работаем с записью RecXY }

X: = 3.14 * X;

{Где какой X и Y? }

Y: = 3.14 * Y

End; {with}

End.

Действия внутри оператора with проводятся только над полями записи RecXY. Чтобы сохранить оператор with и "развязать" имена X и Y, надо к переменным X и Y приписать так называемый квалификатор - имя программы или модуля (UNIT), в которой они объявлены (для этого программа должна иметь заголовок). Так, оператор присоединения можно исправить следующим образом:

With RecXY do begin

X: = 3.14 * Main. X;

Y: = 3.14 * Main. Y

End;

И проблема исчезнет.

В Pascal допускает вложение записей (т. е. поле записи само является записью), соответственно оператор with тоже может быть вложенным.

With RV1 do

With RV2 do

With RVn do...

Что эквивалентно конструкции

With RV1, RV2, ..., RVn do...

Уровень вложенности записей не должен превышать 9.

Пример 1. Создать программу, для решения следующей задачи: Пусть дана ведомость абитуриентов, сдавших вступительные экзамены в институт. определить фамилии абитуриентов, начинающиеся с буквы А, и набравших средний балл не менее 4. Вывести на печать фамилию абитуриента и его средний балл.

Программа выглядит следующим образом:

Program Abt;

Uses CRT;

Const M=15;

Type T=record

Fio :string[10];

Ocn :array[1..3] of integer;

end;

Var

Spisok :T;

Kol :integer;

N :integer;

Bal :real;

I :integer;

Begin

Clrscr;

Kol:=0;

Write('Введите количество абитуриентов :');

Readln(N);

For i:=1 to N do

With Spisok do

Begin

Write('Введите ФИО :');readln(Fio);

Write('Введите Оценку 1 :');readln(Ocn[1]);

Write('Введите Оценку 2 :');readln(Ocn[2]);

Write('Введите Оценку 3 :');readln(Ocn[3]);

Bal:=(Ocn[1]+Ocn[2]+Ocn[3])/3;

If (Bal>=4.0) and(Fio[1]='А') then begin kol:=kol+1;

Writeln('Абитуриент ',Fio:10,' средний балл ',bal:6:2);end;

Writeln;

End;

If kol=0 then writeln('Абитуриентов, отвечающих данным условиям нет');

Readln;

End.

Результат работы:

Введите количество абитуриентов :3

Введите ФИО :Иванов

Введите Оценку 1 :4

Введите Оценку 2 :5

Введите Оценку 3 :4

Введите ФИО :Антонов

Введите Оценку 1 :4

Введите Оценку 2 :3

Введите Оценку 3 :4

Введите ФИО :Акунин

Введите Оценку 1 :4

Введите Оценку 2 :5

Введите Оценку 3 :5

Абитуриент Акунин средний балл 4.67

Похожие статьи




Тип "Запись" (Record) и оператор присоединения With - Записи в Турбо Паскале

Предыдущая | Следующая