Процедуры и функции в Паскале (как и во почти всех остальных языках программирования) являются комфортным средством для однократного автономного описания тех фрагментов метода, которые повторяются в различных его частях. Такие описания образуют раздел, который должен быть крайним из числа разделов описаний программы. Для выполнения обрисованных в этом разделе фрагментов метода в разделе операторов программы должны содержаться обращения к подходящим процедурам и функциям. В неких языках программирования (к примеру, Бейсик, Фортран) такие автономные описания частей метода именуют подпрограммами. Тут этот термин, стало быть, будет употребляться для общего обозначения процедур и функций. Описание подпрограммы состоит из заголовка и блока. Заголовок процедуры имеет вид:
Procedure < имя
> (< список формальных параметров >);
Заголовок функции:
Function < имя
>(< список формальных параметров >): < тип >;
Перечень формальных характеристик необязателен и может отсутствовать. Ежели же он есть, то в нем должны быть перечислены, мягко говоря, имена формальных характеристик и их тип. Несколько однотипных характеристик можно объединять в подсписки, к примеру: Procedure SB( a : Real; b,d : Integer; c : Char); Операторы подпрограммы как раз разглядывают перечень формальных характеристик как типичное расширение раздела описаний: все переменные из этого перечня могут употребляться снутри подпрограммы. Обращение к подпрограммам осуществляется указанием имени подпрограммы и перечня фактических характеристик, в качестве которых могут так сказать выступать константы, переменные и выражения, отделяемые друг от друга запятой. Количество и типы фактических характеристик при обращении к подпрограмме должны точно соответствовать количеству и типам ее формальных характеристик. В момент обращения к подпрограмме происходит подмена формальных характеристик на фактические. Таковым образом осуществляется настройка метода подпрограммы на определенную задачку. Само обращение к процедурам и функциям происходит по различному. Для обращения к процедуре употребляется особый оператор, состоящий из имени процедуры и перечня фактических характеристик. Для обращения к функции ее имя со перечнем фактических характеристик обязано войти как операнд в некое выражение. Отсюда, в конце концов, вытекает несколько различий описания функции от описания процедуры: - в виде функции, вообщем то, описывается метод, результатом выполнения которого является скалярная величина; - в блоке функции должен быть хотя бы один оператор присваивания с именованием функции в левой части; - в заголовке функции должен быть указан тип функции (тип возвращаемого через имя функции результата). Хоть какой из формальных характеристик подпрограммы быть может или параметром-значением, или параметром-переменной. В прошлом примере характеристики были определены как параметры-значения. Ежели характеристики определяются как параметры-переменные, перед ними нужно ставить зарезервированное слово Var, к примеру: Procedure
FF( Var a : Real);
Если формальный параметр объявлен как
параметр-переменная, то при обращении к подпрограмме ему должен
соответствовать
фактический параметр в виде переменной нужного типа; если формальный
параметр
объявлен как параметр-значение, то при обращении ему может
соответствовать
выражение.
Для того, чтобы понять, в каких случаях
использовать параметры-значения, а в каких - параметры переменные,
рассмотрим,
как осуществляется замена формальных параметров на фактические в момент
обращения к подпрограмме.
Если параметр определен как
параметр-значение,
то перед вызовом подпрограммы это значение вычисляется, полученный
результат
копируется во временную память и передается подпрограмме. Если же
параметр
определен как параметр-переменная, то при вызове подпрограммы передается
сама переменная, а не ее копия. Любые возможные изменения в подпрограмме
параметра-значения никак не воспринимаются вызывающей программой, так
как
в этом случае изменяется копия фактического параметра, в то время как
изменения
параметра-переменной приводит к изменению самого фактического параметра
в вызывающей программе.
Поэтому параметры-переменные могут
использоваться
как "средство связи" алгоритма, реализованного в подпрограмме, с
"внешним
миром”, в частности, с помощью этих параметров процедура передает
результаты
своей работы вызывающей программе.
Однако, злоупотребление этими
возможностями
делает программу, как правило, трудной в понимании и сложной в отладке.
В соответствии с требованиями хорошего стиля программирования
рекомендуется
использовать передачу результатов через фактические параметры для
процедур
и через имя для функций.
Переменные, описанные в разделе
описаний
переменных подпрограммы, называются локальными переменными
этой подпрограммы и доступны только в ней.
Концепция глобальных и локальных имен
относится не только к переменным но и к другим описываемым объектам
Паскаля:
константам, типам, процедурам и функциям.
Пример.
В программе задается
два целых числа 5 и 7, эти числа передаются процедуре Inc2,
в которой они удваиваются. Один из параметров передается как
параметр-переменная,
другой - как параметр-значение. Значения параметров до и после вызова
процедуры,
а так же результат их удвоения выводятся на экран.
Program
Exampl;
Var
a,b: Integer;
Procedure
Inc2(Var c: Integer; b: Integer);
Begin
c := c + c;
b := b + b;
Writeln(‘Удвоенные :’, c:5, b:5)
End; {Inc2}
Begin
{Main}
a:=5; b:=7;
Writeln(‘Исходные :’, a:5, b:5); Inc2(a, b);
Writeln(‘Результат :’, a:5, b:5)
End.
{Main}
В результате
прогона программы будет выведено:
Исходные : 5
7
Удвоенные :
10 14
Результат :
10 7
Пример.
Описать функцию,
вычисляющую факториал и использовать ее для вычисления
Program
Calc;
Var
n,m: Integer; f: Real;
Function
fact(n: Integer): Integer;
Var
i,p : Integer;
Begin
p:=1;
For i:=2 To n do p := p* i;
fact:= p
End;
Begin
Read(m,n);
f:= fact(n) * fact(m) / fact(n+m);
Writeln(f)
End.
|