miércoles, enero 10, 2007

ABSTRACCIÓN FUNCIONAL ( Parte II de IV )


Abstracción Funcional en Pascal.
En Pascal se permiten dos tipos de subprogramas: funciones y procedimientos.

Procedimientos

Los procedimientos comienzan por la palabra reservada Procedure seguida de un identificador y un punto y coma. Después de la cabecera viene la parte de declaración. Al ejecutar un procedimiento se crean en memoria las constantes y variables de la parte de declaración, pero después de que se haya terminado el procedimiento desaparecen, lo cual supone un ahorro de memoria.

A continuación de la declaración están las sentencias, entre las palabras clave Begin y End y un punto y coma. Los procedimientos se activan en el programa principal dando su nombre como una sentencia simple.

Con frecuencia los procedimientos necesitan que se les dé uno o más valores, que se conocen como parámetros. Estos se incluyen en la cabecera, dentro de los paréntesis que siguen al identificador. Las declaraciones de parámetros son como las declaraciones de variables en la forma y propósito. Cada identificador se separa por punto y coma, cada uno se ha de definir como un tipo con nombre. A continuación se muestra un procedimiento que repite un carácter en pantalla, el número de veces que se quiera,

Procedure Repite(caracter; Car, conta: Integer);

Var i:Integer;

Begin

For i:=1 to conta Do

Write(caracter);

End;

y así para invocar que aparezca la letra A 80 veces seguida en pantalla,

Repite ("A",80)

donde se han pasado dos parámetros. Estos parámetros pueden ser de otro tipo, como variables, expresiones, como por ejemplo,

caracter:="A"; conta:=80;

Repite(LowerCase(caracter),conta);

donde LowerCase es una función que saca la letra minúscula de la indicada.

A su vez los parámetros se pueden pasar por valor o referencia. Si se pasa por valor, se transfiere una copia del valor del parámetro actual al procedimiento, el procedimiento no accede a la variable real y por lo tanto no puede modificarla. Un procedimiento puede cambiar el valor de un parámetro por valor, pero a la vuelta al programa queda sin modificar el valor actual del parámetro original. Se entiende que los parámetros por valor se utilizan para pasar información de entrada al subprograma. Este es el modo por defecto en pascal, no hay que indicarlo de ninguna manera. Lo que sucede es que internamente se crea una copia del parámetro real y se trabaja siempre con esta copia.

Si se desea pasar un parámetro por referencia, el parámetro actual debe ser una variable o una constante con tipo. Delante de la declaración del parámetro formal hay que poner la palabra clave Var.

Seguidamente se da un ejemplo para cada una de las dos formas de paso de parámetros,

a) Por valor

Procedure incrementa(mas_uno:Integer)

Begin

mas_uno:=mas_uno+1;

WriteLn(mas_uno);

End;

y al ejecutar las instrucciones siguientes,

avance:=1;

incrementa(avance);

WriteLn(avance)

la salida sería de 2 y 1.

b) Por referencia

Procedure incrementa(Var mas_uno:Integer)

Begin

mas_uno:=mas_uno+1;

WriteLn(mas_uno);

End; y al ejecutar las instrucciones siguientes,

avance:=1;

incrementa(avance);

WriteLn(avance)

la salida sería de 2 y 2.

Reglas para la asociación de parámetros.

1. Debe haber el mismo número de parámetros reales y formales

2. Los tipos de parámetros formales y reales deben concordar, sin embargo un parametro real integer puede estar asociado a un parámetro por valor real, pero no con un parámetro formal por variable de tipo real.

3. Un parámetro real asociado con un parámetro formal por variable debe ser una variable, no puede ser una constante o expresión, ya que su valor puede ser modificado.

Parámetros constantes. Se pasan por referencia pero indícandolos como const no se permite modificarlos. Esto se hace para no hacer copias de estructuras de datos muy pesadas.

Parámetros sin tipo. No se realizan las comprobaciones de tipo. Se asume que el programador asume la responsabilidad de no realizar operaciones no permitidas para el tipo concreto que se pase al parámetro sin tipo. Deben ser pasados por referencia. Se necesita otra variable declarada dentro del subprograma que tenga un tipo concreto y sea del tipo absolute para que sea una "copia" del valor pasado como parámetro. Se pase lo que se pase en el parámetro se tratará como si fuese del tipo de la variable absolute declarada dentro. Por lo que esto resulta muy poco útil.

Funciones


La diferencia entre un procedimiento y una función es que el identificador de una función asume un valor cuando la función ha terminado y devuelve este valor a la rutina que la llamó en sustitución del nombre de la función. En un sentido amplio el nombre de la función es también una variable. Por tanto, solo tiene sentido "colocar" la llamada a la función en aquellos lugares donde tendría sentido que apareciese el resultado de esta.

Todo lo indicado previamente respecto a la definición de los procedimientos se aplica a las funciones. La palabra clave es Function. A continuación se indica un ejemplo de función que convierte un parámetro de tipo Char a letra minúscula, si dicho parámetro está en el rango de la A a la Z.,

Las funciones solo pueden devolver tipos simples del lenguaje (integer, char, real, boolean, enumerado o subrango), y tambien strings y punteros.

En funciones se aplican los mismos métodos de paso de parámetros. Por tanto, los parámetros por referencia se puden utilizar tambien en funciones, consiguiendo así que estas devuelvan más de un valor, aunque esta no es una práctica muy aconsejable.

Function miniscula(caracter:Char);Char


Begin

If caracter in "A".."Z" Then

minuscula:=Char(Ord(caracter)+32)

Else

minuscula:=caracter;

End;

Subprogramas como parámetros.

En algunas versiones de Pascal se permite el paso de subprogramas como parámetros, esto es muy útil cuando un subprograma necesita invocar a otro subprograma que está declarado fuera de su ámbito.
Se incluirá la función o el procedimiento en la cabecera del subprograma.

Un ejemplo:

procedure Trapezoide ( a,b: real; Ninvl:integer; fz:func; var z:real );
var
h,xj: real;
j:integer;
suma: real;
begin
h:=(b-a)/Ninvl;
suma:=0.0;
for j:=1 to (Ninvl-1) do
begin
xj:=a+j*h;
suma:= suma + fz(xj);
end
z := (fz(a) + 2*suma + fz(b))*h/2;
end;

siendo func = function ( x:real ):real;


Subprogramas sobrecargados.

En algunos compiladores de Pascal, como FreePascal, es posible realizar sobrecarga de funciones y procedimientos, es decir, declarar funciones con el mismo nombre pero que difieren en el orden o número de los parámetros que necesitan. Ejemplo:

function suma(a,b:integer):integer;

begin

suma:= a+b;

end;

function suma(a,b:double):double;

begin

suma:= a+b;

end;

Según el tipo de parámetro que le pasemos se llamará la primera o la segunda función.