Процедуры — это подпрограммы, которые вместо того, чтобы возвращать одно значение, позволяют получить группу результатов.
Определение процедуры
В Паскале процедура определяется с помощью ключевого слова процедуры . Общая форма определения процедуры следующая:
procedure name(argument(s): type1, argument(s): type 2, ... ); < local declarations > begin < procedure body > end;
Определение процедуры в Pascal состоит из заголовка , локальных объявлений и тела процедуры. Заголовок процедуры состоит из ключевого слова процедуры и имени, присвоенного процедуре. Вот все части процедуры —
-
Аргументы — Аргументы (аргументы) устанавливают связь между вызывающей программой и идентификаторами процедур, а также вызывают формальные параметры. Правила для аргументов в процедурах такие же, как и для функций.
-
Локальные объявления — Локальные объявления относятся к объявлениям для меток, констант, переменных, функций и процедур, которые применимы только к основной части процедуры.
-
Тело процедуры — Тело процедуры содержит набор операторов, которые определяют, что делает процедура. Он всегда должен быть заключен между зарезервированными словами начало и конец. Это часть процедуры, в которой выполняются все вычисления.
Аргументы — Аргументы (аргументы) устанавливают связь между вызывающей программой и идентификаторами процедур, а также вызывают формальные параметры. Правила для аргументов в процедурах такие же, как и для функций.
Локальные объявления — Локальные объявления относятся к объявлениям для меток, констант, переменных, функций и процедур, которые применимы только к основной части процедуры.
Тело процедуры — Тело процедуры содержит набор операторов, которые определяют, что делает процедура. Он всегда должен быть заключен между зарезервированными словами начало и конец. Это часть процедуры, в которой выполняются все вычисления.
Ниже приведен исходный код процедуры с именем findMin () . Эта процедура принимает 4 параметра x, y, z и m и сохраняет минимум среди первых трех переменных в переменной с именем m. Переменная m передается по ссылке (мы обсудим передачу аргументов по ссылке чуть позже) —
procedure findMin(x, y, z: integer; var m: integer); (* Finds the minimum of the 3 values *) begin if x < y then m := x else m := y; if z <m then m := z; end; { end of procedure findMin }
Процедурные объявления
Объявление процедуры сообщает компилятору об имени процедуры и о том, как вызвать процедуру. Фактическое тело процедуры может быть определено отдельно.
Объявление процедуры имеет следующий синтаксис —
procedure name(argument(s): type1, argument(s): type 2, ... );
Обратите внимание, что название процедуры не связано ни с каким типом . Для описанной выше процедуры findMin () ниже приводится объявление —
procedure findMin(x, y, z: integer; var m: integer);
Вызов процедуры
При создании процедуры вы даете определение того, что процедура должна делать. Чтобы использовать процедуру, вам придется вызвать эту процедуру для выполнения определенной задачи. Когда программа вызывает процедуру, управление программой передается вызываемой процедуре. Вызываемая процедура выполняет определенную задачу, и когда ее последний оператор завершения достигнут, она возвращает элемент управления обратно вызывающей программе.
Чтобы вызвать процедуру, вам просто нужно передать необходимые параметры вместе с именем процедуры, как показано ниже —
program exProcedure; var a, b, c, min: integer; procedure findMin(x, y, z: integer; var m: integer); (* Finds the minimum of the 3 values *) begin if x < y then m:= x else m:= y; if z < m then m:= z; end; { end of procedure findMin } begin writeln(' Enter three numbers: '); readln( a, b, c); findMin(a, b, c, min); (* Procedure call *) writeln(' Minimum: ', min); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Enter three numbers: 89 45 67 Minimum: 45
Рекурсивные подпрограммы
Мы видели, что программа или подпрограмма может вызывать другую подпрограмму. Когда подпрограмма вызывает себя, она называется рекурсивным вызовом, а процесс называется рекурсией.
Чтобы проиллюстрировать концепцию, давайте вычислим факториал числа. Факториал числа n определяется как —
n! = n*(n-1)! = n*(n-1)*(n-2)! ... = n*(n-1)*(n-2)*(n-3)... 1
Следующая программа вычисляет факториал данного числа, вызывая себя рекурсивно.
program exRecursion; var num, f: integer; function fact(x: integer): integer; (* calculates factorial of x - x! *) begin if x=0 then fact := 1 else fact := x * fact(x-1); (* recursive call *) end; { end of function fact} begin writeln(' Enter a number: '); readln(num); f := fact(num); writeln(' Factorial ', num, ' is: ' , f); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Enter a number: 5 Factorial 5 is: 120
Ниже приведен еще один пример, который генерирует ряд Фибоначчи для заданного числа с использованием рекурсивной функции —
program recursiveFibonacci; var i: integer; function fibonacci(n: integer): integer; begin if n=1 then fibonacci := 0 else if n=2 then fibonacci := 1 else fibonacci := fibonacci(n-1) + fibonacci(n-2); end; begin for i:= 1 to 10 do write(fibonacci (i), ' '); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
0 1 1 2 3 5 8 13 21 34
Аргументы подпрограммы
Если подпрограмма ( функция или процедура ) должна использовать аргументы, она должна объявлять переменные, которые принимают значения аргументов. Эти переменные называются формальными параметрами подпрограммы.
Формальные параметры ведут себя как другие локальные переменные внутри подпрограммы и создаются при входе в подпрограмму и уничтожаются при выходе.
При вызове подпрограммы есть два способа передачи аргументов в подпрограмму:
Sr.No | Тип звонка и описание |
---|---|
1 | Звонок по значению
Этот метод копирует фактическое значение аргумента в формальный параметр подпрограммы. В этом случае изменения, внесенные в параметр внутри подпрограммы, не влияют на аргумент. |
2 | Звоните по ссылке
Этот метод копирует адрес аргумента в формальный параметр. Внутри подпрограммы адрес используется для доступа к фактическому аргументу, используемому в вызове. Это означает, что изменения, внесенные в параметр, влияют на аргумент. |
Этот метод копирует фактическое значение аргумента в формальный параметр подпрограммы. В этом случае изменения, внесенные в параметр внутри подпрограммы, не влияют на аргумент.
Этот метод копирует адрес аргумента в формальный параметр. Внутри подпрограммы адрес используется для доступа к фактическому аргументу, используемому в вызове. Это означает, что изменения, внесенные в параметр, влияют на аргумент.
По умолчанию Паскаль использует вызов по значению для передачи аргументов. В общем, это означает, что код внутри подпрограммы не может изменять аргументы, используемые для вызова подпрограммы. Пример программы, которую мы использовали в главе «Паскаль — Функции», вызывал функцию max () с использованием вызова по значению .
Принимая во внимание, что пример программы, представленной здесь ( exProcedure ), вызывает процедуру findMin (), используя вызов по ссылке .