Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatica / lin.doc
Скачиваний:
41
Добавлен:
09.04.2015
Размер:
776.19 Кб
Скачать

Подпрограммы-процедуры

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

<описание процедуры>::=<заголовок процедуры>;<блок>

<заголовок процедуры>::=procedure<имя процедуры>|

procedure<имя процедуры>(<список формальных параметров>)

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

<списокформ.пар.>::=<секцияформ.пар.>{;<секция форм. пар.>}

<секция форм. пар.>::=<имя>{,<имя>}:<имя типа>|

var<имя>{,<имя>}:<имя типа>|

const<имя>{,<имя>}:<имя типа>

Здесь <имя> – идентификатор.

Для активации процедуры, т.е. для выполнения фрагмента про­граммы, объявленного процедурой, в нужном месте программы запи­сывается оператор процедуры.

<оператор процедуры>::=<имя процедуры>|

<имя процедуры>(<список фактических параметров>)

<список фактических параметров>::=<фактический параметр>

{,<фактический параметр>}

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

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

Подпрограммы-функции

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

Для определения функции служит размещаемое в разделе проце­дур и функций описание функции, похожее на описание процедуры.

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

<заголовок функции>::=function <имя функции>:<имя типа>|

function<имя функции>(<список форм. параметров>):<имя типа>

Cледует обратить внимание на два момента:

  1. после имени функции и параметров в скобках ставится двоеточие и указывается тип возвращаемого значения.

  2. в теле функции должен присутствовать хотя бы один оператор вида

<имя функции>:=<выражение>

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

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

Подпрограмму-функцию можно вызвать так же, как процедуру, если нас не интересует возвращаемый результат, а важны действия, кото­рые она выполняет. Такая возможность задается с помощью директивы {$X+}(расширенный синтаксис, установленный по умолчанию).

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

Пример.

Функцию f(n) = n! можно определить рекурсивно

На Паскале допустима такая подпрограмма-функция

functionfact1(n: integer): integer;

begin if n = 0 then fact1:=1 else fact1:=n*fact1(n-1) end;

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

Любое рекурсивное определение функции можно заменить не рекурсивным. Рекурсивность – это свойство описания функции, а не самой функции. Что предпочтительнее? Рекурсивное описание обычно короче и нагляднее, а не рекурсивное – длиннее. На вычисление рекур­сивной функции затрачивается больше машинного времени и памяти из-за повторных обращений к функции и дублирования локализованных в ней переменных. Выбор способа описания функции – это выбор между компактностью и эффективностью.

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

  • локальные переменныезаданы и доступны только в подпрограмме;

  • глобальные переменные, объявленные в охватывающем подпро­грамму блоке, доступны этому блоку и подпрограмме;

  • формальные параметры, записаные в заголовке, доступны вызываю­щей программной единице и подпрограмме.

Способ обмена данными с помощью глобальных переменных применяют только в простейших программах. Универсальным способом обмена данными является использование формальных параметров.

Соседние файлы в папке Informatica