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

Содержание

Слайд 2

Использование процедур и функций позволяет сделать программу более компактной и понятной

Использование процедур и функций позволяет сделать программу более компактной и понятной

с точки зрения визуального восприятия текста и уменьшить область памяти, занимаемою программой. Упоминание в тексте программы имени процедуры или функции называется вызовом процедуры (функции).
Слайд 3

Локализация имен Вызов блока происходит при обращении к нему по имени.

Локализация имен

Вызов блока происходит при обращении к нему по имени.
Любое

имя в Паскале должно быть предварительно описано. Следовательно, все, используемые в программе, процедуры и функции должны быть описаны в разделе описаний.
Описать блок – это значит указать его имя и тело. В заголовке указывается имя блока и приводится список его формальных параметров. Для функции еще указывается ее тип, т.е. тип возвращаемого параметра.
Слайд 4

Локальные и глобальные переменные Procedure B11 Var v5 Procedure B1 Var

Локальные и глобальные переменные

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.
Слайд 6

Program............. Var V1 ..... Procedure A; Var V2 ....... .............. End

Program.............
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» и в самой процедуре Р оно только объявлено, но ему не присвоено никакого значения.
Если убрать из процедуры Р описание
i:integer;
то программа выведет на экран значение глобальной переменной i=1.
Одноименные локальные и глобальные переменные – это разные переменные.
Слайд 9

Синтаксис написания заголовка блока следующий – Procedure [( )] Function [(

Синтаксис написания заголовка блока следующий –
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 )

ABC(a:integer; b:real): real.
Вызовы имеют вид
ABC( s, t ) и


ABC( u, r )
Слайд 12

Рассмотрим операцию возведения в степень

Рассмотрим операцию возведения в степень

Слайд 13

Function Power(a,b:real):real Program PowerDen Var x,y:real; {------------------} Function Power(a,b:real):real; Begin {Power}

Function 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.
Слайд 14

Procedure Power1(var a,b,c:real); Program PowerDen1; Var x,y,s:real; {------------------} Procedure Power1(var a,b,c:real);

Procedure 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.
Слайд 15

Program PowerDen2; Var x,y,c:real; {c – глобальная переменная} {------------------} Procedure Power2(

Program 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

Если формальный параметр объявлен как параметр-значение, то перед вызовом блока это

Если формальный параметр объявлен как параметр-значение, то перед вызовом блока это

значение вычисляется, полученный результат помещается во временную память и передается блоку. Даже если в качестве фактического параметра указана просто переменная или константа, в блок передается только ее копия.
Если формальный параметр объявлен как параметр-переменная, то при вызове блока передается сама переменная, а не копия.
Любые возможные изменения параметра-значения в блоке никак не скажутся на вызывающей программе, а при использовании параметра-переменной эти изменения передадутся в вызывающую программу, т.к. приводят к изменению фактической переменной вызывающей программы.
Слайд 20

Function Power(a,b:real):real Program PowerDen Var x,y,z:real; {------------------} Function Power(var a,b,c:real):real; Begin

Function 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.
Слайд 21

Program Proba; ……………… a:=5; b:=7; {-------------} Procedure Pr1(var a : integer;

Program 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);