Тема 5.
Объявление подпрограмм. Процедуры и функции.
Объявление подпрограмм.
Подпрограммы - выделенные и специальным образом оформленные фрагменты программы. Необходимость такого выделения и его значимость - определяется программистом. Как правило, выделяют фрагменты, часто повторяющиеся или имеющие специальное или универсальное значение.
Синтаксическая диаграмма объявления подпрограмм имеет вид:
Подпрограммы имеют имя. Как правило, подпрограммы помимо имени имеют список параметров, посредством которых данные попадают в подпрограммы и извлекаются из них в виде результатов. Список формальных параметров:
Подпрограммы объявляют в разделе объявлений, а обращаются к ним (вызывают) в разделе инструкций программы.
Синтаксическая диаграмма вызова подпрограммы имеет вид:
При объявлении подпрограммы параметры, указанные в списке называют формальными.
При вызове подпрограммы формальные параметры заменяют фактическими.
Примеры объявления и вызова подпрограмм:
function Tang( x : Real) : Real ; { вещественная функция вещественного аргумента}
Пример
многократного
вызова функции: z
:= 0.3; y
:= Tang(z);
d
:= Tang(y
–2*z);
Tang := sin(x)/cos(x)
end;
function Tang2( x : Real) : Real ; { вещественная функция одного аргумента }
Var S, C : Real; {локальные объявления }
begin
S := sin(x); C := cos(x); Tang2 := S/C
end;
procedure Tang1( x : Real; var rezult : Real ) ; { процедура }
Пример
вызова процедуры: z
:= 0.3; Tang1(
z,
y
); Tang1(y
–2*z
, d
);
rezult := sin(x)/cos(x)
end;
function Exp1( x, delta : Real) : Real ; {экспонента - вещественная функция двух аргументов}
Var s, a : Real; i : Integer; { локальные объявлния }
Пример
вызова функции: z
:= 0.3; epsilon
:= 1e-6;
y
:= Exp1(z, epsilon) + sin(z);
r
:= Exp1(z, 0.0001)
while abs(a) > delta do
Begin
s := s + a; i := i + 1; a := a*x/i;
End;
Exp1 := s
end;
procedure csth( x : Real; var ch, sh, th : Real ) ; { три гиперболические функции}
Пример
вызова процедуры: z
:= 0.3;
csth(
z,
a,
b,
c
); csth(
0.45,
a1, b1, c1 ); y :=
a – c1;
begin
ep := exp(x); em := 1/ep;
ch := (ep + em)*0.5;
sh := (ep - em)*0.5;
th := sh/ch
end;
В качестве фактических параметров можно использовать переменные, константы, выражения.
Установлено правило, регламентирующие эти возможности:
Если формальный параметр описан с атрибутом var, его называют параметром - переменной. Фактическим параметром в этом случае может бать только переменная.
Если формальный параметр не имеет атрибута var, его называют параметром - значением. Фактическим параметром в этом случае может бать константа, выражение.
Замечание.
Стандарт языка требует, чтобы все параметры подпрограмм были типизированы (принадлежали конкретным заранее объявленным типам) однако, применять конструкторы типов в заголовке подпрограммы запрещено. Нельзя записать заголовок в таком виде:
Procedure ReadArray( N : 1..9; var A : array[1..9] of real ). {ТАК НЕЛЬЗЯ ПИСАТЬ}
Необходимо в разделе объявлений сконструировать новые типы – например:
Type Int = 1..9 ; Vector = array[Int] of Real ;
Procedure ReadArray( N : Int; var A : Vector ) ; { чтение массива}
Пример
вызова процедуры: m
:= 5;
ReadArray(5,
B); ReadArray(5*m,
C);
Begin
For i := 1 to N do
Begin
Write(‘введи ’, i, ‘ элемент ‘); Read(A[i])
End;
End;
Параметры подпрограмм можно условно разделить на входные (посредством которых данные попадают в подпрограммы) и выходные (посредством которых извлекаются результаты).
Параметры – значения могут бать только входными параметрами.
Параметры – переменные могут бать входными и выходными.
Procedure Demo( x, y : Real; i, m : Integer; var ch, sh, th : Real; var k : Integer ) ;
Параметры функции всегда входные.
Выходным параметром является имя функции, оно содержит результат.
В теле функции необходима инструкция присваивания имени функции некоторого значения (результата).
F
unction
Exp1( x, delta : Real) : Real ;
Параметрами подпрограмм могут быть подпрограммы.
Введение процедурного типа позволяет подпрограммы интерпретировать как разновидность переменных.
Например:
Type Func = Function ( x, y : Real) : Real ; {процедурный тип – функция двух аргументов}
Procedure csth( x : Real; F1 : Func ; var ch, sh, th : Real ) ;
Var ep, em, r : Real;
Пример
вызова процедуры: z
:= 0.3;
csth(
z,
Exp1,
a,
b,
c
); y
:= a – c1;
ep := F1(x, 1e-6); em := 1/ep;
ch := (ep + em)*0.5;
sh := (ep - em)*0.5;
th := sh/ch
End;
В этом примере формальным параметром процедуры csth является переменная F1, тип которой Func – функция двух параметров. При вызове процедуры csth в программе формальный параметр F1 заменен фактическим именем функции Exp1 (функция предназначена для вычисления экспоненты).
Задачи для классной и домашней работы (не менее 3 в классе и 3-6 дома). 6.1 – 6.49.
Итог. Контрольная работа по всем разделам темы 5.
