PDF de programación - Parte I: Programación en Ada - 6. Abstracción de tipos mediante unidades genéricas

Imágen de pdf Parte I: Programación en Ada - 6. Abstracción de tipos mediante unidades genéricas

Parte I: Programación en Ada - 6. Abstracción de tipos mediante unidades genéricasgráfica de visualizaciones

Publicado el 6 de Junio del 2017
864 visualizaciones desde el 6 de Junio del 2017
161,8 KB
10 paginas
Creado hace 15a (06/11/2008)
Parte I: Programación en Ada

UNIVERSIDAD DE CANTABRIA

1. Introducción a los computadores y su programación
2. Elementos básicos del lenguaje
3. Modularidad y programación orientada a objetos
4. Estructuras de datos dinámicas
5. Tratamiento de errores
6. Abstracción de tipos mediante unidades genéricas
7. Entrada/salida con ficheros
8. Herencia y polimorfismo
9. Programación concurrente y de tiempo real

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

4

© Javier Gutiérrez, Michael González

6/nov/08

1

6.1. Introducción

UNIVERSIDAD DE CANTABRIA

La abstracción de tipos es un requisito esencial para escribir
software reutilizable.

Se puede implementar en Ada mediante módulos genéricos:
• El módulo genérico es una plantilla en la que unos

parámetros genéricos quedan indeterminados.

• Los parámetros genéricos pueden ser tipos de datos,

valores, subprogramas, y paquetes.

• Un módulo genérico puede ser un procedimiento, función,

o paquete.

• Para usar un módulo genérico éste debe instanciarse,

indicando qué parámetros concretos se usarán.

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

2

Ejemplo

UNIVERSIDAD DE CANTABRIA

package Conjuntos is
subtype Elemento is String(1..20);
type Conjunto is private;

function Vacio return Conjunto;
procedure Inserta (E : Elemento;
C : in out Conjunto);
procedure Extrae (E : Elemento;
C : in out Conjunto);
-- pertenencia
function "<" (E: Elemento; C: Conjunto) return Boolean;
function "+" (X,Y : Conjunto) return Conjunto; -- Unión
function "*" (X,Y : Conjunto) return Conjunto; -- Intersección
function "-" (X,Y : Conjunto) return Conjunto; -- Diferencia
function "<" (X,Y : Conjunto) return Boolean; -- Inclusión
No_Cabe : exception;
private
Max_Elementos : constant Integer:=100;
type Conjunto is ...;
end Conjuntos;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

3

Comentarios sobre el ejemplo

UNIVERSIDAD DE CANTABRIA

• Para hacer un conjunto de otro tipo de datos, hay que

reescribir el paquete, cambiando el tipo Elemento

• Si el tipo Elemento está declarado en un paquete externo y

se desea hacer conjuntos de dos o más tipos diferentes,
también será necesaria la modificación del módulo.

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

4

6.2. Paquetes Genéricos

UNIVERSIDAD DE CANTABRIA

La solución para hacer los conjuntos independientes del tipo
“Elemento” es la utilización de paquetes genéricos:

generic
type Elemento is private;

package Conjuntos is
type Conjunto is private;

-- todo igual que antes

end Conjuntos;

Para usar esta unidad es preciso instanciarla, indicando el
tipo de dato que se va a usar

package Conjuntos_Reales is new Conjuntos (Float);
package Conjuntos_Enteros is new Conjuntos (Integer);

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

5

Paquetes genéricos (cont.)

UNIVERSIDAD DE CANTABRIA

La unidad genérica Conjuntos es reutilizable
• es independiente del tipo de dato almacenado

Un módulo genérico también se puede hacer independiente
de un valor.
• Por ejemplo, el módulo anterior tenía una limitación de 100

elementos

• Esta limitación se puede eliminar del siguiente modo:

generic
Max_Elementos : Integer;
type Elemento is private;
package Conjuntos is

-- igual que antes, sin la constante Max_Elementos

end Conjuntos;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

6

Paquetes genéricos (cont.)

UNIVERSIDAD DE CANTABRIA

La declaración de esta unidad para 500 números reales y para
300 números enteros:

package Conjuntos_Reales is new Conjuntos (500,Float);
package Conjuntos_Enteros is new Conjuntos (300,Integer);

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

7

6.3. Subprogramas genéricos

UNIVERSIDAD DE CANTABRIA

Los subprogramas genéricos necesitan una especificación
separada del cuerpo

Especificación (fichero intercambia.ads)

generic
type Dato is private;
procedure Intercambia (A,B : in out Dato);

Cuerpo (fichero intercambia.adb)

procedure Intercambia (A,B : in out Dato) is
Temp : Dato:=A;
begin
A:=B;
B:=Temp;
end Intercambia;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

8

Subprogramas genéricos
(cont.)

UNIVERSIDAD DE CANTABRIA

Instanciación:

with Intercambia;
procedure Prueba is
procedure Intercambia_Enteros is new Intercambia(Integer);

A : Integer:=...;
B : Integer:=...;
begin
...
Intercambia_Enteros(A,B);
end Prueba;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

9

6.4. Tipos como Parámetros
Genéricos

UNIVERSIDAD DE CANTABRIA

Tipos discretos (enteros, enumerados, o caracteres):

- type T is (<>);

Tipos enteros:

- type T is range <>;

Tipos reales:

- type T is digits <>;

Cualquier tipo:

- type T is private;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

10

Ejemplo: conjuntos genéricos
de elementos discretos

UNIVERSIDAD DE CANTABRIA

generic
type Elemento is (<>);
package Conjuntos_Discretos is
type Conjunto is private;

function Vacio return Conjunto;
procedure Inserta (E : Elemento; C : in out Conjunto);
procedure Extrae (E : Elemento; C : in out Conjunto);
-- pertenencia
function "<" (E: Elemento; C: Conjunto) return Boolean;
function "+" (X,Y : Conjunto) return Conjunto; -- Unión
function "*" (X,Y : Conjunto) return Conjunto; -- Intersección
function "-" (X,Y : Conjunto) return Conjunto; -- Diferencia
function "<" (X,Y : Conjunto) return Boolean; -- Inclusión

No_Cabe : exception;
private
type Conjunto is array (Elemento) of Boolean;
end Conjuntos_Discretos;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

11

Ejemplo (cont.)

Ejemplo de instanciación:

UNIVERSIDAD DE CANTABRIA

type Color is (Rojo, Verde, Amarillo, Azul);
package Colores is new Conjuntos_Discretos(Color);
use Colores;

Comentarios
• Si el tipo Elemento no fuese discreto no se podría usar

como índice de un array

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

12

6.5. Subprogramas como
Parámetros Genéricos

UNIVERSIDAD DE CANTABRIA

Se puede incluir un subprograma como parámetro genérico
formal:

with procedure P (lista parámetros);
with function F (lista parámetros) return tipo;

Al instanciar la unidad genérica se debe incluir un parámetro
actual que sea un procedimiento con el mismo perfil (mismos
parámetros).

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

13

Ejemplo

UNIVERSIDAD DE CANTABRIA

Ejemplo de una función que permite calcular la integral de
cualquier función real

Especificación

generic
Num_intervalos : Positive;
with function F(X : Float) return Float;
function Integral (A,B : Float) return Float;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

14

Ejemplo (cont.)

Cuerpo

UNIVERSIDAD DE CANTABRIA

function Integral (A,B : Float) return Float is
Delta_X : Float :=(B-A)/Float(Num_Intervalos);
X : Float :=A+Delta_X/2.0;
Resultado : Float :=0.0;
begin
for i in 1..Num_Intervalos loop
Resultado:=Resultado+F(X)*Delta_X;
X := X+Delta_X;
end loop;
return Resultado;
end Integral;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

15

Ejemplo de Uso de Función
Genérica

UNIVERSIDAD DE CANTABRIA

Ejemplo del cálculo de la integral de x2 entre 0.5 y 1.5:

with Integral, Ada.Text_IO, Ada.Float_Text_IO;
use Ada.Text_IO, Ada.Float_Text_IO;
procedure Prueba_Integral is

function Cuadrado (X : FLOAT) return Float is
begin
return X*X;
end Cuadrado;

function Integral_Cuad is new Integral(1000,Cuadrado);

begin
Put("Integral de x**2 entre 0.5 y 1.5: ");
Put(Integral_Cuad(0.5,1.5));
New_Line;
end Prueba_Integral;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

16

Otro ejemplo de instanciación

UNIVERSIDAD DE CANTABRIA

Ejemplo del cálculo de la integral de log(x) entre 2.1 y 3.2:

with Integral, Ada.Text_IO, Ada.Float_Text_IO,
Ada.Numerics.Elementary_Functions;
use Ada.Text_IO, Ada.Float_Text_IO,
Ada.Numerics.Elementary_Functions;
procedure Prueba_Integral is

function Integral_Log is new Integral(1000,Log);

begin
Put("Integral de log(x) entre 2.1 y 3.2: ");
Put(Integral_Log(2.1,3.2));
Text_IO.New_Line;
end Prueba_Integral;

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

17

6.6. Punteros a subprogramas

UNIVERSIDAD DE CANTABRIA

En Ada 95 se prefiere para un caso como el de la función
integral el uso de punteros a subprogramas

La definición de un tipo puntero a subprograma es:

type nombre is access function (parámetros) return tipo;

type nombre is access procedure (parámetros);

Permite reemplazar en algunos casos a los subprogramas
usados como parámetros genéricos

GRUPO DE COMPUTADORES Y TIEMPO REAL
FACULTAD DE CIENCIAS

© Javier Gutiérrez, Michael González

6/nov/08

18

Ejemplo: Integral con
punteros

UNIVERSIDAD DE CANTABRIA

type P_Func is access function
  • Links de descarga
http://lwp-l.com/pdf4327

Comentarios de: Parte I: Programación en Ada - 6. Abstracción de tipos mediante unidades genéricas (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad