Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

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

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

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

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

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

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.