Publicado el 6 de Junio del 2017
1.014 visualizaciones desde el 6 de Junio del 2017
161,8 KB
10 paginas
Creado hace 16a (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
Comentarios de: Parte I: Programación en Ada - 6. Abstracción de tipos mediante unidades genéricas (0)
No hay comentarios