Функции.
Выше было отмечено, что отличие процедуры от функции заключается в том, что выход из процедуры может быть осуществлен с несколькими параметрами(переменными), а выход из функции осуществляется только с одним параметром.
Заметим, что практически все вышеизложенные теоретические выкладки для процедуры применимы и для функции.
Отличие заключается в том, что имя функции обязательно должно иметь соответствующий тип; функция должна быть только в составе какого-либо оператора(например, в составе арифметического оператора и оператора вывода данных); параметр(переменная), с которым необходимо выходить из подпрограммы , в данном случае должен быть присвоен функции; вместо служебного слова Pocedure должно использоваться служебное слово Function.
В качестве примера использования функции возьмем вышеприведенную процедуру step1 вместе с головной программой step4 и преобразуем ее путем замены процедуры на функцию.
Procedure Step;
Var
M:integer;
A,z:real;
Function Step1(n:integer;x:real):real;
Var
I:integer;
Y:real;
Begin
Y:=1;
For i:=1 to n do
Y:=y*x;
Step1:=y;
End;
Begin
Read(a,m)
If m=0
Then z:=1
Else if m>0
Then z:=Step1(m,a)
Else z:= step1(m,1/a);
Write(z);
End.
Недостатком предыдущей программы возведения в степень является то, что показатель степени должен быть целочисленным. При дробных величинах степени необходимо воспользоваться(см. выше) стандартными функциями exp и ln:
xa → exp(a*ln(x))
В качестве примера рассмотрим следующее выражение:
Y=axp + bxq + cxl,
где a, b, c – произвольные числа; p,q,l – как целые, так и дробные показатели степени.
Составим программу, в которой процедура возведения в степень оформлена в виде отдельной подпрограммы – функции.
Program Step; Var
a, b, c, x, y, p, q, l:real; Function St(a, b:real):real; Var
d:real; Begin
If a>0 then d:=exp(b*ln(a))
Else if a<0 then d:=exp(b*ln(abs(a))) Else if b=0 then d:=1
Else d:=0; St:=d;
End; Begin
Writeln( Введите x ); Read(x);
Writeln( Введите a,b,c ); Read(a,b,c);
Writeln( Введите p,q,l ); Read(p,q,l); Y:=a*St(x,p)+b*St(x,q)+c*St(x,l); Write( y= ,y);
End.
Здесь три пары параметров x и p, x и q и x и l – фактические параметры(в арифметическом операторе присваивания, выполняющем вычисление значения y). А параметры a и b в заголовке Function – формальные параметры. Переменная d – локальная, которая потом присваивается имени St подпрограммы – функции.
Сама подпрограмма – функция осуществляет
процедуру возведения в степень:
D=ab.
Рассмотрим пример программы, в которой из головной программы осуществляется перекачка массива в процедуру – функцию.
Для этого рассмотрим следующую задачу. Пусть требуется составить программу для вычисления функции:
Y=ax2+bx+c,
где
12
N |
|
|
15 |
a |
ti , |
b |
ti , |
i 1 |
|
i |
n 1 |
c ri
i 1
ti и ri – элементы двух массивов.
Для вычисления коэффициентов a, b и c используем подпрограмму – функцию, которая должна обеспечивать вычисление суммы элементов массива при заданных пределах суммирования. Тогда среди формальных параметров необходимо указать: имя массива, нижний предел суммирования, верхний предел суммирования.
В подпрограмме – функции будем вычислять: Тогда программа в целом будет иметь вид:
1
S zi
i 1
Program func; Type
mas=array[1..15] real;
Var
t,z:mas;
n,i:integer;
x,y:real;
Function sum(z:mas;k,l:integer):real; Var
s;real;
i:integer; Begin
s:=0;
for i:=k to l do s:=s+z[i]; sum:=s;
end;
Begin
Writeln( Введите n ); Read(n);
Writeln( Введите x ); Read(x);
Writeln( Введите массив t ); for i:=1 to 15 do Read(t[i]); Write( Введите массив z ); for i:=1 to 12 do Read(x[i]);
y:=sum(t,1,n)*x*x+sum(t,n+1,is)*x+sum(z,1,R); Write( y= ,y);
end.