Для осуществления более компактной записи программы и сокращения работы по описанию имен или цепочек имен записи, предусмотрен оператор присоединения 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
|
«поле N»: «тип N»;
|
«значение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.