ТОР 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.
После вывода цифры 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) перед текстом функции В содержит только имя функции, а список формальных параметров и тип функции не указываются. Не нашли, что искали? Воспользуйтесь поиском:
|