2. ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ПАСКАЛЕ

 

2.6. Подпрограммы

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

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

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

 

Функции

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

1) зарезервированного слова function;

2) имени подпрограммы – функции;

3) заключенного в круглые скобки списка формальных параметров;

4) типа возвращаемого функцией значения.

 

Пример заголовка функции:

function  step  ( n  :  integer ;  x, y : real ) :  real;

 


               имя      формальные параметры    тип результата

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

step : = sin (n * x * x) ;

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

Пример. Функция, которая возвращает максимальное из двух целых чисел:

function max ( a, b: integer): integer;

  begin

    if a > f  then  max: = a  else  max: = b;

  end;

 

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

Например, обращение к функции max может иметь вид:

max ( x + 5, y)

При таком обращении формальные параметры а и b заменяются фактическими параметрами  х +5  и  у, соответственно.

 

Процедуры

Заголовок процедуры состоит из:

1) зарезервированного слова procedure;

2) имени;

3) списка формальных параметров.

 

Процедура, как и функция, вызывается по ее имени с указанием фактических параметров в круглых скобках: имя (фактические параметры);

Основное отличие процедур от функций состоит в том, что имени функции присваивается возвращаемое значение, а имени процедуры – нет.

Пример: программа, использующая процедуру, которая выводит на экран строку, состоящую из звездочек. Длина строки (количество звездочек) является параметром процедуры.

Program primer;

Var

   n : integer;

procedure starline  ( k : integer); {заголовок процедуры}

   var

      i : integer; {описание переменной для процедуры}

   begin {начало тела подпрограммы}

      for i : = 1 to k do

         write ( ′ * ′ );

   end; {конец тела подпрограммы}

begin {начало основной программы}

   write ( ′ n = ′ ); readln (n);

   starline  (n); {вызов подпрограммы}

end.

 

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

Например:

const

  n=5; m=6;

type

  mas = array [1..n, 1..m] of real;

var

  m : mas;

procedure pr(a : mas);

 

В этом случае обращение к процедуре в вызывающей программе будет иметь вид : pr(m);  При этом формальный параметр – массив а – принимает значение фактического параметра – массива m.

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

 

Область действия параметров

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

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

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

Например, пусть структура блоков некоторой Паскаль-программы схематически может быть изображена таким образом:

 

 

Объекты, описанные в блоке В, известны (видимы), кроме самого блока В, еще и в блоках C и D, но невидимы в блоке А. Объекты, описанные в блоке F, известны только в пределах этого блока.