Теоретические сведения

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

В языке Pascal подпрограмма является частью основной программы, ее описание располагается в описательной части программы, т.е. перед первым begin программы.

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

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

Различают два вида подпрограмм – процедуры и функции. Далее рассмотрим подпрограммы-процедуры.

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

 

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

[<раздел описаний>]

Begin

<перечисление операторов и программных единиц>

End;

 

Таким образом, процедуры имеют структуру, аналогичную главной программе и содержат:

 

· заголовок со специальным словом procedure – признаком подпрограммы, именем процедуры и необязательным списком формальных параметров – данных, передаваемых на обработку и получаемых из процедуры;

· все разделы описаний, необходимые для работы подпрограммы: метки, константы, типы, переменные и подпрограммы;

· раздел операторов, содержащий собственно алгоритм подпрограммы.

 

При работе с подпрограммой всегда выделяется два этапа:

· описание подпрограммы, т.е. запись алгоритма решения задачи в специальной форме;

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

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

 

Обмен данными между процедурой и вызывающей программой

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

 

Program Example1;

{Описание процедуры}

Procedure Hello; {Заголовок процедуры}

Begin

Writeln (‘Привет!’) {Исполняемый оператор процедуры}

End;

{Раздел операторов основной программы}

 

Begin

Hello; {Вызов процедуры}

Hello;

Hello

End.

 

Процедура Hello при каждом вызове (а их в основной программе три) делает одно и то же – просто выводит слово на печать.

Процедуры, подобные приведенной, встречаются довольно редко. Обычно при выполнении процедуры реализуется такая схема:

Исходные данные à Алгоритм процедуры à Результат.

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

 

Использование глобальных переменных для обмена данными

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

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

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

Задача 1. Найти минимальное из трех вещественных чисел

z = min (a, b, c), где z, a, b, c Î R.

Для решения задачи напишем процедуру, находящую минимальное из двух чисел и дважды последовательно вызовем ее для решения задачи, т.е. вначале найдем z = min (a,b), а затем z = min (z,c).

Program Min1;

{Описание переменных}

Var a,b,c, {исходные данные задачи}

x,y, {исходные данные функции}

z : real; {результат функции и результат задачи}

{Описание процедуры}

Procedure Min;