Слайд 2Подпрограммы
Подпрограмма – это одно из базовых средств описания действий, которое
позволяет реализовывать вспомогательные алгоритмы.
Выделяют два вида подпрограмм:
процедуры
функции
В файле программы (или
модуля) может быть только один основной блок, а в разделе описания могут определятся дополнительные блоки (подпрограммы).
Слайд 3Назначение подпрограмм
Основа для реализации структурного подхода
Средство для уменьшения сложности структуры
программы
Средство для экономии памяти:
рациональная запись кода и его использование при
вызовах подпрограмм (подпрограмма существует в единичных экземплярах, а вызываться может многократно);
выделение памяти под хранение значений объектов данных, описанных в подпрограмме (как только подпрограмма начинает работу – память выделяется, как заканчивает - освобождается)
Слайд 4Область действия (видимости)
Блок в общем случае обеспечивает выполнение двух основных
функции:
резервирование области памяти для создания в ней основных объектов данных;
введение
новой области видимости (действия) идентификаторов описанных объектов данных.
Область видимости (действия) – это часть программы, на которую распространяются сделанные описания, т.е. это где видны, а следовательно, могут быть использованы идентификаторы объектов описания.
Слайд 5Область действия (видимости)
Областью действия описания любого программного объекта (переменной, типа,
константы и т.д.) является тот блок, в котором расположено это
описание.
Если данный блок вложен в другой (подпрограмма), то присутствующие в нем описания являются локальными. Они действуют только в пределах внутреннего блока.
Описания сделанные во внешнем блоке видны в любом внутреннем блоке и их область видимости глобальна (по отношению к внутреннему блоку).
Слайд 6PROGRAM Prog;
Var V1: integer;
Procedure A;
Var V2: integer;
Begin … end;
Procedure B;
Var V3: integer;
Procedure B1;
Var V4: integer;
Begin … end;
Begin … end;
Var V5: integer;
BEGIN … END.
PROGRAM Prog;
Var V1: integer;
Var V5: integer;
Procedure A;
Var V2: integer;
Procedure B;
Var V3: integer;
Procedure B1;
Var V4: integer;
Слайд 7Время жизни объектов данных
При передачи управления в данный блок создаются
все описанные в нем объекты данных, а затем выполняются последовательность
его операторов.
При выходе из блока созданные объекты данных уничтожаются.
Создание и уничтожение объектов данных – это резервирование и освобождение области памяти по размеру соответствующее типу объекта данных. Этим и определяется время жизни объектов данных, то есть время от его создания до уничтожения.
Слайд 8Функции
Функции представляют собой группу операторов, в результате выполнения которых вычисляется
одно значение, присваиваемое имени функции.
Описание функции включает в себя следующие
разделы:
заголовок функции;
разделы описаний, являющихся локальными по отношению к описываемой функции;
тело функции.
Слайд 9Формат описания функции:
Function F (q1:T1; q2:T2;…) : T;
типов, констант, описания вложенных процедур и функций>;
Begin
;
F:=;
End;
F-
имя функции;
qi- имена формальных параметров;
Ti- типы параметров;
Т – тип, возвращаемого функцией значения
Слайд 10Функции
Параметры, фигурирующие в описании подпрограммы называются формальными. Они задают форму
вычислений.
В дальнейшем они заменяются конкретным значением (аргументом) от которого
мы хотим вычислить функцию.
Например, в математике: f(x):=3x-5
x - формальный параметр
Величину, для которой необходимо вычислить значение функции будем называть фактическим параметром.
F(5) a=7; F(a)
5 и a – фактические аргументы.
Слайд 11Функции
Список параметров и локальных описаний не обязательны. Если список параметров
отсутствует, то скобки после имени функции не ставятся.
Возвращаемое значение в
теле функции может присваиваться или имени функции или специальной предопределенной системной переменной Result, которую не нужно описывать, но которой можно пользоваться в теле функции.
Слайд 12Функции
Использование переменной Result имеет одно принципиальное отличие от имени функции.
Имя функции – это не переменная. Оно может фигурировать только
в левой части оператора присваивания, и не может входить ни в какие выражения. А Result – это переменная.
Слайд 13Вызов функции
Обращение к функции обычно осуществляется в правой части оператора
присваивания, указывая имя функции и фактические параметры в виде
A:=f(b1,b2,…);
где bi
– фактические параметры.
При этом, возвращаемое функцией значение, замещает в операторе имя вызванной функции.
Слайд 14Function Max (x, y: real): Real;
Begin
If x>y Then
max: =x
Else
max:=y;
End;
или
Function Max (x, y: real): Real;
Begin
If x>y Then Result: =x
Else
Result: =y;
End;
Слайд 15Процедуры
Процедуры используются в тех случаях, когда в подпрограмме необходимо получить
несколько результатов, либо не одного.
Описание процедуры включает в себя:
заголовок процедуры
раздел
описаний
тело процедуры.
Слайд 16Формат описания процедуры:
Procedure H (q1:t1; var q2:t2;…);
констант, описания вложенных процедур и функций>;
Begin
;
End;
H – имя
процедуры;
qi- имена формальных параметров;
Ti- типы параметров;
Слайд 17Вызов процедуры
Вызов процедуры осуществляется с помощью указания имени процедуры
и списка фактических параметров.
H(b1,b2,…);
Если процедура и основная программа связаны с
помощью глобальных переменных, то процедура может быть организована и без параметров.
Слайд 18Примеры
Program my1;
Var p1,p2,p5: real; p3:char; p4:integer;
Procedure SP(a: Real; b: Integer;
с: Char);
Begin if c=‘/’ then writeln(a/b)
else writeln(a-b)
End;
Function
F(a: Real; b: Real): Real;
Begin
if a>b then f:=a else f:=b
End;
BEGIN
readln(p1,p2,p3,p4);
SP(p1,p4,p3);
p5:=f (p1,p2)
SP(p5,p4,p3);
END.
Слайд 19Перекрытие идентификаторов
Имена локальных переменных могут перекрывать область видимости одноименных глобальных
переменных.
При этом все операции с объектом данных под данным
именем будут осуществляться со значением локальной переменной.
Слайд 20Пример перекрытия
Program my2;
const a:byte=1; //глобальная константа
Procedure AA;
const a:integer=2;//локальная переменная
Begin
write(a);
End;
Begin
AA
end.
Слайд 21Опережающее описание подпрограмм
Разделы описаний в блоке могут произвольно располагаться много
раз открываться. Но при этом в вышележащих описаниях нельзя использовать
или ссылаться на описания сделанные ниже.
При описании процедур и функций иногда возникает необходимость в закольцованных вызовах . При этом как минимум две подпрограммы в своем теле могут вызывать друг друга.
Для развязки подобных вызовов можно использовать опережающее описание заголовка одной из этих подпрограмм при помощи ключевого слова (директивы) FORWARD.
Слайд 22Пример опережающего описания
Procedure B: forward;
Procedure A;
Begin
B
End;
Procedure B;
Begin
A
End;
Слайд 23Пример опережающего
var i:integer;
Procedure B;forward;
Procedure A;
Begin
B;
i:=i+1;
End;
Procedure B;
Begin
i:=i+2;
End;
Procedure C;
Begin
A;
B;
i:=i+3;
End;
Begin
i:=1;
C;
write(i);
readln;
end.
Слайд 24Виды параметров
При вызове подпрограммы ей можно передавать и из нее
можно получать значения через параметры-аргументы.
Параметры, указываемые в заголовке подпрограммы называются
формальными параметрами.
Параметры, указываемые при вызове подпрограммы, называются фактическими параметрами.
Слайд 25При подстановки фактических параметров на место формальных должны соблюдаться следующие
правила их соответствия:
по количеству указываемых параметров;
по порядку их перечисления;
по типу;
функциональному
соответствию.
Слайд 26Классификация параметров
По механизму передачи:
передача по значению (value);
передача по адресу (addr).
По
функциональному предназначению
только как входной параметр (in);
только как выходной параметр (out);
и
как входной и как выходной параметр (inout).
Слайд 27Способы передачи параметров
Теоретически возможны 6 способов передачи параметров:
value in
value out
value
inout
addr in
addr out
addr inout
Слайд 28Способы передачи параметров
В Object Pascal поддерживаются четыре способа передачи параметров:
value
in (передача по значению)
addr out (передача параметров как выходных параметров)
addr
inout (передача параметров как переменных)
addr in (передача параметров как констант)
Слайд 291. Передача по значению.
Параметры значения определяют исходные данные для работы
процедур и функций. В списке формальных параметров они описываются в
следующем виде:
procedure my1(q1:T1; q2:T2) или
procedure my2(q1,q2:T)
При вызове подпрограммы фактический параметр, может быть любым выражением, результат вычисления которого принадлежит тому же типу, что и формальный параметр.
Слайд 30Передача по значению
При обращении к подпрограмме выражение вычисляется. В памяти
создаются временные переменные с именами q1 и q2, и в
них копируется результат вычислений.
Изменение значений переменных q1 и q2 в теле подпрограммы никак не влияет на значения переменных из основной программы.
При выходе из подпрограммы формальные переменные q1 и q2 уничтожаются.
Слайд 312. Передача параметров как переменных
Параметры переменные позволяют передавать в основную
программу измененные значения.
Параметры переменные в списке формальных параметров описываются с
помощью указания перед ними ключевого слова var. Например:
procedure my3 (var q1, q2:t1; var q3:t2) ;
Слайд 32Передача параметров как переменных
При обращении к подпрограмме фактические параметры должны
быть обязательно переменными, того же типа, что и формальные параметры.
В
подпрограмму передается адрес переменной (ссылка) и операторы процедуры непосредственно используют данную переменную.
В данном случае любые изменения параметра q1, произведенные в подпрограмме, в действительности относятся к той переменной, которая будет указана при вызове подпрограммы на месте q1.
Слайд 333. Передача параметров как констант
Передача параметра как константы осуществляется заданием
перед его описанием ключевого слова const.
procedure my4 (const q1:t1);
Параметры константы
по механизму передачи похожи на параметры значения, но их значения нельзя изменять в теле подпрограммы.
В качестве аргументов могут использоваться константы, выражения и переменные. В подпрограмму передаются адреса фактических параметров.
Слайд 344. Передача параметров как выходных параметров
Выходные параметры описываются с помощью
зарезервированного слова out.
procedure my5(out q1:t1);
Выходные параметры по механизму передачи похожи
на параметры переменные, но при этом в подпрограмму не передается начальное значение этого параметра, т.е. память, занимаемая соответствующей переменной, указанной при вызове подпрограмме на месте q1, будет очищена при вызове подпрограммы.
Слайд 35Перегрузка подпрограмм
Можно определить в одной и той же области видимости
несколько подпрограмм с одинаковыми именами, но различными по числу и
типу параметрами.
Для этого в описании заголовка каждой из этих подпрограмм необходимо указать директиву (ключевое слово) OVERLOAD.
При вызове компилятор проанализирует передаваемые параметры, их число и тип и вызовет ту из них, которая подойдет по данным параметрам.
Слайд 36procedure my_1 (i:integer); overload;
begin
writeln(‘integer - ’,i);
end;
procedure my_2 (var c:char); overload;
begin
write(‘vvedite:’);
readln(c);
writeln(‘char
- ’,c);
end;
var ch:char;
begin
my_1(7);
my_2(ch);
end.
Слайд 37Пример использования функции
program Podpr1;
uses
SysUtils;
var x,y,z, max3: integer;
Function Max2(a,b:integer):integer;
begin
if a>b then
max2:=a
else max2:=b;
end;
Слайд 38begin
writeln ('POISK max in 3 numbers');
writeln ('Your 3
numbers, please:');
readln (x,y,z);
max3:=max2(max2(x,y),z);
writeln ('the max is ',
max3);
readln;
end.
Слайд 39Пример использования процедуры
program Podpr2;
uses SysUtils;
var x,y,z: integer;
procedure Sort2(var a,b:integer);
var
c:integer;
begin
if a>b then
begin
c:=a;
a:=b;
b:=c
end;
end;
begin
writeln ('Sortirovka 3 numbers');
writeln ('Your 3 numbers, please:');
readln (x,y,z);
sort2 (x,y);
sort2 (y,z);
sort2 (x,y);
writeln ('Result of sort is ', x:10, y:10,z:10);
readln;
end.
Слайд 40begin
writeln ('Sortirovka 3 numbers');
writeln ('Your 3 numbers, please:');
readln (x,y,z);
sort2 (x,y);
sort2 (y,z);
sort2 (x,y);
writeln ('Result
of sort is ', x:10, y:10,z:10);
readln;
end.