Подпрограммы: процедуры и функции |
Содержание | Назад | Вперед |
Подпрограмма это часть программы, оформленная в виде отдельной синтаксической конструкции и снабженная именем. "Вызов" подпрограммы, т.е. выполнение действий, заданных в подпрограмме в виде операторв, может быть произведен в некоторой точке программы посредством указания имени этой подпрограммы. Кроме задания последовательности действий, любая подпрограмма может содержать описание некоторой совокупности локальных объектов - констант, типов, переменных и т.д. Эти объекты предназначены для организации действий внутри подпрограммы и имеют смысл (т.е. доступны или видимы) только внутри данной подпрограммы [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.
Содержание | Назад | Вперед |
Права на материал принадлежат их авторам