Unidad 8-Funciones y Procedimientos de Pascal
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.
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.