Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Отличия функции от процедуры




ПРОГРАММА С ИСПОЛЬЗОВАНИЕМ ПРОЦЕДУР И ФУНКЦИЙ ПОЛЬЗОВАТЕЛЯ

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

Строение функций и процедур

Функции и процедуры размещаются в разделе описаний.

Синтаксис описания процедуры:

<описание процедуры>::= <заголовок процедуры> <блок> Структура описания процедуры аналогична структуре про­граммы. Исключением является синтаксис заголовка про­цедуры.

Синтаксис заголовка процедуры: <заголовок пpoцедуры>::=procedure <идентификатор>

список формальных параметров>)];

Синтаксис описания функции: <описание функции>: =<заголовок> <блок>

Синтаксис заголовка функции:

<заголовок>::=function<идентификатор>[(<список формаль­ных параметров>)]:<тип функции>;

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

— глобальные переменные;

— локальные переменные;

— параметры.

Отличия функции от процедуры

—В функции результат присваивается идентификатору функции, поэтому после списка параметров через двоето­чие указывается тип функции.

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

—В подпрограмме результат могут получать только пара­метры из заданного списка.

—Результатом функции может быть только одиночное (ска­лярное) данное любого типа.

—В процедуре результатом может являться любое количе­ство параметров любого типа (ни одного, скалярные пере­менные, массивы, записи и пр.).

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

Синтаксис оператора вызова процедуры:

<оператор вызова процедуры>:: =<идентификатор>[(<факт. парам.>[,< факт, парам. >]...)];

<факт. парам.>::=<константа>|<переменная>|<выражение>

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

Синтаксис указателя функции:

<указатель функции>::=<идентификатор>[(<список фактиче­ских параметров>)]

С помощью элементов из списка формальных параметров происходит описание алгоритма, а с помощью элементов из списка фактических параметров происходит замещение соответствующих формальных параметров и вычисления по данному алгоритму.

Поэтому между фактическими и формальными параметра­ми должно быть следующее соответствие:

—количество фактических и формальных параметров должно быть одинаковым;

—порядок их следования должен быть идентичным;

—тип фактических и формальных параметров должен быть одинаковым.

<Список формальных параметров>::=([vаr] идентификатор [.идентификатор]...: тип [;[var] идентификатор [.идентифи­катор]...: тип]...)

Наличие или отсутствие перед параметром служебного сло­ва var определяет способ замещения формального параме­тра фактическим (наличие var — передача по имени, отсут­ствие — по значению).

Передача по значению означает, что для фактических и формальных параметров выделяются две разные облас­ти памяти. Значение фактического параметра пересылает­ся в область памяти формального параметра, если фор­мальный параметр изменит свое значение, значение фактического в своей области останется прежним. Нельзя передавать по значению фактические параметры, опреде­ляющие результат и файл, следует передавать по значению те параметры, которые задаются в виде констант или вы­ражений.

Передача по имени означает, что для фактического и фор­мального параметров выделяется одна область памяти. Когда фактический параметр получает какое-либо значение, формальному передается его адрес. Если формальный па­раметр поменяет свое значение, то и фактический получит новое значение. Нельзя передавать по имени фактический параметр-константу или фактический параметр-выражение, следует передавать по имени параметры, определяющие результаты и файлы, рекомендуется передавать по имени массивы, записи (это экономит память и время). Примечание: любая процедура или функция может быть оформлена как самостоятельный внешний файл, который будет вызываться из любых программ пользователей. В этом случае в разделе описаний вызывающей программы записывается инструкция include компилятору в виде: {$I идентификация файла} — т. е. устройство:\путь\полное имя.

Рекурсия

В Паскале процедуры и функции могут вызывать сами себя, то есть обладать свойством рекурсивности.

Пример. Выдать на печать в обратном порядке цифры целого положительного числа N. Составим процедуру REVERSE.

PROCEDURE REVERSE (N: integer);

Begin

Write (N mod 10);

If (N Div 10)<>0 Then REVERSE (N Div 10)

END;

Рассмотрим работу этой процедуры для числа N = 153.

  • Оператор Write (N mod 10) выведет на экран остаток от деления 153 на 10, то есть 3.
  • Оператор IF (N DIV 10)<>0 Then REVERSE (N DIV 10) проверяет целую часть частного 153/10 = 15 на ноль. Если целая часть не ноль, то с этим значением (15) идет вновь обращение к процедуре REVERSE.
  • Оператор Write (N MOD 10) выводит на экран остаток от деления 15 на 10, т.е.5; затем со значением 15/10 = 1 идет обращение к REVERSE.

После вывода цифры 1 оператором Write (N MOD 10) проба N DIV 10 на ноль передает управление на конец процедуры. На экране будет записано число 351.

Таким образом, однократное обращение извне к процедуре REVERSE вызвало ее трехкратное срабатывание. Условие полного окончания должно находиться в самой процедуре, иначе произойдет зацикливание.

Рекурсивные процедуры и функции (подпрограммы) имеют одну из двух форм: прямую рекурсию и косвенную рекурсию. В первом случае подпрограмма содержит оператор вызова этой же подпрограммы (как в примере с процедурой REVERSE). Во втором случае одна подпрограмма вызывает другую подпрограмму, которая либо сама, либо посредством других процедур или функций вызывает исходную подпрограмму.

Если А,В - имена подпрограмм, то схема вызова может быть такой: А-В-А. В случае косвенной рекурсии возникает проблема: как и где описать вызываемую подпрограмму. По правилам языка Паскаль каждая подпрограмма должна быть описана до её вызова. Но если подпрограмма А вызывает В, а В вызывает А, то получается замкнутый круг. Для подобных ситуаций принято следующее правило: одна из рекурсивных подпрограмм, вызывающих друг друга, описывается предварительно следующим образом:

PROCEDURE P(<Список формальных параметров>); FORWARD;

Здесь P - имя процедуры, FORWARD - ключевое слово. Это описание указывает транслятору, что текст процедуры Р помещен ниже. Подобным же образом описывается функция: к оператору FUNCTION добавляется слово FORWARD. Список формальных параметров и тип результата (для FUNCTION) включается только в это предварительное описание и опускается в заголовке соответствующей функции.

Замечание редактора: в современных трансляторах языка Паскаль (например, Turbo Pascal 5.0) такого строгого ограничения нету. Можно описывать функцию или процедуру полностью и в предварительном описании, и в объявлении.

Пример. Пусть функция В при работе вызывает функцию А которая, в свою очередь, вызывает функцию В. Тогда эти модули можно описать так:

FUNCTION B(X: INTEGER): REAL; FORWARD;

FUNCTOIN A(Y: INTEGER): REAL;

BEGIN

:

A:=B(I)+3.5;

END;

FUNCTION B;

BEGIN

..........

B:=A(D)-1.8;

END;

Заголовок (FUNCTON B) перед текстом функции В содержит только имя функции, а список формальных параметров и тип функции не указываются.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных