Procedimientos y funciones

Por at

Para desarrollar aplicaciones sencillas en Pascal, bastará colocar todas las instrucciones dentro del bloque principal del programa (delimitado entre begin y end). Sin embargo, en aplicaciones más complejas se suelen requerir decenas, o incluso cientos, de líneas de código de instrucciones. Si coloca todo el código de un programa en su bloque principal, a medida que aumente el número de instrucciones, puede hacer que el programa se torne difícil de leer y comprender; y más aun, difícil de desarrollar.

Gracias a la característica de modularidad de Pascal, es posible dividir la lógica de un programa muy complejo en partes más pequeñas y fáciles de manejar. Para dividir la lógica de un programa se implementan procedimientos y funciones, y a cada parte en que se divide su lógica, se le suele denominar como módulo de programa.

Estructura simplificada de un programa en Pascal
Figura 1. Estructura sintáctica simplificada de un programa en Pascal

Todos los módulos de programa, ya sea que se implementen en forma de procedimientos o de funciones, deben escribirse antes del bloque principal del programa (observe la figura 1). Luego, estos módulos podrán ser llamados (o invocados), cada vez que sean necesarios, desde el código del bloque principal del programa.

En otros lenguajes de programación, a los procedimientos y funciones se les suele denominar como subprogramas, subrutinas, subprocesos, o simplemente funciones; no obstante, su finalidad es siempre la misma: dividir un programa extenso en un conjunto de módulos de programa más pequeños.

Estructura de procedimientos y funciones

La estructura sintáctica de un procedimiento o una función, es en sí misma, similar a la de un programa en Pascal; pues, cada uno consta de un encabezado, seguido de un bloque de instrucciones (compare las figuras 1 y 2).

Estructura de un procedimiento o función
Figura 2. Estructura de un procedimiento o función en Pascal

El encabezado de un procedimiento o función consta de un identificador, y una lista de parámetros formales. Estos parámetros son similares a las variables del programa; por lo tanto, su declaración es también similar a la declaración de variables.

El código del bloque de instrucciones controla la lógica del procedimiento o función, este bloque estar delimitado entre las palabras begin y end. La lógica de cada función o procedimiento, que se incluya en un programa, se puede desarrollar o modificar por separado. Asimismo, cada procedimiento o función podrá realizar una tarea específica.

Declaración de procedimientos

Para declarar un procedimiento simplemente se debe asociar un identificador (nombre para el procedimiento) con un bloque de instrucciones; una vez declarado, el procedimiento podrá ejecutarse al ser invocando desde el bloque principal del programa. El diagrama sintáctico para su declaración es el siguiente:

diagrama sintáctico para declaración de un procedimiento
Figura 3. Diagrama sintáctico para declaración de un procedimiento

Técnicamente, la declaración inicia siempre con el encabezado del procedimiento; anteponiendo la palabra procedure a su identificador, y a continuación se especifican sus parámetros formales, sin son requeridos; mientras que su bloque de instrucciones se delimita entre las palabras begin y end (observe y relacione las figuras 2 y 3).

Un procedimiento es ejecutado posteriormente mediante una instrucción de llamada procedimental, en la cual se especifica el identificador del procedimiento y los valores reales de sus parámetros formales, si los tiene declarados. Las instrucciones que se ejecutarán en su llamada están contenidas dentro del bloque de instrucciones del procedimiento.

A continuación se muestra un ejemplo de un procedimiento para dar el resultado de una conversión de grados a radianes, denominado como PrintResults:

Procedure PrintResults
	
  Begin
  
     Write (grads:0:4, ' ', 'grads');
     Write (' = ');
     Writeln (rads:0:4, ' ', 'rads')
	
  end;

El siguiente ejemplo es de un programa que utiliza el procedimiento anterior (PrintResults), y cuya lógica principal se resume en cuatro tareas sencillas:

  1. limpiar la pantalla
  2. Solicitar, al usuario, el valor de un ángulo en grados.
  3. Realizar los cálculos de conversión para el valor solicitado.
  4. Visualizar los resultados en pantalla

La lógica principal del programa se encontrará entre sus últimos begin y end; sin embargo, la tarea de visualización de resultados estará a cargo del procedimiento PrintResults.

Program AngleConverter (input, output);

Uses
   crt;

var
   grads,	{angulo en grados}
   rads: real;	{angulo en radianes}

Procedure PrintResults;
   
   {Procedimiento para visualizar resultados}
   {de conversión de unidades               } 
   
   
   begin

      write (grads:0:4,' ', 'grads');
      write (' = ');
      writeln (rads:0:4, ' ', 'rads')

   end;

begin

   {Lógica principal del programa}

   Clrscr;
   Write ('Ingrese un ángulo en grados: ');
   ReadLn (grads);
   rads := grads * 3.14159/180;
   PrintResults;
   Readkey
   
end.

La lógica del programa anterior es muy sencilla de entender. Todos los detalles ocultos de su lógica principal, se encuentran dentro del bloque de instrucciones de su único procedimiento declarado (PrintResults).

Declaración de funciones

La declaración de funciones es algo similar a la declaración de procedimientos; con la diferencia de que, en una función se define un bloque de instrucciones que efectúe cálculos, y retorne un valor como resultado final de dichos cálculos.

Diagrama sintáctico para declaración de una función
Figura 4. Diagrama sintáctico para declaración de una función

En el encabezado se especifica el identificador de la función, anteponiéndole la palabra function; los parámetros formales, si son requeridos; y el tipo de resultado de la función (observe el segundo flujo del diagrama en la figura 4). Para especificar el tipo de resultado de la función se elige cualquiera de los tipos de datos reconocidos en Pascal.

El bloque de instrucciones de la función debe contener al menos una instrucción de asignación que asigne un valor de retorno al identificador de la función. El resultado de la función será el último valor asignado a su identificador. Si no existe dicha instrucción de asignación, o no es ejecutada, el valor retornado por la función será indefinido.

Una función es ejecutada posteriormente mediante la llamada a la función dentro de una expresión. En la llamada a la función se especifica el identificador de la función y los valores reales de sus parámetros formales, si fueron declarados en la función. Una función actúa como un operando de una expresión que incluya su llamada. Cuando se evalúa dicha expresión, la función se ejecuta, y el valor devuelto por la función se convierte en el valor del operando que representa en la expresión.

A continuación se da un ejemplo de declaración de una función para convertir grados a radianes, denominada GradsToRads:

Function GradsToRads: real;

   begin

      Write ('Ingrese un ángulo en grados: ');
      ReadLn (grads);
      GradsToRads := grads * 3.14159/180;

   end;

Note que hasta ahora en ningún procedimiento y función se han requerido parámetros. Veamos ahora un ejemplo de un programa que implementa tanto una función como un procedimiento:

Program AngleConverter (input, output);

Uses
   crt;

Var
   grads,	{angulo en grados}
   rads: real;	{angulo en radianes}

Procedure PrintResults;

   {Procedimiento para resultados de conversión de unidades}

   begin

      write (grads:0:4,' ', 'grads');
      write (' = ');
      writeln (rads:0:4, ' ', 'rads')

   end;

Function GradsToRads: real;

   {Función para convertir Grados a Radianes}

   begin

      Write ('Ingrese un ángulo en grados: ');
      ReadLn (grads);
      GradsToRads := grads * 3.14159/180;

   end;


Begin

   {Lógica principal del programa}

   Clrscr;
   rads := GradsToRads;
   PrintResults;
   Readkey

End.

El código de instrucciones del programa anterior es bastante simple; su lógica principal se ha dividido en dos módulos de programa: el primero está implementado mediante el procedimiento PrintResults, y el segundo mediante la función GradsToRads.

Implementación de procedimientos y funciones

El uso de procedimientos y funciones lo habitúa a desarrollar sus programas aplicando siempre el pensamiento en forma lógica y modular. De esta manera, podrá identificar fácilmente bloques de instrucciones que realicen tareas comunes en distintas partes del cuerpo principal del programa.

Resulta conveniente implementar procedimientos y funciones si descubre que su programa realiza lo mismo repetidas veces; de ser así, es posible que desee trasladar la lógica a un único módulo de programa (en forma de procedimiento o función). Usted escribe una sola vez el código que se repite en un módulo de programa, y luego podrá invocarlo tantas veces como sea necesario.

Para invocar correctamente los procedimientos y funciones que ha implementado, tenga siempre en cuenta que, un procedimiento se ejecuta mediante una instrucción de llamada procedimental; mientras que una función, se ejecuta al ser evaluada dentro de una expresión que contenga su llamada, y luego retorna un valor como un operando de dicha expresión.

Publicar un comentario