
- •Вспомогательные алгоритмы. Процедуры и функции.
- •Алгоритмы-процедуры и алгоритмы-функции.
- •Алгоритм-процедура
- •Алгоритм-функция.
- •Программирование с использованием процедур и функций. Описание подпрограммы-процедуры.
- •Описание подпрограммы функции.
- •Обращение к подпрограмме-процедуре
- •Обращение к подпрограмме – функции.
- •Особенность Оbject Pascal.
- •Использование массивов в процедурах.
- •Локальные и глобальные параметры (переменные).
- •Рекурсивные подпрограммы.
- •Косвенная рекурсия.
- •Процедурные типы.
Описание подпрограммы функции.
Функция – это подпрограмма, результатом выполнения которой является одно значение, причем это значение присваивается имени функции. Таким образом, функция есть частный случай процедуры и принципиально отличается от процедуры тем, что:
результатом функции является одно значение;
в теле функции (в описании) хотя бы один раз имени этой функции должно быть присвоено значение;
результат выполнения функции в основной программе используется как значение имени функции.
Описание функции также состоит из заголовка и блока функции.
Заголовок имеет вид:
Function<имя функции> (<список формальных парам.>):<тип ф-ции>;
<тип функции> – это тип значений, которые принимает имя функции в результате выполнения.
Отметим, что список формальных параметров у функции содержит только параметры-значения (исходные данные). В теле подпрограммы-функции обязательно хотя бы один раз должен встретиться оператор, присваивающий имени функции результат.
Пример: Вычислить максимум двух переменных z и p: M=max(z,p).
Имя функции max(z,p), результат присваивается имени max; z, p – формальные параметры.
Function max(z, p:real):real;
Begin
If z>p then max:=z
else max:=p;
End;
Так же, как у процедуры, список формальных параметров записывается с указанием их типов.
В отличие от функции процедура вычисления max запишется так:
Procedure Max(z, p:real; var M:real);
Begin
If z>p then M:=z
else M:=p;
End;
Обращение к подпрограмме-процедуре
Описание подпрограммы само по себе не вызывает ее выполнения. Чтобы выполнить процедуру, надо в нужном месте программы записать оператор обращения к процедуре. В нем необходимо указать фактические параметры, совпадающие по количеству и типу с формальными параметрами, записанными в заголовке процедуры.
Оператор обращения к процедуре имеет вид:
<имя процедуры>(<список фактических параметров>);
Порядок следования фактических параметров должен быть тем же, что и формальных параметров.
Пример: Вычислить функцию:
max(a,b)
+ x, x<0
y= max(a+b,a-b)
max(a2,b2)
Программа с использованием процедуры:
Program Proc; {с использованием процедуры}
Var a, b, x, c, d, y: real;
Procedure Мax(z,p:real; var M:real); {описание процедуры}
Begin
If z>p then M:=z
else M:=p;
End;
Begin {исполняемая часть программы(тело программы)}
Writeln(‘ввод a, b, x ’);
Readln(a, b, x); {1 2 3}
If x>=0 then
вegin
Max(a+b, a-b, c);
Max(sqr(a), sqr(b), d);
y:=c/d+x;
end
else
begin
Max(a, b, c);
y:=c+x;
end;
writeln(‘y=’,y:15:4); {15-количество знаков, 4-количество знаков после запятой}
readln;
end.
Обращение к подпрограмме – функции.
Обращение к функции не является отдельным оператором, как обращение к процедуре, но входит в состав выражений. Например, может быть в составе выражения правой части оператора присваивания или может находиться в операторе вывода на печать.
Пример1. Запишем решение той же задачи с использованием подпрограммы-функции для вычисления max.
Program Func; {с использованием функции}
Var a, b, c, d, y, x:real;
Function max(z, p:real):real; {описание функции}
Begin
If z>p then max:=z
else max:=p;
End;
Begin {исполняемая часть программы}
Writeln(‘ввод a, b, x’);
Readln(a, b, x);
If x>=0 then
Begin
c:=max(a+b, a-b);
d:=max(sqr(a), sqr(b)); {или y:=max(a+b, a-b)/max(sqr(a), sqr(b))+x; }
y:=c/d+x;
end
else
begin
c:=max(a, b); {или y:=max(a, b)+x }
y:=c+x;
end;
writeln(‘y=’, y:15:4);
readln;
e
20
i:=1 25
i:=1
Пример 2. Вычислить функцию p=( ∑ xi )*( ∑ yi ) с использованием подпрограммы.
Используем для вычисления сумм подпрограмму-функцию.
Вопрос: сколько формальных параметров будет у функции?
Какие фактические переменные и константы различаются в суммах?
Это – 20, 25 и x, y.
Обозначим их формальными r u z
Функция имеет 2 формальных параметра: z, r.
И
r
i:=1
z, r→summ(z, r)= ∑ zi
Program Primer;
var p, x, y:real;
Function summ(z:real;r:integer):real; {описание подпрограммы
функции}
Var i:integer;
s, a:real;
begin
s:=0; {должны накапливаться и сумма s, и произведение а}
a:=1;
for i:=1 to r do
begin
a:=a*z;
s:=s+a;
end;
summ:=s;
end;
begin {основная часть программы}
writeln(‘ввод x, y’);
readln(x, y);
p:=summ(x, 20)*summ(y, 25);
writeln(‘p=’,p:10:3);
readln;
end.
В описании функции summ используются 3 локальные переменные: s, a, i. Переменная s необходима, поскольку при подсчете суммы в цикле нельзя писать summ:=summ+a, т.к. происходит обращение к имени функции, которое находится внутри ее описания, поэтому нужно писать s:=s+a;
а затем, в итоге, перед завершением описания функции присвоить имени summ:=s;