Паскаль - Процедуры

Procedures подпрограммы, которые вместо возврата одного значения позволяют получить группу результатов.

Определение процедуры

В Паскале процедура определяется с помощью procedureключевое слово. Общая форма определения процедуры следующая:

procedure name(argument(s): type1, argument(s): type 2, ... );
   < local declarations >
begin
   < procedure body >
end;

Процедура definition в Паскале состоит из header, местный declarations и bodyпроцедуры. Заголовок процедуры состоит из ключевого словаprocedureи имя, данное процедуре. Вот все части процедуры -

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

  • Local declarations - Локальные объявления относятся к объявлениям меток, констант, переменных, функций и процедур, которые применимы только к телу процедуры.

  • Procedure Body- Тело процедуры содержит набор операторов, которые определяют, что делает процедура. Его всегда следует заключать между зарезервированными словами begin и end. Это часть процедуры, в которой выполняются все вычисления.

Ниже приведен исходный код процедуры findMin () . Эта процедура принимает 4 параметра x, y, z и m и сохраняет минимум среди первых трех переменных в переменной с именем m. Переменная m передаетсяreference (мы обсудим передачу аргументов по ссылке немного позже) -

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 }

Объявления процедур

Процедура declarationсообщает компилятору имя процедуры и способ ее вызова. Фактическое тело процедуры можно определить отдельно.

Объявление процедуры имеет следующий синтаксис -

procedure name(argument(s): type1, argument(s): type 2, ... );

Обратите внимание, что name of the procedure is not associated with any type. Для указанной выше процедуры 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

Ниже приводится еще один пример, который генерирует Fibonacci Series для данного числа с помощью recursive функция -

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

Аргументы подпрограммы

Если подпрограмма (function or procedure) заключается в использовании аргументов, он должен объявлять переменные, которые принимают значения аргументов. Эти переменные называютсяformal parameters подпрограммы.

Формальные параметры ведут себя как другие локальные переменные внутри подпрограммы и создаются при входе в подпрограмму и уничтожаются при выходе.

При вызове подпрограммы аргументы могут быть переданы в подпрограмму двумя способами:

Старший Нет Тип звонка и описание
1 Звоните по цене

Этот метод копирует фактическое значение аргумента в формальный параметр подпрограммы. В этом случае изменения, внесенные в параметр внутри подпрограммы, не влияют на аргумент.

2 Звоните по ссылке

Этот метод копирует адрес аргумента в формальный параметр. Внутри подпрограммы адрес используется для доступа к фактическому аргументу, используемому в вызове. Это означает, что изменения, внесенные в параметр, влияют на аргумент.

По умолчанию Паскаль использует call by valueпередавать аргументы. В общем, это означает, что код внутри подпрограммы не может изменять аргументы, используемые для вызова подпрограммы. Программа-пример, которую мы использовали в главе «Паскаль - Функции», вызвала функцию с именем max (), используяcall by value.

Принимая во внимание, что приведенный здесь пример программы ( exProcedure ) вызывает процедуру findMin (), используяcall by reference.