jueves, enero 11, 2007

BIBLIOGRAFÍA
1. Estructuras de datos en Java.
Mark Allen Weiss.
Addison Wesley
2. Estructuras de datos. Realización en Pascal.
M. Collado Machuca. R. Morales Fernandez. J. Jose Moreno Navarro.
3. Estructuras de datos con Java. Diseño de estructuras y algoritmos.
John Lewis. Joseph Chase.
Addison Wesley.
4. Java. Como programar
Harvey M. Deitel. Paul J. Deitel
Prentice Hall.
5. Programación en Pascal.
Luis Joyanes Aguilar
McGrawHill
6. Programación estructurada y algoritmos en Pascal.
Jose María Valls. David Camacho.
7. Manual de Java.
Patrick Naughton.
McGrawHill.
8. Programación avanzada y resolución de problemas en Pascal.
G.M. Schneider. Steven C. Bruell.
ANAYA.
9. Aprendiendo Java en 21 días.
Laura Lemay. Charles L. Perkins.
10. Programando con Java.
Tim Ritchey.
11. Turbo PaSCAL 7. Manual de referencia.
Stephen K. O'Brien. Steve Nameroff.
McGrawHill.
12. Programación en Pascal.
Stanford Leestma. Larry Nyhoff.
Prentice Hall.

SIMILITUDES Y DIFERENCIAS
DIFERENCIAS
1. En Pascal se distingue entre funciones y procedimientos.
Java tiene un único formato: métodos.
2. Java. Se declaran dentro de una clase en cualquier parte
Pascal. Sólo pueden aparecer en la parte destinada a la declaración de subprogramas.
3. Pascal. Un subprograma debe estar declarado antes de utilizarlo.
Java. Esto no es necesariamente así. No existe esa secuencialidad, ya que forman parte de un objeto.
4. Pascal. Los parámetros se separan por ;
Java. Los parámetros se separan por ,
5. Pascal. Se puede especificar un solo tipo para varios parámetros.
Java. Cada parámetro debe llevar su tipo, aunque todos tengan el mismo.
6. Pascal. Se ejecuta SIEMPRE todo el código.
Java. Si se encuentra un return termina la ejecución del módulo. No tiene porque llegar hasta el final...
7. Pascal. Como tipo de retorno sólo se aceptan tipos simples.
Java. Como tipo de retorno se acepta cualquier tipo permitido del lenguaje (incluídos los objetos)
8. Pascal. Permite que un subprograma sea un parámetro de otro subprograma.
Java. No permite esto.
9. Pasca. Un subprograma puede contener en su interior la declaración de otros subprogramas.
Java. Esto no se permite, todos los métodos son independientes unos de otros.
SIMILITUDES
1. Ambos lenguajes permiten sobrecarga de subprogramas
2. El propósito de los subprogramas en los dos lenguajes es el mismo (realizar tareas concretas)
3. El número, tipo y orden de los parámetros formales y reales debe coincidir en los dos lenguajes, aunque en Pascal si el orden no coincide no da error (ni de compilación ni de ejecución), aunque los resultados obtenidos pueden ser "raros".
4. Soportan los mismos métodos de paso de parámetros (por valor o por referencia) aunque con distintos matices.

miércoles, enero 10, 2007

ABSTRACCIÓN FUNCIONAL
( PARTE III DE IV )


Abstracción Funcional en Java.

Fundamentos de los subprogramas.

En Java no existen distinciones entre funciones y procedimientos formalmente. En este lenguaje solo se tienen métodos, y según la situación, se comportarán como una función o como un procedimiento.
Lista de parámetros: la lista de parámetros (argumentos) es una lista de las declaraciones de parámetros que se pasan al método para su ejecución.

La lista puede estar vacía pero los paréntesis son obligados:

public void suficiente() // Correcto

public void pocaCosa // Error de sintaxis.


Es obligatorio indicar el tipo de cada parámetro:


double potencia (double x, double y) // Correcto

double potencia (double x, y) // Error de sintaxis


Parámetros formales y parámetros reales.


  • Parámetros formales: Los que se definen en la cabecera de la función.
  • Parámetros reales: Los que aparecen en la llamada a la función. Deben corresponderse con los parámetros formales definidos en la cabecera.






public static void main(String [] args)

{

int k = 3;

boolean flag = true;

// Llamadas correctas:

f(7, false);

f(0, flag);

f(k, flag);

// Llamadas inCorrectas:

// No concordancia entre parámetros reales y formales

f(true, d, flag);

f(false, 7);

}


El tipo retorno de un método puede ser cualquier tipo válido en el lenguaje, incluso los creados por el programador.
Un método tambien puede devolver objetos y recibirlos como parámetros.
Siempre hay que especificar un tipo de retorno del método, aunque queramos que este se comporte como un procedimiento (en cuyo caso no sería necesario), en este caso se pondrá como tipo de retorno void (que indica que no se devuelve nada).
El valor de retorno se determina (dentro del método) mediante la sentencia return. Se escribe return acompañado del valor a devolver cuando es una "función", y return "a secas" seguido de ; cuando se comporta como un "procedimiento".
El método en cuestión termina en cuanto se encuentre el primer return, sin continuar hasta el final del código de este.
Una curiosidad del lenguaje a destacar es que no se pueden pasar tipos simples como parámetros por referencia directamente, sino que hay que hacerlo como si un objeto se tratase gracias a las clases propias de Java que engloban cada tipo simple.


Procedimientos y funciones.


Se suele distinguir entre funciones y procedimientos:

Las funciones se corresponden con la noción matemática de función: producen un resultado que es función de los datos de entrada:

• y = f(x1, x2,...xn)

• Una función bien definida no modifica los parámetros de entrada.

• Se utilizan en expresiones.

Los procedimientos agrupan sentencias que realizan una tarea bien definida, pero no tienen por qué devolver un resultado.

• Se corresponden con el concepto de instrucción.

• Los procedimientos actúan sobre el entorno y pueden modificar los parámetros de entrada (efectos colaterales)

Los procedimientos pueden verse como una forma de extender las sentencias del lenguaje, mientras que las funciones pueden verse como una extensión de los operadores:

• Cuando se invoca una función se obtiene un valor a través de un valor de retorno.

• Cuando se invoca un procedimiento el efecto es una modificación del entorno del llamante, de la cual éste es advertido a través de los valores de los parámetros de salida.




Métodos de paso de parámetros.

Los parámetros de los métodos se pueden pasar por valor o por referencia.

En Java, los tipos primitivos siempre se pasan por valor y los objetos siempre por referencia.

Esto también ocurre para las variables de la sentencia return.



Ejemplo de paso por valor en Java:


void intercambio(int x, int y)

{

int auxiliar;

auxiliar = y;

y = x;

x = auxiliar;

}


Paso de arrays como parámetros en Java.


Los arrays son objetos y por tanto se pasan por referencia.

• La referencia se pasa por valor

• Para pasar un array como parámetro escribimos el nombre del array en la lista de parámetros (sin corchetes)

int temperaturasHorarias[] = new int[24];

modificarArray(temperaturasHorarias);

• El nombre del array es en realidad una referencia a un objeto que contiene los elementos del array.



class Paso_Arrays_1

{

static int a[] = {0, 1, 2, 3, 4};

public static void modificarArray(int b[])

{ // Por referencia

for (int j = 0; j<>

}

public static void modificarElemento(int e)

{ // Por valor

e *= 2;

}

public static void main(String [] args)

{

modificarArray(a); // después de llamada a = {0, 2, 4, 6}

modificarElemento(a[3]); // después de llamada a[3] = 6;

}

}


Sobrecarga de métodos en Java.


Sobrecarga de métodos: Java permite definir métodos con el mismo nombre siempre que difieran en los argumentos de entrada. Es una manera de aportar polimorfismo


  • Un método se distingue del resto por su firma.
  • Firma del método: nombre + argumentos de entrada.
  • Puesto que los métodos sobrecargados tienen el mismo nombre, los métodos sobrecargados se diferencian por el número, tipo y orden de los argumentos en su lista de parámetros.

Ejemplo:

public class utilidadesMatematicas

{

int square(int x) { return x*x; }

double square(double x) { return x*x; }

}


  • El prototipo de un método es la firma más el tipo devuelto.


Los métodos sobrecargados no se distinguen por el prototipo sino por la firma.





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.




ABSTRACCIÓN FUNCIONAL (Parte I de IV)
( práctica final 4.2 del grupo 35)


Introducción.

La abstracción, una de las herramientas que más nos ayuda a la hora de solucionar un problema, es un mecanismo fundamental para la comprensión de problemas y fenómenos que poseen una gran cantidad de detalles, su idea principal consiste en manejar un problema, fenómeno, objeto, tema o idea como un concepto general, sin considerar la gran cantidad de detalles que estos puedan tener.

El proceso de abstracción presenta dos aspectos complementarios:

  • Destacar los aspectos relevantes del objeto.
  • Ignorar los aspectos irrelevantes del mismo (la irrelevancia depende del nivel de abstracción, ya que si se pasa a niveles más concretos, es posible que ciertos aspectos pasen a ser relevantes).

De modo general podemos decir que la abstracción permite establecer un nivel jerárquico en el estudio de los fenómenos, el cual se establece por niveles sucesivos de detalles. Generalmente, se sigue un sentido descendente de detalles, desde los niveles más generales a los niveles más concretos.

Veamos los diferentes tipos de abstracción que podemos encontrar en un programa:


Abstracción Funcional


Los subprogramas son como pequeños programas dentro de un programa, incluso se parecen a los programas por comenzar con una cabecera, ir seguida de las declaraciones y una parte de sentencias. Los subprogramas se encuentran en la parte de declaración del programa, sin embargo operan en su propio entorno, separados pero no siempre aislados del programa principal. Un subprograma puede declarar variables que son sólo accesibles desde el subprograma, puede usar variables del programa principal y puede usar una mezcla de los dos.

Los subprogramas son de dos tipos: procedimientos y funciones.

Crear procedimientos y funciones e invocarlos mediante un nombre donde se destaca qué hace la función y se ignora cómo lo hace. El usuario sólo necesita conocer la especificación de la abstracción (el qué) y puede ignorar el resto de los detalles (el cómo).


Abstracción de Datos

  • Tipo de datos: proporcionado por los lenguajes de alto nivel. La representación usada es invisible al programador, al cual solo se le permite ver las operaciones predefinidas para cada tipo.
  • Tipos definidos: por el programador que posibilitan la definición de valores de datos más cercanos al problema que se pretende resolver.
  • TDA: para la definición y representación de tipos de datos (valores + operaciones), junto con sus propiedades.
  • Objetos: Son TDA a los que se añade propiedades de reutilización y de compartición de código.
A continuación veremos como dos lenguajes de programación ( Java y Pascal ) implementan la abstracción funcional.