Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Pascal.doc
Скачиваний:
5
Добавлен:
18.11.2018
Размер:
138.75 Кб
Скачать

6. Процедуры и функции.

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

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]