Объекты, описанные внутри блока, являются по отношению к нему локальными и не доступны внешним блокам.
Формальные параметры являются локальными переменными в пределах данной подпрограммы.
Объекты, описанные во внешнем блоке доступны и могут быть использованы в любом его подблоке, т.e. они являются глобальными.
Пример.
procedure t1; var y1, y2: real; procedure sq1; var a, b, c, d: real; begin { Переменные a, b, c, d являются локальными для sq1, область их действия – процедура sq1 } …………………………………… end; begin { Переменные y1, y2 - нелокальные для sq1, область их действия – t1 и sq1 } end;
Локальные переменные, описанные в подпрограмме прекращают свое существование после работы подпрограммы. (Память выделенная под них в начале работы очищается)
Все что описано выше блока (подпрограммы) в основной программе будет видно и может быть использовано в этом блоке. Поэтому, чтобы не нарушать принцип локальности и не допустить ошибок в случае совпадений имен переменных, лучше поместить раздел описаний переменных (Var) ниже всех подпрограмм.
31.Способы передачи параметров в подпрограммы.
Механизм передачи параметров в процедуры:
1. В момент вызова процедуры выделяется память под переменные процедуры.
2. Формальные параметры получают значения фактических.
3. Связь между параметрами и значениями разрывается.
4. Процедура завершила работу – память освобождается.
Передача параметров различных видов
1. При вызове подпрограммы в формальные параметры-значения передаются копии фактических. Далее связь между фактическими и формальными параметрами прерывается.
2. При вызове подпрограммы в формальные параметры-переменные передаются адреса фактических параметров переменных. Фактическое значение по указанному адресу меняется – реализуется возврат значений.
3. При вызове подпрограммы в формальные параметры-константы передаются адреса фактических параметров. Фактическое значение по указанному адресу не меняется. Экономим память и гарантируем сохранение значений исходных данных.
4. Бестиповые параметры передаются по адресу. Перед использованием бестиповых параметров требуется выполнить приведение формального бестипового параметра к какому-либо типу.
5. При вызове подпрограммы на место формальных параметров-процедур и параметров-функций осуществляется подстановка имен соответствующих фактическим параметрам процедур и функций
32.Рекурсивное описание процедур и функций.
Объект называется рекурсивным, если он содержит сам себя или определен через самого себя.
Рекурсия в программировании – один из важнейших принципов посторения подпрограмм, когда процедуры и функции могут вызывать сами себя.
Наличие условия в теле рекурсивной функции (или процедуры), при котором она больше себя не будет вызывать, очень важно. В противном случае, как и в ситуации с циклами, может произойти так называемое зацикливание.
Существует два вида рекурсий:
1. Прямая рекурсия – подпрограмма вызывает саму себя.
function power (x:real; n:integer):real; begin if n=0 then power:=1 else if n mod 2=0 then power:=power (x*x,n div 2) else power:=x*power (x*x, n div 2);
end; var y:real; begin y:=power (2,5); writeln (y:2:2); readln; end.
Рекурсивные вызовы :
Power (2,5)=2*power (4,2)=2*power (16,1)=2*16*power (256,0)=2*16*1=32
2. Косвенная рекурсия – опережающее описание (a вызывает b, b вызывает a).
Приведем пример программы, иллюстрирующей косвенные рекурсивные вызовы процедур. В этой программе процедуры Rec1 и Rec2 рекурсивно вызывают друг друга, поочередно уменьшая свои фактические параметры. Легко видеть, что обе процедуры работают с одной глобальной переменной А, которая передается в них по ссылке. Критерием завершения работы является обращение этой переменной в ноль.
Обратите внимание, что в программе необходимо предварительное определение второй процедуры Rec2, так как ее вызов встречается в процедуре Rec1, т.е. перед ее полным описанием.
Program KosvRecurs; Var A : integer; Procedure Rec2 (Var Y:integer); Forward; Procedure Rec1 (Var X:integer); Begin X := X-1; if X>0 then Rec2; writeln (X) End; Procedure Rec2 (Var Y:integer); Begin Y := Y div 2; if Y>2 then Rec1; writeln (Y) End; Begin A := 15; Rec1(A); End.
Косвенная рекурсия используется при описании типа указатель на запись (в которой находится поле - указатель на такую же запись).