Вызов процедур и функций
Вызов процедуры (функции) имеет вид:
<Имя процедуры (функции)>(<Список параметров>);
Параметры, перечисленные в <списке параметров> при вызове процедуры (функции), называются фактическими.
<Список параметров> при вызове процедуры или функции заключается в круглые скобки и содержит последовательность фактических параметров, разделенных запятыми:
<идентификатор1>,<идентификатор2>…
В качестве фактических параметров в простейших случаях могут использоваться значения, идентификаторы переменных, констант.
!!! Количество, порядок следования и типы фактических параметров должны соответствовать количеству, порядку следования и типам формальных параметров!!!
При вызове процедур и функций формальные параметры заменяются фактическими.
Если процедура или функция не имеет параметров, то при объявлении и при вызове (<Список параметров>) опускается.
Задача. Разработать программу, в которой с помощью функции пользователя вычисляется десятичный логарифм введенного с клавиатуры числа.
{****** 1. РАЗДЕЛ ОБЪЯВЛЕНИЙ И СОГЛАШЕНИЙ**********}
var x,y:real;
{****** 2. РАЗДЕЛ ПРОЦЕДУР И ФУНКЦИЙ***************}
function lg (x_:real):real;
begin
log:=ln(x_)/ln(10);
end;
{************3. РАЗДЕЛ ОСНОВНОЙ ПРОГРАММЫ**********}
BEGIN
writeln;
writeln('введите, x:');
readln(x);
writeln('введите y:');
readln(y);
writeln('lg(’, x , ’)=’, lg(x):8:5);
readln;
END.
Задача. Разработать программу, в которой с помощью функции пользователя, которая для введенного с клавиатуры числа n вычисляется значение n!.
{****** 1. РАЗДЕЛ ОБЪЯВЛЕНИЙ И СОГЛАШЕНИЙ**************}
var n: integer;
{****** 2. РАЗДЕЛ ПРОЦЕДУР И ФУНКЦИЙ*******************}
function fact(n1:integer):longint; {n!}
var i: byte;
f: longint;
begin
f:=1;
for i:=1 to n1 do
f:=f*i;
fact:=f;
end;
{************3. РАЗДЕЛ ОСНОВНОЙ ПРОГРАММЫ***************}
BEGIN
Writeln(‘Введите n’);
Readln(n);
Writeln(‘ n!=’, fact(n));
END.
Задача. Даны два одномерных массива А и В. Найти их скалярное произведение.
Скалярным произведением двух массивов одинаковой размерности называется сумма произведений соответствующих элементов: а[1]*b[1] + а[2]*b[2] +... + a[n-l]*b[n-l] + a[n]*b[n], где n — это количество элементов в массивах.
Program SCALAR_PROIZV_VEKT;
Uses Crt;
Const n=5;
Type mas=array[1..n] of integer;
Var i:integer;
x,y:mas;
function SCALAR(a,b:mas):integer;
var s:integer;
begin
s:=0;
for i:=1 to n do
s:=s+a[i]*b[i];
SCALAR:=s;
end;
BEGIN
clrscr;
randomize;
Writeln('massiv x');
for i:=1 to n do
begin
x[i]:=1+random(10);
Write(' x[',i,']=',x[i]);
end;
Writeln;
Writeln('massiv y');
for i:=1 to n do
begin
y[i]:=1+random(10);
Write(' y[',i,']=',y[i]);
end;
Writeln;
Writeln('x*y=',SCALAR(x,y));
END.
Результат работы программы:
massiv x
x[1]=1 x[2]=4 x[3]=3 x[4]=2 x[5]=3
massiv y
y[1]=8 y[2]=2 y[3]=2 y[4]=3 y[5]=1
x*y=31
Отличия процедур и функций
1. Функция возвращает в точку вызова некоторое значение, связанное с именем функции; процедура же не возвращает по имени никакого значения (поэтому при объявлении функции указывается тип возвращаемого значения).
2. При объявлении функции в основном блоке должен присутствовать как минимум один оператор, в котором имени функции присваивается некоторое значение. Данное значение и будет возвращено функцией в точку вызова. В случае с процедурой применение подобных операторов недопустимо (следствие из п.1). (пример: функции MyFunc, MyFunc1).
3. В отличие от вызовов процедур, вызов функции можно использовать в выражениях в качестве операнда (следствие из п.1). (примеры с присваиванием значений переменной e).