Слайд 1ПРОЦЕДУРЫ И ФУНКЦИИ
При разработке алгоритма программы часто возникает ситуация, когда
отдельные ее фрагменты неоднократно повторяются в различных ее частях. Эти
фрагменты полностью идентичны с точки зрения написания операторов и различаются лишь фактическими значениями участвующих в вычислениях данных.
Следовательно, эти фрагменты программы являются логически обособленными и их можно оформить в виде особых относительно самостоятельных программных единиц, обладающих собственным именем, – процедур или функций
Слайд 2
Использование процедур и функций позволяет сделать программу более компактной и
понятной с точки зрения визуального восприятия текста и уменьшить область
памяти, занимаемою программой. Упоминание в тексте программы имени процедуры или функции называется вызовом процедуры (функции).
Слайд 3Локализация имен
Вызов блока происходит при обращении к нему по имени.
Любое имя в Паскале должно быть предварительно описано. Следовательно, все,
используемые в программе, процедуры и функции должны быть описаны в разделе описаний.
Описать блок – это значит указать его имя и тело. В заголовке указывается имя блока и приводится список его формальных параметров. Для функции еще указывается ее тип, т.е. тип возвращаемого параметра.
Слайд 4Локальные и глобальные переменные
Procedure B11
Var v5
Procedure
B1
Var v4
Procedure B
Var v3
Procedure A
Var
v2
Program
Var v1
BEGIN ……………………..END.
Слайд 5Все имена, описанные внутри блока, локализуются в нем, т.е. невидимы
снаружи. В приведенном примере из основной программы можно обратиться к
блокам А, В, но нельзя вызвать какую либо из процедур, находящихся внутри них (В1). Это относится не только к именам блоков, но и к любым именам, объявленным в них.
При входе в блок нижнего уровня становятся доступными не только имена, локализованные в нем, и имена верхних уровней. Из блока В11 можно обратиться к блокам А, В, В1 и использовать имена, объявленные в них и в основной программе – V1,V3,V4.
Слайд 6Program.............
Var V1 .....
Procedure A;
Var
V2 .......
..............
End {A}
Procedure B;
Var V3 .......
Procedure B1;
Var V4 .......
Procedure B11;
Var V5 .......
................
Из блока В11 доступны четыре переменные V1, V3, V4, V5.
Из блока В1 доступны - V1, V3, V4.
Из блока В доступны - V1, V3.
Из блока А доступны - V1, V2.
Из основной программы – только V1.
Слайд 7Имена, локализованные в блоке, могут совпадать с глобальными именами. В
этом случае, локальное имя «накрывает» глобальное имя внутри блока и
делает его недоступным.
Var
i:integer;
Procedure P;
Var
i:integer;
begin
writeln(i);
end {P};
BEGIN
i:=1;
P;
END.
Слайд 8Результат действия этой программы непредсказуем, т.к. локальное имя «i» накрывает
глобальное «i» и в самой процедуре Р оно только объявлено,
но ему не присвоено никакого значения.
Если убрать из процедуры Р описание
i:integer;
то программа выведет на экран значение глобальной переменной i=1.
Одноименные локальные и глобальные переменные – это разные переменные.
Слайд 9 Синтаксис написания заголовка блока следующий –
Procedure [(
формальных параметров>)]
Function [()]:
Список формальных параметров может
быть опущен. Если же формальные параметры присутствуют, то должен быть указан их тип.
Function ABC(a:integer; b:real): real;
или
Function ABC1(a, b:real): real;
В пределах блока список формальных параметров является как бы расширением раздела описаний данного блока.
Слайд 10Допустим, что в основной программе мы дважды обращаемся из разных
мест к функции
ABC(a:integer; b:real): real.
Вызовы имеют
вид
ABC(s,t) и
ABC(u,r) .
Это означает, что при первом обращении формальные параметры a, b замещаются фактическими переменными s, t, и при втором обращении - u, r.
Это замещение происходит в заголовке функции момент обращения к ней.
Слайд 11
ABC(a:integer; b:real): real.
Вызовы имеют вид
ABC( s, t )
и
ABC( u, r )
Слайд 12
Рассмотрим операцию возведения в степень
Слайд 13Function Power(a,b:real):real
Program PowerDen
Var
x,y:real;
{------------------}
Function Power(a,b:real):real;
Begin {Power}
Power:= exp(b*ln(a));
End {Power};
{------------------}
BEGIN {main}
readln(x,y);
writelh(‘Power=’, Power(x,y));
END.
Слайд 14Procedure
Power1(var a,b,c:real);
Program PowerDen1;
Var
x,y,s:real;
{------------------}
Procedure Power1(var
a,b,c:real);
Begin {Power1}
c:= exp(b*ln(a));
End {Power1};
{------------------}
BEGIN {main}
readln(x,y);
Power1(x,y,s);
Writelh(‘Power=’, s);
END.
Слайд 15Program PowerDen2;
Var
x,y,c:real; {c – глобальная переменная}
{------------------}
Procedure Power2( a,b:real);
Begin {Power1}
c:= exp(b*ln(a));
End {Power1};
{------------------}
BEGIN {main}
readln(x,y);
Power2(x,y);
Writelh(‘Power=’, c);
END.
Procedure
Power2(var a,b,c:real);
Слайд 16При работе с функциями результат вычислений внутри самой функции присваивается
идентификатору функции. В данном примере - это Power.
В варианте
с использованием процедуры результат передается в основную программу через список переменных.
Третий вариант вычислений – переменную «с» объявить в основной программе и использовать в блоке как глобальную переменную.
Списки формальных (в блоке) и фактических (в вызове) параметров должны строго соответствовать друг другу по своему типу и порядку следования.
Слайд 17Параметр-переменная и параметр-значение.
Существует два способа задания параметров в блоке: параметр-переменная
и параметр-значение.
Procedure P1(a,b,c : real);
Procedure P2(var a,b :
real; c : real);
В первом случае все параметры объявлены как параметры-значения, а во втором - a,b объявлены как параметры-переменные.
Вариант объявления переменной существенен только для вызывающей программы.
Слайд 18
Если формальный параметр объявлен как параметр-переменная, то при вызове ему
должен соответствовать фактический параметр в виде переменой того же типа.
Если формальный параметр объявлен как параметр-значение, то при вызове ему может соответствовать произвольное выражение.
Разница в этих двух вариантах объявления параметров заключается в механизме замещения формальных параметров фактическими параметрами.
Слайд 19Если формальный параметр объявлен как параметр-значение, то перед вызовом блока
это значение вычисляется, полученный результат помещается во временную память и
передается блоку. Даже если в качестве фактического параметра указана просто переменная или константа, в блок передается только ее копия.
Если формальный параметр объявлен как параметр-переменная, то при вызове блока передается сама переменная, а не копия.
Любые возможные изменения параметра-значения в блоке никак не скажутся на вызывающей программе, а при использовании параметра-переменной эти изменения передадутся в вызывающую программу, т.к. приводят к изменению фактической переменной вызывающей программы.
Слайд 20Function Power(a,b:real):real
Program PowerDen
Var
x,y,z:real;
{------------------}
Function Power(var a,b,c:real):real;
Begin {Power}
Power:= exp(b*ln(a));
c:=a+10;
End {Power};
{------------------}
BEGIN {main}
readln(x,y);
writelh(‘Power=’, Power(x,y,z));
END.
Слайд 21Program Proba;
………………
a:=5;
b:=7;
{-------------}
Procedure Pr1(var a
: integer; b : integer)
begin{Pr1}
a:=a+a;
b:=b+b;
writeln('удвоение', a:5, b:5);
end{Pr1};
{-------------}
BEGIN
Writeln('исходное', a:5, b:5);
Pr1(a,b);
writeln('результат', a:5, b:5);
END.
Исходное 5 7
Удвоение 10 14
Результат 10 7
Слайд 22Параметры-переменные используются для передачи данных из блока в вызывающую программу.
Другой способ передачи данных – через глобальные переменные. Но при
этом нужно быть очень внимательным, чтобы случайно не испортить фактические переменные в вызывающей программе. Некоторым недостатком является невозможность использовать в вызове блока в качестве фактического параметра какое-либо выражение.
При использовании параметров-значений следует избегать в объявлении больших массивов данных, т.к. в этом случае нерационально используется память и время на создание их копии.
Слайд 23Параметры-массивы и параметры-строки.
Существует различие в объявлении формальных параметров блока в
заголовочном списке и в разделе описаний блока. Через список можно
объявлять только стандартный или ранее объявленный тип. Объявление
Procedure SS(a:array [1..10] of real);
неверно!
Следует сначала объявить переменную Mas как массив
Type
Mas=array [1..10] of real;
затем в списке формальных переменных объявить параметр a как тип Mas.
Procedure SS(a : Mas);
Слайд 24
При использовании в качестве формального параметра символьной строки следует сначала
объявить тип строки, (поскольку строка является своего рода массивом символов).
Type
intype
= string [15];
outtype = string [30];
Function PP(s1 : intype) : outtype;