Оператор присоединения

Для осуществления более компактной записи программы и сокращения работы по описанию имен или цепочек имен записи, предусмотрен оператор присоединения With.

Синтаксис записи данного оператора:

With «префикс» do

«оператор»;

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

Пример:

Type

Trec=record

I:integer;

F:real;

End;

Var

Rec1,Rec2:Trec;

:

Rec1.i:=2;

Rec1.f:=5,5;

Или

With Rec1 do

Begin

I:=2;

F:=5,5;

End;

При использование with для доступа к вложенным записям префикс-список имен записей, разделенных запятыми или точками, при этом порядок перечисление имен должен соответствовать уровню вложенности.

Перечисление имен через запятую является мене строгим поскольку

Внутри оператора with возможно обращаться к полям всех уровней в соответствии с перечислением. Перечисление через точку позволяет обратиться только к одному уровню соответствующему перечислению (нижнему уровню иерархии).

1. With S,name do

Begin

First:=’Петров’;

last:=’Петр’;

HomeName:=255;

End;

2. With S.name do

Begin

First:=’Петров’;

last:=’Петр’;

HomeName:=255;

End;

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

Пример:

Var

Rec1:record

I,j:byte;

Rec2:record

I,k:byte;

End;

End;

…..

With Rec1,Rec2 do

Begin

I:=20;

J:=5;

K:=5

End;

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

Согласованность имен полей записи с именами переменных программы.

Имена полей одной или нескольких записей могут совпадать с именами других записей или именами переменных основной программы отсюда следует, что при использование оператора with работа с такими одноименными данными может привести к не определенностям. Присваивание z1:=z2 не выполнится в случае отсутствия совместимости:

1. Если одна из переменных типа записи определена через тип, а другая в разделе var

2. Если каждая переменная, описана в разделе Var отдельным объявлением, даже если точно идентичные поля

Пример:

Var

z1:record

…..

End;

z2:record

…..

End;

….

z1:=z2;

Вариантные записи.

Основная идея такой записи – находясь в рамках одной структуры определить в ней несколько альтернативных записей. В общем случае такая запись состоит из двух частей: фиксированной и вариантной.

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

Синтаксис описание вариантной записи

Type

«имя типа»=record

Фиксированная часть
«поле 1»: «тип 1»;

«поле N»: «тип N»;

Вариантная часть
Case «имя переменной»: «тип» of

«значение1» («Поле 1.1»: «тип 1.1»; «Поле 2.1»: «тип 2.1»;);

«значение2» («Поле 1.1»: «тип 1.1»; ….);

……………….

«значение K» («Поле 1.k»: «тип 1.k»; ………..);

End;

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

Пример:

Type

Priznak = (student,teacher);

Member = record

Name: string[40];

Age:byte;

Case st: priznak of

Student: (group: string[7]; kurs:byte);

Teacher: (chair: string [20]; post: string[20]);

End;

Var

Memb:member;

Begin

……

With memb do

Begin

Name:= ‘Петров’;

Age:=20;

St:=Student;

Group:=’АСУ’;

Kurs:=2;

Все поля вариантной части располагаются в одном и том же месте памяти при их хранении. Размер этой памяти определяется самым объемным из вариантов. В нашем случае этим вариантом является вариантTeacher, который занимает 42 байта. В целом запись будет занимать 85 байт.

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

Замечание:

1. Не рекомендуется работать одновременно с несколькими вариантами одной вариантной записи.

2. Поле признака следует определять одним из конкретных значений поскольку это значение информирует о том с каким вариантом эта работа производится (хотя возможно обратится к различным вариантам и без определения поля признака, что не желательно). Следует считать что в любой момент времени доступными являются поля одного из вариантов. Продолжим пример:

Writeln (memb.group); ‘АСУ’

Writeln (memb.age); 20

Memb.st:=teacher;

Writeln (memb.post); ‘’

Writeln (memb.chair); ‘АСУ’

В следствие особого хранения полей вариантов возможно наложение полей одних вариантов на другие.

Продолжая пример, сделаем некоторые операции заполнения полей второго варианта, после чего обратимся к записям первого варианта:

With memb do

Begin

Post:=’доцент ’;

Chair:=’системотехника ’;

Writeln(chair);

Writeln (post);

St:=student;

Writeln(kurs); ‘т’ – #226(следует)226

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

Достоинство:Значительная экономия памяти под запись в целом.

Недостаток: строгий контроль за обращением к разным вариантам записи.

Процедуры и функции

Лекция №3

Подпрограммы. Процедуры. Определение процедур. Подпрограммы. Глобальные и локальные переменные. Формальные и фактические параметры подпрограмм. Параметры-значения, параметры-переменные, параметры-константы. Функции. Определение функций. Структурированные типы данных в качестве параметров подпрограмм.

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

Процедуры.

Синтаксическое описание

Procedure «имя»(«список формальных параметров»);

Label

Const

Type

Var

Begin

«тело процедуры»;

End.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: