Правила использования подпрограмм


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

2. В подпрограммах допускается наличие вложенных подпрограмм, количество вложений не ограничено.

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

4. Работа процедуры или функции завершается после выполнения последнего оператора ее тела. Язык Турбо-Паскаль содержит дополнительное средство прерывания выполнения подпрограммы или программы в целом, это системная процедура Exit. Она возвращает управление в точку вызова. Данная процедура является избыточной и предназначена только для устранения безусловного перехода на конец подпрограммы или программы в целом, поэтому, при наличии нескольких вариантов, лучше обходиться без нее. Так, использование второго варианта подпрограммы более предпочтительно.

Procedure P(x,y:real; Var Res:real);

Begin

If x<y Then Exit;

Res:=Sqrt(x*x-y*y)

End;

 

Procedure P(x,y:real; Var Res:real);

Begin

If x>=y Then Res:=Sqrt(x*x-y*y)

End;

Рекурсия

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

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

Большинство циклических алгоритмов с известным количеством повторений можно записать с помощью рекурсии, например, вычисление факториала или суммы:

Program SumRec;

Var S:real;

Procedure Sum(Var S:real;N:integer);

Begin

If N=1 then

S:=1

Else

Begin

Sum(S,N-1);

S:=S+1/N

end

end;

Begin

sum(S,100);

Writeln('Сумма=',S:10:4)

end.

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

Директивы

Директивы используются для задания параметров трансляции, а так же при описании программ. Единственной стандартной директивой языка Паскаль является директива опережающего описания Forward.

Так как имена в Паскале просматриваются последовательно, то при обращении одной программы к другой последняя должна быть описана ранее вызывающей подпрограммы. Если этого сделать нельзя, например, при перекрестных ссылках, то используется директива Forward.

При этом в начале раздела описывается только заголовок подпрограммы, а сама подпрограмма записывается далее через несколько блоков, но только с указанием в заголовке его имени, например:

Procedure Q(x:T); Forward;

Procedure P(y:T);

Begin

Q(A);

end;

Procedure Q;

Begin

P(B);

end;

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

В Турбо-Паскале есть еще несколько директив, относящимся к подпрограммам. Если подпрограмма или группа подпрограмм разработана вне системы Турбо-Паскаль, например, на языке Ассемблер или Си, а их объектный код находится в объектном файле, то такую подпрограмму можно подключить с помощью директивы External, дополнительно задав директиву компилятора $L с именем OBJ-файла:

Procedure SqRoots(A,B,C:word); external;

{$L ROOTS.OBJ}

Для обеспечения корректности такого подключения необходимо соблюдать определенные межъязыковые соглашения о связях.

Другим вариантом создания машинного кода подпрограмм с непосредственным указанием машинных команд является директива Inline. Так же можно составлять программы с использованием мнемонических или ассемблерных обозначений команд, используя директиву Assembler.

Для подпрограммы допускается указание типа вызова процедуры: дальний (межсегментный) или ближний (внутри одного сегмента), задаваемые соответственно словами Far и Near. Они эквивалентны директивам компилятора {$F+} и {$F‑}.

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

Процедурные типы

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

Общее описание процедурного типа следующее:

 

Type <имя типа>=Function (<список параметров>):<тип>;

Type <имя типа>=Procedure (<список параметров>);

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

1. Подпрограмма, присваиваемая процедурной переменной, должна быть оттранслирована в режиме дальнего типа вызова (см. пример ниже).

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

3. Данные подпрограммы не могут быть вложенными в другие подпрограммы.

4. Такие подпрограммы не могут быть процедурами прерываний.



Дата добавления: 2016-06-29; просмотров: 1931;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

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

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.