Слайд 1АлгоритмизациЯ и программированиЕ
Лекция 27
Тема №6
Процедуры и функции
Слайд 2Подпрограммой в Паскале называется особым образом оформленный фрагмент программы, имеющий
собственное имя.
Подпрограмма — это некоторый вспомогательный алгоритм, многократно использующийся в
основном алгоритме с различными значениями некоторых входящих величин, называемых параметрами.
Упоминание этого имени приводит к активизации подпрограммы и называется ее вызовом.
Сразу после активизации подпрограммы начинают выполняться входящие в нее операторы, после выполнения последнего из них управление возвращается обратно в основную программу и выполняются операторы, стоящие непосредственно за оператором вызова подпрограммы.
Подпрограммы
Слайд 3Подпрограммы
Подпрограмма – это одно из базовых средств описания действий, которое
позволяет реализовывать вспомогательные алгоритмы.
Выделяют два вида подпрограмм:
процедуры
функции
В файле программы (или
модуля) может быть только один основной блок, а в разделе описания могут определятся дополнительные блоки (подпрограммы).
Слайд 4Назначение подпрограмм
Основа для реализации структурного подхода
Средство для уменьшения сложности структуры
программы
Средство для экономии памяти:
рациональная запись кода и его использование при
вызовах подпрограмм (подпрограмма существует в единичных экземплярах, а вызываться может многократно);
динамическое выделение памяти под хранение значений объектов данных, описанных в подпрограмме (как только подпрограмма начинает работу – память выделяется, как заканчивает - освобождается)
Слайд 5Область действия (видимости)
Блок в общем случае обеспечивает выполнение двух основных
функции:
резервирование области памяти для создания в ней основных объектов данных;
введение
новой области видимости (действия) идентификаторов описанных объектов данных.
Область видимости (действия) – это часть программы, на которую распространяются сделанные описания, т.е. это где видны, а следовательно, могут быть использованы идентификаторы объектов описания.
Слайд 6Область действия (видимости)
Областью действия описания любого программного объекта (переменной, типа,
константы и т.д.) является тот блок, в котором расположено это
описание.
Если данный блок вложен в другой (подпрограмма), то присутствующие в нем описания являются локальными. Они действуют только в пределах внутреннего блока.
Описания сделанные во внешнем блоке видны в любом внутреннем блоке и их область видимости глобальна (по отношению к внутреннему блоку).
Слайд 7Время жизни объектов данных
При передачи управления в данный блок создаются
все описанные в нем объекты данных, а затем выполняются последовательность
его операторов.
При выходе из блока созданные объекты данных уничтожаются.
Создание и уничтожение объектов данных – это резервирование и освобождение области памяти по размеру соответствующее типу объекта данных. Этим и определяется время жизни объектов данных, то есть время от его создания до уничтожения.
Слайд 8Виды переменных
Глобальными называются переменные, которые описаны в главной программе. Время
жизни глобальных переменных — с начала программы и до ее
завершения. Располагаются в сегменте данных.
В подпрограммах описываются локальные переменные. Они располагаются в сегменте стека, причем распределение памяти происходит в момент вызова подпрограммы, а ее освобождение — по завершении подпрограммы.
Локальные переменные автоматически не обнуляются.
Слайд 9Структура программы
Главная
Глобальные переменные
Подпрограмма А
Подпрограмма В
Подпрограмма С
Локальные переменные
begin
end
begin
end
...
...
Вызов А ... Вызов
А ... Вызов В ...
Слайд 10PROGRAM 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;
Слайд 11Павловская Т.А. (СПбГУИТМО)
Вызов
Для того чтобы подпрограмма выполнилась, ее надо вызвать.
Вызов подпрограммы записывается в том месте программы, где требуется получить
результаты работы.
Процедура вызывается с помощью отдельного оператора, а функция — в правой части оператора присваивания, например:
inc(i); writeln(a, b, c); { вызовы процедур }
y := sin(x) + 1; { вызов функции }
Слайд 12Функции
Функции представляют собой группу операторов, в результате выполнения которых вычисляется
одно значение, присваиваемое имени функции.
Описание функции включает в себя следующие
разделы:
заголовок функции;
разделы описаний, являющихся локальными по отношению к описываемой функции;
тело функции.
Слайд 13Формат описания функции:
Function F (q1:T1; q2:T2;…) : T;
типов, констант, описания вложенных процедур и функций>;
Begin
;
F:=;
End;
F-
имя функции;
qi- имена формальных параметров;
Ti- типы параметров;
Т – тип, возвращаемого функцией значения
Слайд 14Функции
Параметры, фигурирующие в описании подпрограммы называются формальными. Они задают форму
вычислений. В дальнейшем они заменяются конкретным значением от которого мы
хотим вычислить функцию.
Например, в математике: f(x):=3x-5
x - формальный параметр
Величину, для которой необходимо вычислить значение функции будем называть фактическим параметром.
F(5) a=7; F(a)
5 и a – фактические параметры.
Слайд 15Функции
Список параметров и локальных описаний не обязательны. Если список параметров
отсутствует, то скобки после имени функции не ставятся.
Возвращаемое значение в
теле функции может присваиваться или имени функции или специальной предопределенной системной переменной Result, которую не нужно описывать, но которой можно пользоваться в теле функции.
Слайд 16Функции
Использование переменной Result имеет одно принципиальное отличие от имени функции.
Имя функции – это не переменная. Оно может фигурировать только
в левой части оператора присваивания, и не может входить ни в какие выражения. А Result – это переменная.
Слайд 17Вызов функции
Обращение к функции обычно осуществляется в правой части оператора
присваивания, указывая имя функции и фактические параметры в виде
A:=f(b1,b2,…);
где bi
– фактические параметры.
При этом, возвращаемое функцией значение, замещает в операторе имя вызванной функции.
Слайд 18Function 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;
Слайд 19Процедуры
Процедуры используются в тех случаях, когда в подпрограмме необходимо получить
несколько результатов, либо не одного.
Описание процедуры включает в себя:
заголовок процедуры
раздел
описаний
тело процедуры.
Слайд 20Формат описания процедуры:
Procedure H (q1:t1; var q2:t2;…);
констант, описания вложенных процедур и функций>;
Begin
;
End;
H – имя
процедуры;
qi- имена формальных параметров;
Ti- типы параметров;
Слайд 21Вызов процедуры
Вызов процедуры осуществляется с помощью указания имени процедуры
и списка фактических параметров.
H(b1,b2,…);
Если процедура и основная программа связаны с
помощью глобальных переменных, то процедура может быть организована и без параметров.
Слайд 22Примеры
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.
Слайд 23Перекрытие идентификаторов
Имена локальных переменных могут перекрывать область видимости одноименных глобальных
переменных. При этом все операции с объектом данных под данным
именем будут осуществляться со значением локальной переменной.
Слайд 24Опережающее описание подпрограмм
Разделы описаний в блоке могут произвольно располагаться много
раз открываться. Но при этом в вышележащих описаниях нельзя использовать
или ссылаться на описания сделанные ниже.
При описании процедур и функций иногда возникает необходимость в закольцованных вызовах . При этом как минимум две подпрограммы в своем теле могут вызывать друг друга.
Для развязки подобных вызовов можно использовать опережающее описание заголовка одной из этих подпрограмм при помощи ключевого слова (директивы) FORWARD.
Слайд 25Пример опережающего описания
Procedure B: forward;
Procedure A;
Begin
B
End;
Procedure B;
Begin
A
End;
Слайд 26Виды параметров
При вызове подпрограммы ей можно передавать и из нее
можно получать значения через параметры-аргументы.
Параметры, указываемые в заголовке подпрограммы называются
формальными параметрами.
Параметры, указываемые при вызове подпрограммы, называются фактическими параметрами.
Слайд 27При подстановки фактических параметров на место формальных должны соблюдаться следующие
правила их соответствия:
по количеству указываемых параметров;
по порядку их перечисления;
по типу;
функциональному
соответствию.
Слайд 28Классификация параметров
По механизму передачи:
передача по значению (value);
передача по адресу (addr).
По
функциональному предназначению
только как входной параметр (in);
только как выходной параметр (out);
и
как входной и как выходной параметр (inout).
Слайд 29Способы передачи параметров
Теоретически возможны 6 способов передачи параметров:
value in
value out
value
inout
addr in
addr out
addr inout
Слайд 30Способы передачи параметров
В Object Pascal поддерживаются четыре способа передачи параметров:
value
in (передача по значению)
addr out (передача параметров как выходных параметров)
addr
inout (передача параметров как переменных)
addr in (передача параметров как констант)
Слайд 311. Передача по значению.
Параметры значения определяют исходные данные для работы
процедур и функций. В списке формальных параметров они описываются в
следующем виде:
procedure my1(q1:T1; q2:T2) или
procedure my2(q1,q2:T)
При вызове подпрограммы фактический параметр, может быть любым выражением, результат вычисления которого принадлежит тому же типу, что и формальный параметр.
Слайд 32Передача по значению
При обращении к подпрограмме выражение вычисляется. В памяти
создаются временные переменные с именами q1 и q2, и в
них копируется результат вычислений.
Изменение значений переменных q1 и q2 в теле подпрограммы никак не влияет на значения переменных из основной программы.
При выходе из подпрограммы формальные переменные q1 и q2 уничтожаются.
Слайд 332. Передача параметров как переменных
Параметры переменные позволяют передавать в основную
программу измененные значения.
Параметры переменные в списке формальных параметров описываются с
помощью указания перед ними ключевого слова var. Например:
procedure my3 (var q1, q2:t1; var q3:t2) ;
Слайд 34Передача параметров как переменных
При обращении к подпрограмме фактические параметры должны
быть обязательно переменными, того же типа, что и формальные параметры.
В
подпрограмму передается адрес переменной (ссылка) и операторы процедуры непосредственно используют данную переменную.
В данном случае любые изменения параметра q1, произведенные в подпрограмме, в действительности относятся к той переменной, которая будет указана при вызове подпрограммы на месте q1.
Слайд 353. Передача параметров как констант
Передача параметра как константы осуществляется заданием
перед его описанием ключевого слова const.
procedure my4 (const q1:t1);
Параметры константы
по механизму передачи похожи на параметры значения, но их значения нельзя изменять в теле подпрограммы.
В качестве аргументов могут использоваться константы, выражения и переменные. В подпрограмму передаются адреса фактических параметров.
Слайд 364. Передача параметров как выходных параметров
Выходные параметры описываются с помощью
зарезервированного слова out.
procedure my5(out q1:t1);
Выходные параметры по механизму передачи похожи
на параметры переменные, но при этом в подпрограмму не передается начальное значение этого параметра, т.е. память, занимаемая соответствующей переменной, указанной при вызове подпрограмме на месте q1, будет очищена при вызове подпрограммы.
Слайд 37Перегрузка подпрограмм
Можно определить в одной и той же области видимости
несколько подпрограмм с одинаковыми именами, но различными по числу и
типу параметрами.
Для этого в описании заголовка каждой из этих подпрограмм необходимо указать директиву (ключевое слово) OVERLOAD.
При вызове компилятор проанализирует передаваемые параметры, их число и тип и вызовет ту из них, которая подойдет по данным параметрам.
procedure my_1 (i:integer); overload;
Слайд 38Пример использования функции
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;
Слайд 39begin
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.
Слайд 40Пример использования процедуры
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.
Слайд 41Процедуры передачи управления
break — завершает выполнение цикла, внутри которого записана;
continue
— выполняет переход к следующей итерации цикла;
exit — выходит из
программы или подпрограммы, внутри которой записана;
halt — немедленно завершает выполнение программы.