Pascal - Procedimentos

Procedures são subprogramas que, ao invés de retornar um único valor, permitem obter um conjunto de resultados.

Definindo um Procedimento

Em Pascal, um procedimento é definido usando o procedurepalavra-chave. A forma geral de uma definição de procedimento é a seguinte -

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

Um procedimento definition em Pascal consiste em um header, local declarations e um bodydo procedimento. O cabeçalho do procedimento consiste na palavra-chaveproceduree um nome dado ao procedimento. Aqui estão todas as partes de um procedimento -

  • Arguments- O (s) argumento (s) estabelecem a ligação entre o programa de chamada e os identificadores do procedimento e também chamados de parâmetros formais. As regras para argumentos em procedimentos são iguais às das funções.

  • Local declarations - As declarações locais referem-se às declarações para rótulos, constantes, variáveis, funções e procedimentos, que são aplicáveis ​​apenas ao corpo do procedimento.

  • Procedure Body- O corpo do procedimento contém uma coleção de instruções que definem o que o procedimento faz. Deve sempre ser colocado entre as palavras reservadas início e fim. É a parte de um procedimento onde todos os cálculos são feitos.

A seguir está o código-fonte para um procedimento chamado findMin () . Este procedimento usa 4 parâmetros x, y, z e me armazena o mínimo entre as três primeiras variáveis ​​na variável chamada m. A variável m é passada porreference (discutiremos a passagem de argumentos por referência um pouco mais tarde) -

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 }

Declarações de procedimento

Um procedimento declarationinforma ao compilador sobre o nome de um procedimento e como chamá-lo. O corpo real do procedimento pode ser definido separadamente.

Uma declaração de procedimento tem a seguinte sintaxe -

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

Observe que o name of the procedure is not associated with any type. Para o procedimento acima definido findMin () , a seguir está a declaração -

procedure findMin(x, y, z: integer; var m: integer);

Chamando um Procedimento

Ao criar um procedimento, você dá uma definição do que o procedimento deve fazer. Para usar o procedimento, você terá que chamar aquele procedimento para executar a tarefa definida. Quando um programa chama um procedimento, o controle do programa é transferido para o procedimento chamado. Um procedimento chamado executa a tarefa definida e, quando sua última instrução final é alcançada, ele retorna o controle ao programa de chamada.

Para chamar um procedimento, você simplesmente precisa passar os parâmetros necessários junto com o nome do procedimento conforme mostrado abaixo -

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.

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Enter three numbers:
89 45 67
Minimum: 45

Subprogramas recursivos

Vimos que um programa ou subprograma pode chamar outro subprograma. Quando um subprograma chama a si mesmo, é referido como uma chamada recursiva e o processo é conhecido como recursão.

Para ilustrar o conceito, vamos calcular o fatorial de um número. Fatorial de um número n é definido como -

n! = n*(n-1)!
   = n*(n-1)*(n-2)!
      ...
   = n*(n-1)*(n-2)*(n-3)... 1

O programa a seguir calcula o fatorial de um determinado número chamando a si mesmo recursivamente.

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.

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Enter a number:
5
Factorial 5 is: 120

A seguir está outro exemplo, que gera o Fibonacci Series para um determinado número usando um recursive função -

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.

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

0 1 1 2	3 5 8 13 21 34

Argumentos de um Subprograma

Se um subprograma (function or procedure) é usar argumentos, ele deve declarar variáveis ​​que aceitam os valores dos argumentos. Essas variáveis ​​são chamadas deformal parameters do subprograma.

Os parâmetros formais se comportam como outras variáveis ​​locais dentro do subprograma e são criados na entrada no subprograma e destruídos na saída.

Ao chamar um subprograma, existem duas maneiras de os argumentos serem passados ​​para o subprograma -

Sr. Não Tipo e descrição da chamada
1 Chamada por valor

Este método copia o valor real de um argumento para o parâmetro formal do subprograma. Nesse caso, as alterações feitas no parâmetro dentro do subprograma não têm efeito no argumento.

2 Chamada por referência

Este método copia o endereço de um argumento no parâmetro formal. Dentro do subprograma, o endereço é usado para acessar o argumento real usado na chamada. Isso significa que as alterações feitas no parâmetro afetam o argumento.

Por padrão, Pascal usa call by valuepara passar argumentos. Em geral, isso significa que o código dentro de um subprograma não pode alterar os argumentos usados ​​para chamar o subprograma. O programa de exemplo que usamos no capítulo 'Pascal - Funções' chamou a função chamada max () usandocall by value.

Enquanto o programa de exemplo fornecido aqui ( exProcedure ) chama o procedimento findMin () usandocall by reference.