Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




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

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

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

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

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

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

 




Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 264; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.027 сек.