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.