Pascal - Procedimientos

Procedures son subprogramas que, en lugar de devolver un solo valor, permiten obtener un conjunto de resultados.

Definición de un procedimiento

En Pascal, un procedimiento se define utilizando el procedurepalabra clave. La forma general de una definición de procedimiento es la siguiente:

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

Un procedimiento definition en Pascal consiste en un header, local declarations y un bodydel procedimiento. El encabezado del procedimiento consta de la palabra claveprocedurey un nombre dado al procedimiento. Aquí están todas las partes de un procedimiento:

  • Arguments- El (los) argumento (s) establecen el vínculo entre el programa que llama y los identificadores de procedimiento y también se denominan parámetros formales. Las reglas para los argumentos en los procedimientos son las mismas que para las funciones.

  • Local declarations - Las declaraciones locales se refieren a las declaraciones de etiquetas, constantes, variables, funciones y procedimientos, que son aplicables al cuerpo del procedimiento únicamente.

  • Procedure Body- El cuerpo del procedimiento contiene una colección de declaraciones que definen lo que hace el procedimiento. Siempre debe estar entre las palabras reservadas begin y end. Es la parte de un procedimiento en la que se realizan todos los cálculos.

A continuación se muestra el código fuente de un procedimiento llamado findMin () . Este procedimiento toma 4 parámetros x, y, zym y almacena el mínimo entre las primeras tres variables en la variable denominada m. La variable m se pasa porreference (discutiremos el paso de argumentos por referencia un poco más adelante) -

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 }

Declaraciones de procedimiento

Un procedimiento declarationle dice al compilador sobre el nombre de un procedimiento y cómo llamar al procedimiento. El cuerpo real del procedimiento se puede definir por separado.

Una declaración de procedimiento tiene la siguiente sintaxis:

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

Tenga en cuenta que el name of the procedure is not associated with any type. Para el procedimiento findMin () definido anteriormente , la siguiente es la declaración:

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

Llamar a un procedimiento

Al crear un procedimiento, proporciona una definición de lo que debe hacer el procedimiento. Para utilizar el procedimiento, deberá llamar a ese procedimiento para realizar la tarea definida. Cuando un programa llama a un procedimiento, el control del programa se transfiere al procedimiento llamado. Un procedimiento llamado realiza la tarea definida y, cuando se alcanza su última instrucción final, devuelve el control al programa que realiza la llamada.

Para llamar a un procedimiento, simplemente necesita pasar los parámetros requeridos junto con el nombre del procedimiento como se muestra a continuación:

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.

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Enter three numbers:
89 45 67
Minimum: 45

Subprogramas recursivos

Hemos visto que un programa o subprograma puede llamar a otro subprograma. Cuando un subprograma se llama a sí mismo, se denomina llamada recursiva y el proceso se conoce como recursividad.

Para ilustrar el concepto, calculemos el factorial de un número. Factorial de un número n se define como -

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

El siguiente programa calcula el factorial de un número dado llamándose a sí mismo de forma recursiva.

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.

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Enter a number:
5
Factorial 5 is: 120

A continuación se muestra otro ejemplo, que genera la Fibonacci Series para un número dado usando un recursive función -

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.

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

0 1 1 2	3 5 8 13 21 34

Argumentos de un subprograma

Si un subprograma (function or procedure) es usar argumentos, debe declarar variables que acepten los valores de los argumentos. Estas variables se denominanformal parameters del subprograma.

Los parámetros formales se comportan como otras variables locales dentro del subprograma y se crean al ingresar al subprograma y se destruyen al salir.

Al llamar a un subprograma, hay dos formas de pasar argumentos al subprograma:

No Señor Tipo de llamada y descripción
1 Llamar por valor

Este método copia el valor real de un argumento en el parámetro formal del subprograma. En este caso, los cambios realizados en el parámetro dentro del subprograma no tienen ningún efecto en el argumento.

2 Llamar por referencia

Este método copia la dirección de un argumento en el parámetro formal. Dentro del subprograma, la dirección se usa para acceder al argumento real usado en la llamada. Esto significa que los cambios realizados en el parámetro afectan el argumento.

Por defecto, Pascal usa call by valuepara pasar argumentos. En general, esto significa que el código dentro de un subprograma no puede alterar los argumentos utilizados para llamar al subprograma. El programa de ejemplo que usamos en el capítulo 'Pascal - Funciones' llamó a la función llamada max () usandocall by value.

Considerando que, el programa de ejemplo proporcionado aquí ( exProcedure ) llama al procedimiento findMin () usandocall by reference.