Unidad 8-Funciones y Procedimientos de Pascal

PROCEDIMIENTOS
 

La programación estructurada trata de dividir el programa en bloques más pequeños, buscando una mayor legibilidad, y más comodidad a la hora de corregir o ampliar.

Por ejemplo, en el caso de programar una agenda, podemos empezar a teclear directamente y crear un programa de 2000 líneas que quizás incluso funcione, o dividirlo en partes, de modo que el cuerpo del programa sea 

begin
  InicializaVariables;
  PantallaPresentacion;
  Repeat
  PideOpcion;
  case Opcion of
      '1': MasDatos;
      '2': CorregirActual;
      '3': Imprimir;
    ...
    end;
  Until Opcion = OpcionDeSalida;
  GuardaCambios;
  LiberaMemoria
end.
begin
  InicializaVariables;
  PantallaPresentacion;
  Repeat
  PideOpcion;
  case Opcion of
      '1': MasDatos;
      '2': CorregirActual;
      '3': Imprimir;
    ...
    end;
  Until Opcion = OpcionDeSalida;
  GuardaCambios;
  LiberaMemoria
end.

En nuestro caso (en el lenguaje Pascal), estos bloques serán de dos tipos: procedimientos (procedure) y funciones (function).

La diferencia entre ellos es que un procedimiento ejecuta una serie de acciones que están relacionadas entre sí, y no devuelve ningún valor, mientras que la función sí que va a devolver valores. Veamoslo con un par de ejemplos:


Ejemplo 1
procedure Acceso;
var
    clave: string; (* Esta variable es local *)
begin
    writeln(' Bienvenido a SuperAgenda ');
    writeln('=========================='); (* Para subrayar *)
    writeln; writeln; (* Dos líneas en blanco *)
    writeln('Introduzca su clave de acceso');
    readln( clave ); (* Lee un valor *)
    if clave <> ClaveCorrecta then (* Compara con el correcto *)
        begin (* Si no lo es *)
        writeln('La clave no es correcta!'); (* avisa y *)
        exit (* abandona el programa *)
        end
end;
  • El cuerpo de un procedimiento se encierra entre "begin" y "end", igual que las sentencias compuestas y que el propio cuerpo del programa.
  • Un procedimiento puede tener sus propias variables, que llamaremos variables locales, frente a las del resto del programa, que songlobales. Desde dentro de un procedimiento podemos acceder a las variables globales (como ClaveCorrecta del ejemplo anterior), pero desde fuera de un procedimiento no podemos acceder a las variables locales que hemos definido dentro de él.
  • La orden exit, que no habíamos visto aún, permite interrumpir la ejecución del programa (o de un procedimiento) en un determinado momento.   
FUNCIONES
 
Ejemplo 2: una función que eleve un número a otro (esa posibilidad no existe "de forma nativa" en Pascal), se podría hacer así, si ambos son enteros:
function potencia(a,b: integer): integer; (* a elevado a b *)
var
    i: integer;        (* para bucles *)
    temporal: integer; (* para el valor temporal *)
begin
    temporal := 1;             (* incialización *)
    for i := 1 to b do
    temporal := temporal * a;  (* hacemos 'b' veces 'a*a' *)
    potencia := temporal;      (* y finalmente damos el valor *)
end;
  • Esta función se llama "potencia".
  • Tiene dos parámetros llamados "a" y "b" que son números enteros (valores que "se le pasan" a la función para que trabaje con ellos).
  • El resultado va a ser también un número entero.
  • "i" y "temporal" son variables locales: una para el bucle "for" y la otra almacena el valor temporal del producto.
  • Antes de salir es cuando asignamos a la función el que será su valor definitivo.

Uso de las funciones

program PruebaDePotencia;
 
 var
   numero1, numero2: integer;                (* Variables globales *)
 
 function potencia(a,b: integer): integer;  (* Definimos la función *)
 var
   i: integer;                      (* Locales: para bucles *)
   temporal: integer;               (* y para el valor temporal *)
 begin
   temporal := 1;                   (* incialización *)
   for i := 1 to b do
     temporal := temporal * a;      (* hacemos "b" veces "a*a" *)
   potencia := temporal;            (* y finalmente damos el valor *)
 end;
 
 begin                                       (* Cuerpo del programa *)
   writeln('Potencia de un número entero');
   writeln;
   writeln('Introduce el primer número');
   readln( numero1 );
   writeln('Introduce el segundo número');
   readln( numero2 );
   writeln( numero1 ,' elevado a ', numero2 ,' vale ',
     potencia (numero1, numero2) )
 end.