Создание пользовательских функций. Передача аргументов

Очень часто процесс решения какой – либо задачи может быть мысленно представлен как последовательность решения более простых подзадач.

Процедуры и функции по своей структуре подобны обычным программам и имеют общее название – подпрограммы. Применение подпрограмм дает возможность уменьшить общее число повторении одной и той же последовательности операторов, а так же конструировать программу, как набор отдельных подпрограмм. Для сложных задач это существенно упрощает процесс программирования.

В программе описание процедур и функций обычно располагается между разделами переменных и операторов, но при этом необходимо помнить что любое имя в програм­ме должно быть обязательно описано перед тем, как оно появится среди исполняемых операторов. Каждая процедура или функция определяется только один раз, но может использоваться многократно.

В процедурах и функциях, как и в обычных программах, могут быть описаны собственные метки, константы, типы, собственные переменные и даже собственные проце­дуры и функции.

Описание функции подобно описанию процедуры, однако имеются некоторые отличия. Важнейшее из них заключается в том, что результатом работы функции является одно значение произвольного типа. Тип результата задается в заголовке функции, общий вид которого:

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 вне функции вернет значение одноименной глобальной переменной.