Создание пользовательских функций. Передача аргументов
Очень часто процесс решения какой – либо задачи может быть мысленно представлен как последовательность решения более простых подзадач.
Процедуры и функции по своей структуре подобны обычным программам и имеют общее название – подпрограммы. Применение подпрограмм дает возможность уменьшить общее число повторении одной и той же последовательности операторов, а так же конструировать программу, как набор отдельных подпрограмм. Для сложных задач это существенно упрощает процесс программирования.
В программе описание процедур и функций обычно располагается между разделами переменных и операторов, но при этом необходимо помнить что любое имя в программе должно быть обязательно описано перед тем, как оно появится среди исполняемых операторов. Каждая процедура или функция определяется только один раз, но может использоваться многократно.
В процедурах и функциях, как и в обычных программах, могут быть описаны собственные метки, константы, типы, собственные переменные и даже собственные процедуры и функции.
Описание функции подобно описанию процедуры, однако имеются некоторые отличия. Важнейшее из них заключается в том, что результатом работы функции является одно значение произвольного типа. Тип результата задается в заголовке функции, общий вид которого:
Function < имя функции > (< список формальных параметров >): < тип результата >
Среди входящих в функцию операторов должен обязательно присутствовать хотя бы один оператор присваивания, в левой части которого стоит имя стандартной переменной resultи которая трактуется как результат, возвращаемый функцией. Этот оператор и определяет значение, вырабатываемое функцией.
Вызов и выполнение функции производятся при вычислении значения указателя функции который входит в некоторое выражение в вызывающей программе. При вызове функции передача фактических параметров происходит так же, как и при вызове процедуры.
< имя функции > (< список фактических параметров >),
Пример использования:
Вычислить: .
При решении данной задачи целесообразно использовать функцию для вычисления максимальногоиз двух чисел. Использование функции является обоснованным, так как результатом вычисления максимума будет одно значение простого типа.
program pl_32J
var a,b,c,u:real;
function max(x,y:real):real;
begin
if x>y then result :=x else result =у
end;
begin
writeln('Enter a,b,c'); readln(a,b,c);
u:=(max(a,a+b)+max(a,b+c))/(1+ma+b*c,a*c));
writeln('u=’,u:7:3);
readln
end.
В данном примере указателями функции являются ,
и
.
Язык Delphi позволяет передавать параметры в функции либо по значению, либо по ссылке. Передаваемый параметр может иметь любой встроенный или пользовательский тип, либо являться открытым массивом. Параметр также может быть константой, если его значение в функции не изменяется.
Передача параметров по значению (by value) – это стандартный режим передачи параметров. Когда параметр передается по значению, создается его локальная копия, которая и предоставляется для обработке в функцию.
Пример использования:
function Foo(I: Integer): Integer;
При вызове процедуры Foo() будет создана копия передаваемой ей в качестве параметра целочисленной переменной I. Таким образом функция будет работать с локальной копией переменной I, а внесенные в нее изменения никак не повлияют на значение, переданное функции.
Язык Delphi позволяет также передавать параметры в функции по ссылке (by reference) – такие параметры называются переменными параметрами (variable parameter) . Передача параметра по ссылке означает, что функция сможет изменять значение полученных переменных. Для передачи параметров по ссылке используется ключевое слово var, помещаемое в список параметров функции.
Пример использования:
function ChangeMe(var x: longint) : longint;
begin
x := 2; //Теперь X изменится в вызываемой функции
end;
Вместо создания копии переменной X ключевое слово var потребует передачи адреса самой переменной X, что позволит функции изменять ее начальное значение.
Подобно параметрам, объявленным с ключевым словом var, параметры, объявленные с ключевым словом out, являются средством возвращения функцией значения вызывающей процедуре в виде параметра. Однако в отличие от параметров, объявленных с ключевым словом var, которые должны быть инициализированы допустимым значением до вызова функции, параметры, объявленные с ключевым словом out, не предполагают проверки правильности передаваемого значения. Для ссылочных типов это означает, что при вызове функции наличие ссылки не имеет никакого значения.
Пример использования:
function ReturnMe(out O: TObject);
begin
O := SomeObject.Create;
end;
Существует простое правило: параметры объявляются как var, если они подлежат приему и возвращению, и как out, если они подлежат только возвращению.
Если необходимости изменять передаваемые функции данные нет, то параметр можно объявить как константу, использовав ключевое слово const.
Параметр в виде открытого массива (open array) позволяет передавать в функцию различное количество аргументов. Передать можно открытый массив элементов одинакового типа или массив констант различного типа.
Пример использования:
function AddEmUp(A: array of Integer): Integer;
В приведенном примере объявлена функция, который должен быть передан открытый массив целых чисел.
В открытом массиве можно передавать переменные, константы или выражения массива любого типа (динамического, статического или входящего открытого).
Пример использования:
var
I, Rez: Integer;
const
J = 23;
begin
I := 8;
Rez := AddEmUp([I, I + 50, J, 89]);
или
var
A: array of integer;
begin
SetLength(A, 10);
for i := Low(A) to High(A) do
A[i] := i;
Rez := AddEmUpConst(A);
Область видимости (scope) – это определенный участок программы, на протяжении которого данная функция известна компилятору. Глобальные константы видимы в любой точке программы, в то время как локальные переменные видны только в той функции, где они объявлены.
Пример использования:
program Foo;
const
SomeConstant = 100;
var
SomeGlobal: Integer;
Double;
function SomeProc;
var
D, LocalD: Double;
begin
LocalD := 10.0;
D := D - LocalD;
end;
begin
SomeGlobal := SomeConstant;
D := 4.593;
SomeProc;
end
Здесь переменные SomeConstant, SomeGlobal и D имеют глобальную область видимости, поэтому их значения видны компилятору в любой точке программы. Функция SomeProc() имеет две собственные локальные переменные D и LocalD. Любая попытка обратиться к переменной LocalD вне функции SomeProc() приведет к сообщению об ошибке. Обращение к переменной D внутри функции SomeProc() вернет значение ее локального экземпляра, тогда как обращение к переменной D вне функции вернет значение одноименной глобальной переменной.