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

Содержание |  Назад  |  Вперед

Общая структура подпрограммы

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

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

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

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

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

PROCEDURE ИмяПроцедуры ( СписокФормальныхПараметров );
LABEL
  Перечисление меток внутри тела процедуры
CONST
  Описание локальных констант
TYPE
  Описание локальных типов
VAR
  Описание локальных переменных
BEGIN
  Тело процедуры
END.

Пример описания и вызова процедуры:

PROGRAM Example_of_Procedure;
USES CRT;

PROCEDURE ChangeColor( C1, C2 : Word );
BEGIN

  TextColor(C1);
  TextBackGround(C2)
END;

BEGIN
  ChangeColor( Yellow, Blue ); { Вызов процедуры }
  ClrScr; { Ощичаем экран }
  ...
  ...
END.

Описание функции:

FUNCTION ИмяФункции ( СписокФормальныхПараметров ) : ТипЗначения;
LABEL
  Перечисление меток внутри тела процедуры
CONST
  Описание локальных констант
TYPE
  Описание локальных типов
VAR
  Описание локальных переменных
BEGIN
  Вычисление значения функции;
  ИмяФункции := ВычисленноеЗначение
END.

Для присвоения функции вычисленного значения ее имя должно хотя бы раз появиться в левой части оператора присванивания в теле самой функции (ИмяФункции := ВычисленноеЗначение).

Пример описания и вызова функции:

PROGRAM Example_of_Function;
USES CRT;
VAR a : Integer;

FUNCTION Factorial( n : Integer ) : LongInt;
VAR
  F : LongInt;
  k : Integer;
BEGIN

  F:=1;
  for k:=1 to n do F:=F*k;
  Factorial := F
END;

BEGIN
  ClrScr;
  Write('Введите целое число a: ');
  ReadLn(a);
  Writeln('Факториал а = ', Factorial(a) );
  ReadLn;
END.

Параметры подпрограмм

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

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

Синтаксис описания параметров-значений:

ИмяПодпрограммы ( P1, P2, ..., PN : Тип );

или

ИмяПодпрограммы ( P1 : Тип1; P2 : Тип2; ... );

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

ВАЖНО! В качестве фактических параметров подпрограммы, подставляемых на место фомальных параметров-значений, могут выступать: переменные, константы и выражения (точнее их значения), причем их типы должны быть совместимы по присваиванию с типами соответствующих формальных параметров-значений.

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

Синтаксис описания параметров-переменных:

ИмяПодпрограммы ( VAR P1, P2, ..., PN : Тип );

или

ИмяПодпрограммы ( VAR P1 : Тип1; VAR P2 : Тип2; ... );

Описание параметров-переменных отличается от описание параметров-значений лишь наличием ключевого слова VAR перед идентификатором параметра.

ВАЖНО! В качестве фактических параметров подпрограммы, подставляемых на место фомальных параметров-переменных, могут выступать ТОЛЬКО ИДЕНТИФИКАТОРЫ ПЕРЕМЕННЫХ.

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

Синтаксис описания параметров-констант:

ИмяПодпрограммы ( CONST P1, P2, ..., PN : Тип );

или

ИмяПодпрограммы ( CONST P1 : Тип1; CONST P2 : Тип2; ... );

Одно важное замечание:  при описание формальных параметров подпрограмм не допускается конструирование типов данных; тип параметра должен быть задан идентификаторм. Например, будет ошибкой описать параметр для передачи массива следующим образом:

PROCEDURE PrintVector( V : array[1..10] of Real );

Правильное описание параметра показано ниже

TYPE
  Tvector = array[1..10] of Real;

PROCEDURE PrintVector( V : Tvector );

 

Открытые параметры-массивы

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

Синтаксис описания открытых параметров-массивов:

ИмяПодпрограммы ( VAR P : array of ТипЭлементов );

Это единственное исключение из правила, согласно которому типы формальных параметров в заголовках подпрограмм могут задаваться только посредством идентификаторов (см. замечание выше). Подпрограмма, содержащая открытый массив в списке своих формальных параметров, может быть вызвана с массивом ЛЮБОГО размера (типы элементов массивов из формального и фактического параметров должны, естественно, совпадать). Заметим, что в качетсве открытых массивов допускаются ТОЛЬКО одномерные массивы [1].

Реальные границы переданного в подпрограмму массива можно определить используя две функции Low и High. Эти функции предназначены для определения граничных значений типов и переменных. В данном случае функция Low будет всегда возвращать 0, а функция High - верхнее значение индекса равное (n-1), где n-число элементов в переданном массиве. Например:

PROGRAM TestOpenArray;
VAR
  A : array[-5..5] of Byte;

PROCEDURE
P( var V : array of Byte );
BEGIN
  WriteLn('Нижний индекс V: ', Low(V));
  WriteLn('Верхний индекс V: ', High(V));
END;

BEGIN
  WriteLn('Нижний индекс A: ', Low(A));
  WriteLn('Верхний индекс A: ', High(A));
  P(A);
  ReadLn;
END.

Выполнение этой программы приведет к выводу на экран следующей информации:

Нижний индекс А: -5
Верхний индекс А: 5
Нижний индекс V: 0
Верхний индекс V: 10

В качестве полезного примера приведем функцию вычисляющую сумму элементов произвольного массива вещественных чисел [1]:

FUNCTION Sum( var V : array of Real ) : Real;
VAR
  i : Word;
  S : Real;
BEGIN
  S := 0;
  for i:=Low(V) to High(V) do S := S + V[i];
  Sum := S
END;

[1] Е.А.Зуев, Программирование на языке Turbo Pascal 6.0/7.0 -М.: Радио и связь, 1993.

Содержание |  Назад  |  Вперед