Transparencias Seminario de Ada

Anuncio
Una Introducción a
Ada
Una Introducción a Ada
Contenido
1.  Introducción. Visión de conjunto
2.  Cuestiones léxicas
3.  Tipos de datos
4.  Expresiones
5.  Estructuras de control
6.  Subprogramas: Funciones y procedimientos
7.  Paquetes
8.  Excepciones
Introducción a Ada - 2
Visión de Conjunto
Ada es un lenguaje estilo Pascal / C
¿Qué es un programa Ada?
Es un Programa Principal (Unidad de Biblioteca)
que hace uso de los servicios de otras
unidades de biblioteca
Programa Principal
A
B
Subprogramas
C
D
Paquetes
Procedimientos
o Funciones
Abstracciones
E
Introducción a Ada - 3
Creación de programas Ada
Fichero con
código Ada
de E
Compilador
Ada
Fichero con
código Ada
de C
Compilador
Ada
·
·
·
Fichero con
código Ada
de PP
Compilador
Ada
E
E
C
A
B
D
C
E
PP
Programa Principal
A
B
D
C
E
Montador
(linker)
Ejecutable
PP
Introducción a Ada - 4
Un programa sencillo
Vamos a escribir un programa que calcule la raíz cuadrada
de 2,5 y la visualice por el dispositivo estándar de
entrada/salida.
Suponemos que en la biblioteca de programas disponemos,
al menos, de estas unidades:
Sqrt:
Función que devuelve la raíz
cuadrada del número que se le pasa
como parámetro.
ES_sencilla: Paquete que suministra un conjunto de
procedimientos para lectura/escritura
de números, caracteres, etc.
Introducción a Ada - 5
Un programa sencillo
with Sqrt, ES_sencilla;
use ES_sencilla;
-- Clausulas
-- de dependencia
procedure Imprimir_raiz is --begin
-PUT(Sqrt((2.5));
-end Imprimir_raiz;
Parte
declarativa
Parte
ejecutable
• No se distinguen mayúsculas y minúsculas.
• Se suelen utilizar minúsculas para palabras reservadas
• El “;” es el terminador de sentencia
• Los comentarios -- finalizan con la línea
• Con with se indican las unidades de biblioteca necesitadas.
• Con use se hacen directamente visibles los servicios
exportados por un paquete. Evita: ES_sencilla.PUT(…);
Introducción a Ada - 6
Ampliando el programa
Podemos mejorar el programa,
para que pregunte por el número
del que se desea obtener la raíz cuadrada.
with Sqrt, ES_sencilla;
use ES_sencilla;
procedure Imprimir_raiz is
x:FLOAT; -- Declaración de una variable x
-- de tipo FLOAT
begin
GET(X);
PUT(Sqrt(x));
end Imprimir_raiz;
Introducción a Ada - 7
Más difícil todavía
with Sqrt, ES_sencilla;
use ES_sencilla;
Pregunta hasta que el
procedure Imprimir_raiz is
valor indicado sea cero.
x:FLOAT;
begin
PUT("Raices cuadradas");
diferencias
NEW_LINE(2);
mayúsculas/minúsculas
loop
GET(x);
exit when x=0.0 –- salida del bucle
PUT("La raíz de ");
sobrecarga
PUT(x);
parámetros
PUT("es ");
opcionales
if x<0.0 then
con valor
PUT("No calculable");
por defecto
else
end if
PUT(Sqrt(x));
end loop
end if;
end Imprimir_raiz
NEW_LINE;
end loop;
NEW_LINE;
PUT("Fin del programa.");
end Imprimir_raiz;
Introducción a Ada - 8
Una función sencilla: Sqrt
function Sqrt(F:FLOAT) return FLOAT is
r:FLOAT;
-- variable local
-- Resto de objetos locales
-- necesarios para el cálculo
begin
-- Algoritmo de calculo de la
-- raiz cuadrada de F
return r;
end Sqrt;
Introducción a Ada - 9
Un paquete sencillo: ES_sencilla
ESPECIFICACIÓN de
ES_sencilla
package ES_sencilla is
procedure Get(F: out FLOAT);
procedure Put(F: in FLOAT);
procedure Put(F: in STRING);
procedure New_Line(N: in INTEGER := 1);
end ES_sencilla;
CUERPO (implementación) de
ES_sencilla
with Entrada_Salida;
package body ES_sencilla is
...
procedure Get(F: out FLOAT) is
...
-- Parte declarativa
begin
...
-- Sentencias
...
-- Sentencias
end Get;
...
end ES_sencilla;
Introducción a Ada - 10
Una Introducción a Ada
2. Cuestiones Léxicas
Introducción a Ada - 11
Cuestiones lexicográficas
CONJUNTO DE CARACTERES UTILIZADOS EN ADA
Letras
Cifras
Símbolos
A..Z
0..9
"#&'()*+,-./:;<=>_|
ALGUNOS DELIMITADORES COMPUESTOS
=>
..
**
:=
/=
>=
<=
Agregados, case, etc.
Rangos
Exponenciación
Asignación
Desigualdad
Mayor o igual
Menor o igual
Introducción a Ada - 12
Cuestiones lexicográficas
IDENTIFICADORES
son nombres de tipos, subtipos, variables, procedimientos,
funciones, paquetes, excepciones, …
IDENTIFICADOR ::= LETRA {[_] LETRA_O_CIFRA}
LETRA_O_CIFRA ::= LETRA | CIFRA
LETRA ::=
MAYÚSCULA | MINÚSCULA
Introducción a Ada - 13
Constantes númericas
Un poco sobre los números
ENTEROS: 150
15_273_542
REALES:
3.14159_26536 98.3E-2
80.0
7E2
¿Base distinta de 10?
2#01010011#
16#48AB6C#
8#71235471#E-2
base
número
exponente
Introducción a Ada - 14
Palabras reservadas
! Son identificadores que solamente
pueden utilizarse en ciertos contextos
definidos por el lenguaje
! No pueden utilizarse para definir
identificadores del usuario
! Pueden uilizarse en las tiras de
caracteres (strings).
Introducción a Ada - 15
Palabras reservadas
abort
abs
abstract
accept
access
aliased
all
and
array
at
begin
body
case
constant
declare
delay
delta
digits
do
else
elsif
end
entry
exception
exit
for
function
generic
goto
if
in
is
limited
loop
mod
new
not
null
of
or
others
out
package
pragma
private
procedure
protected
tagged
task
terminate
then
type
raise
range
rem
renames
requeue
return
reverse
until
use
when
while
with
xor
select
separate
subtype
Introducción a Ada - 16
Una Introducción a Ada
3. Tipos de Datos
Introducción a Ada - 17
Una Introducción a Ada
Tipos
TIPOS
Conjunto de valores al que se le pueden
aplicar unas determinadas operaciones
TIPO
Valores
Operaciones
Introducción a Ada - 18
Tipos
TYPE <Identificador> IS <Definicion_de_tipo>
type Ciudades is (Madrid, Toledo, Cuenca);
type Capitales is (Madrid, Roma, Paris);
Villa:
Ciudades;
Villa_europea: Capitales;
Villa := Madrid;
Villa_europea := Madrid;
Villa := Villa_europea;
¡Son tipos
diferentes!
Introducción a Ada - 19
Subtipos
SUBTIPOS
Subconjunto
TIPO de valores de un tipo,
pero manteniéndose todas las
SUBTIPO
operaciones
aplicables al tipo
TIPO
Valores
SUBTIPO
Operaciones
Introducción a Ada - 20
Subtipos
subtype Dia_del_mes is Integer range 1..31;
type Capitales is (Madrid, Roma, Paris);
subtype Capitales_extranjeras is
Capitales range Roma..Paris;
Un subtipo
NO introduce
un tipo nuevo
Dia : Dia_del_mes;
N
: Integer;
Dia := N;
Se pueden definir nuevos subtipos
a partir de otros subtipos
Introducción a Ada - 21
Tipos
Discreto
ESCALAR
Real
Entero (INTEGER)
Enumeración
Coma flotante
Coma fija
TIPOS
ESTRUCTURADO
Matriz
Registro
ACCESO (ACCESS)
PRIVADO (PRIVATE)
TAREA (TASK)
Introducción a Ada - 22
Tipos Enumerados
TYPE <identificador> IS (literal_o_carácter {,literal_o_carácter});
type Color is (Rojo, Ambar, Verde);
type Gema is (Ambar, Berilo, Cuarzo);
Hay "sobrecarga" en
SOLUCIONES:
- Por contexto
Ambar
Una_gema: Gema;
…
Una_gema := Ambar
- Por cualificación
Color'(Ambar)
ó Gema'(Ambar)
Pueden declararse subtipos a partir de estos tipos
subtype Cuidado is Color range Rojo..Ambar;
subtype Seguro is Color range Verde..Verde;
Introducción a Ada - 23
Tipos Enumerados
Tipos Enumerados Predefinidos
type BOOLEAN is (False, True);
type CHARACTER is (nul,… 'A','B','C',
…'a','b','c',…,del);
Introducción a Ada - 24
Tipos Numéricos
I, J : INTEGER;
F
: FLOAT;
El rango de los enteros viene limitado por la implementación
Subtipos Predefinidos
subtype NATURAL
is INTEGER range 0..INTEGER'Last;
subtype POSITIVE is INTEGER range 1..INTEGER'Last;
SHORT_INTEGER
LONG_INTEGER
Los puede ofrecer
la implementación
-- Se pueden convertir
I: integer;
F: float;
...
I:= integer(F) + 1;
F:= F + float(I);
Introducción a Ada - 25
Matrices
TYPE <identificador> IS ARRAY (rango_del_array) OF <tipo_de_los_elementos>
type Matriz is array (1..N, 1..M) of REAL;
type Semaforos is array (Color) of BOOLEAN;
type Vector is array (POSITIVE range <>) of REAL;
Asignación de Valores
Semaforo : Semaforos;
...
Semaforo(Rojo) := True;
Semaforo := (Rojo=>True, others=>False);
-------------------------------------Un_vector : Vector(1..20);
Otro_vector: Vector(5..50);
...
Un_vector(2) := 7.0;
Otro_vector(7..9) := (1.1, 2.2, 3.3);
Un_vector(1..10) := Otro_vector(11..20);
Introducción a Ada - 26
Agregados
Para dar valores a todos los elementos de un vector,
clásicamente se hace así:
Semaforo (Rojo) := True;
Semaforo (Ambar) := False;
Semaforo (Verde) := False;
Ahora es más fácil así:
Semaforo := (True, False, False);
Semaforo := (Rojo => True,
Ambar => False,
Verde => False);
Semaforo := (Rojo => True,
others => False);
Introducción a Ada - 27
Agregados
¿Cómo inicializamos un vector?
type Lineas is array (1..80) of Character;
...
Linea : Lineas := (' ',' ',' ',' ',...,' ');
Es más fácil así:
Linea : Lineas := (others => ' ');
Esta última forma siempre será válida,
aunque en un futuro cambiemos
el rango del vector.
Introducción a Ada - 28
Tiras de Caracteres (Strings)
type String is
array (Positive range <>) of Character;
S
: String (1..20);
Estrellas: String (1..120) := (others => '*');
Str1: String(1..8) := "Un Valor";
Str2: String(3..10);
Str3: String(1..10);
...
¡ERROR!
...
solo se pueden asignar strings
Str2 := Str1;
de la misma longitud
Str3 := Str1;
...
Str3(1..8) := Str2;
Introducción a Ada - 29
Tiras de Caracteres (Strings)
Operador & (concatenador de matrices)
Escribir nombre y apellidos
...
Put(Nombre);
Put(" ");
Put(Apellidos);
...
...
Put(Nombre & " "
& Apellidos);
¡ Más
Fácil !
Introducción a Ada - 30
Registros
type <identificador> is
record
<identificador>
{,<identificador>}:<tipo_del_campo> [:= <expresión>]
...
end record;
Introducción a Ada - 31
Registros
type Nombres is array (1..50) of Character;
type Fechas is
record
Dia : Integer range 1..31;
Mes : Integer range 1..12;
Anyo : Integer;
end record;
type Fichas is
record
Nombre
: Nombres;
Fecha_Nacimiento : Fechas;
end record;
Ficha : Fichas;
Ficha.Nombre := (others > ' ');
Ficha.Fecha_nacimiento.Dia := 15;
Ficha.Fecha_nacimiento.Mes := 9;
Ficha.Fecha_nacimiento.Anyo:= 1956;
Ficha.Fecha_nacimiento := (15,9,1956);
Introducción a Ada - 32
Tipo ACCESO
type <identificador> is access <nombre_tipo>
Según el ejemplo anterior de la fichas,
nos podría interesar disponer
de un fichero encadenado.
Primera: Dir_123
Nombre: …
Fecha_nacimiento: …
Siguiente: …
Nombre: …
Fecha_nacimiento: …
Siguiente: …
Nombre: …
Fecha_nacimiento: …
Siguiente: null
"ACCESOS"
Fin de
la lista
Introducción a Ada - 33
Tipo ACCESO
type Fichas; -- Para deshacer el ciclo
type Puntero is access Fichas;
type Fichas is
record
Nombre:
Nombres;
Fecha_nacimiento: Fechas;
Siguiente:
Puntero;
end record;
Introducción a Ada - 34
Tipo ACCESO
Primera: Puntero;
...
Primera := new Fichas;
Primera.Fecha_nacimiento := (15,9,1956);
Primera.Siguiente := new Fichas;
Primera: Dir_xxx
Nombre: …
Fecha_nacimiento: 15-9-1956
Siguiente: Dir_xxx
Nombre: …
Fecha_nacimiento: …
Siguiente: null
Introducción a Ada - 35
Conversión de Tipos
I : Integer := 3;
R : Real
:= 5.6;
...
...
I + R
¡ ERROR !
Real(I) + R
8.6
I + Integer(R)
9
utiliza REDONDEO
no truncamiento
Para poder aplicar la conversión,
tiene que existir cierto grado de compatibilidad
entre los tipos.
Introducción a Ada - 36
Algunas conversiones permitidas
Los arrays deben ser de la misma longitud
en todas sus dimensiones, y los tipos de los índices
y de los componentes deben ser compatibles.
type Vectores_A is array(1..5) of Real;
type Vectores_B is array(1..5) of Real;
...
Vector_A: Vectores_A;
Vector_B: Vectores_B; -- tipo distinto!
Un_vector: array(1..5) of Real; -- !ANONIMO!
...
Vector_A := Vectores_A(Vector_B);
Vector_A(1..3) := Vectores_A(Vector_B)(2..4);
Un_vector := Vector_B; -- !!! ERROR !!!
¡ HUIR DE LOS TIPOS ANÓNIMOS !
Introducción a Ada - 37
Algunas conversiones permitidas
En los tipos enumerados, la conversión se realiza
tomando como valor la posición ordinal que ocupa
cada elemento en la definición de su tipo.
type Romanos is (I,V,X,L,C,D,M);
type Arábigos is (Uno,Cinco,Diez,Cincuenta,
Cien,Quinientos,Mil);
...
A: Arabigos;
...
A:= Arabigos(X); -- A toma el valor "Diez"
Introducción a Ada - 38
Una Introducción a Ada
4. Expresiones
Introducción a Ada - 39
Expresiones
Lógicos (and, or, xor, not)
A and (B or C)
V := B=C
Operadores
A := B+C;
if x>Y then ...
Aritméticos (+,-,*,/,MOD,REM,**,ABS)
3+2
5
7/3
2
Relacionales
3**2
9
(=,/=,<,>,<=,>=)
ABS(3)
3
A < B
ABS(-3)
3
A /= B
A >= B
(A > B) and (C < D)
Concatenación (&)
"ARCO" & " " & "IRIS"
"ARCO IRIS"
Introducción a Ada - 40
Atributos
Expresiones
ATRIBUTOS
Son funciones que aplicadas a Tipos y Objetos,
devuelven ciertas características suyas.
ADDRESS
procedure Proc (V: System.Address) is
begin
...
end Proc:
V1: Mi_tipo;
...
Proc (V1'Address);
Introducción a Ada - 41
Atributos
Expresiones
type Color is (Rojo, Ambar, Verde);
PRED
Color'Pred(Verde)
Ambar
Color'Pred(Rojo)
¡Error!
SUCC
Color'Succ(Verde)
¡Error!
Color'Succ(Rojo)
Ambar
Color'Succ(Color'Pred (Ambar))
Ambar
Introducción a Ada - 42
Atributos
Expresiones
FIRST
type Color is (Rojo, Ambar, Verde);
type Semaforo is array (Color) of Boolean;
...
Mi_semaforo: Semaforo := (True,False,False);
Color'First
Semaforo'First
Mi_Semaforo'First
Rojo
Rojo
Rojo
LAST
Color'Last
Verde
Semaforo'Last
Mi_Semaforo'Last
Verde
Verde
False
Mi_Semaforo(Mi_Semaforo'Last)
Introducción a Ada - 43
Atributos
Expresiones
RANGE
P'Range
P'First..P'Last
for I in Rojo..Verde loop
Mi_semaforo(I) := false;
...
end loop;
equivalente
for I in Mi_semaforo'Range loop
Mi_semaforo(I) := false;
...
end loop;
LENGTH
Mi_Semaforo'Length
3
Introducción a Ada - 44
Una Introducción a Ada
5. Estructuras de Control
Introducción a Ada - 45
Estructuras de Control
IF
...
...
END IF;
CASE
...
...
END CASE;
LOOP
...
...
END LOOP;
WHILE …
FOR …
Introducción a Ada - 46
Bifurcación Condicional
Sentencia IF
IF <condición> THEN
<secuencia_de_instrucciones>
{ELSIF <condición> THEN
<secuencia_de_instrucciones>
[ELSE
<secuencia_de_instrucciones>
END IF;
if Hay_comida then
Comer;
else
Pasar_hambre;
end if;
if Dinero > 0 then
Me_compro_algo;
elsif Dinero = 0 then
Salgo_de_paseo;
else
Me_escondo_de_los_acreedores;
end if;
Introducción a Ada - 47
Bifurcación Condicional
Un caso peligroso
if X/Y < 0 then
Hacer_algo;
end if;
SI Y=0
¡ERROR!
S O L UC I O N E S
if Y/= 0 then
if X/Y < 0 then
Hacer_algo;
end if;
end if;
if Y/= 0 and then X/Y< 0 then
Hacer_algo;
end if;
Introducción a Ada - 48
Bifurcación Condicional
Otro caso problemático
subtype Rango is integer range 1..10;
X: array (Rango) of integer;
I: integer;
...
...
if not (I in Rango) or X(I) < 0 then
Mensaje de error;
si esto se evalúa primero
y además I=15
end if;
LA SOLUCIÓN
¡ERROR!
...
if not (I in Rango) or else X(I) < 0 then
Mensaje_de_Error;
end if;
Introducción a Ada - 49
Sentencia CASE
Sentencia CASE
CASE <expresión> IS
WHEN <opciones> => <Secuencia_de_instrucciones>;
{WHEN <opciones> => <Secuencia_de_instrucciones>;
END CASE;
type Meses is (Ene,
Jul,
Mes: Meses;
...
case Mes is
when Oct
when Jul..Ago
when Feb|Jun|Jul
when others
Feb, Mar, Abr, May, Jun,
Ago, Sep, Oct, Nov, Dic);
=>
=>
=>
=>
Vuelta_a_clase;
Las cláusulas when
null;
cubrir todos
Examinarse; deben
los valores del
Estudiar;
discriminante.
Ir_de_copas;
end case;
Introducción a Ada - 50
Sentencias de Bucles
Sentencia LOOP
LOOP
<Secuencia_de_Sentencias>
END LOOP;
Instrucción de Salida del Bucle
EXIT
así, más claro
loop
loop
...
...
...
...
if Mi_condicion then exit when Mi_condicion;
exit;
...
end if;
...
end loop;
end loop;
Introducción a Ada - 51
Bucle WHILE
Bucle WHILE
WHILE <condición> LOOP
<Secuencia_de_Sentencias>
END LOOP;
...
...
while not arreglado loop
...
Arreglar(El_mundo, arreglado);
...
exit when Otra_condicion;
...
end loop;
...
Introducción a Ada - 52
Bucle FOR
Bucle FOR
FOR <variable> IN [reverse] <rango> LOOP
<Secuencia_de_Sentencias>
END LOOP;
variable declarada implícitamente aquí
...
for I in 1..100 loop
...
Se puede salir
Estudiar(Algoritmica, aprendido);
por otra condición
exit when aprendido;
La variable de
control se puede leer
...
Contador := I;
I:= Contador;
...
La variable de
control
NO se puede
end loop;
modificar
...
Introducción a Ada - 53
Bucles anidados
loop
...
...
while Una_condicion loop
...
exit when Otra_condicion;
...
end loop;
...
for I in lunes..viernes loop
trabajar;
end loop;
...
end loop;
Introducción a Ada - 54
Una Introducción a Ada
6. Subprogramas
(Funciones y Procedimientos)
Introducción a Ada - 55
Subprogramas (Funciones y Procedimientos)
FUNCIONES
FUNCTION <nombre_función> (p1: t1;
p2: t2;
...
pn: tn) RETURN t IS
<declaraciones_locales>
BEGIN
...
...
RETURN <expresión>;
...
END <nombre_función>;
Introducción a Ada - 56
Funciones
function Factorial (N: positive)
return positive is
begin
if N=1 then
return 1;
else
return N * Factorial(N-1);
end if;
end Factorial;
Algunas
Formas
de Llamada
F: positive;
...
F := Factorial(5);
...
for I in 1.10 loop
Put (Factorial(I));
New_Line;
end loop;
Introducción a Ada - 57
Procedimientos
PROCEDIMIENTOS
PROCEDURE <nombre_procedimiento> (p1: <modo> t1;
p2: <modo> t2;
...
pn : <modo> tn)
<declaraciones_locales>
BEGIN
<sentencias>
In
solo se pueden
...
leer
Modo
[RETURN];
Out
solo pueden
...
recibir valores
END <nombre_procedimiento>;
In Out se pueden leer
y recibir valores
Introducción a Ada - 58
Procedimientos
Procedimiento que calcula
H2 – C12
H
¿C2?
C1
procedure Cateto(H,C1: in
real;
C2:
out real;
Error: out boolean) is
Aux: constant real := H**2 – C1**2;
begin
Error := Aux < 0.0;
Ejemplo de llamada
if Error then
Hip:
real := 9.5;
return;
Cat_1: real := 7.0;
else
Cat_2: real;
C:= Sqrt(Aux);
Fallo: boolean;
end if;
...
end Cateto;
...
Cateto(Hip,Cat_1,Cat_2,Fallo);
...
Introducción a Ada - 59
Paso de Parámetros por Nombre
Al procedimiento Proc
procedure Proc (I: integer;
J: integer);
se le puede llamar así:
Proc (5, 8);
Proc (I => 5, J => 8);
Proc (J => 8, I => 5);
Proc (5, J => 8);
Introducción a Ada - 60
Parámetros por Defecto
Se pueden establecer valores por defecto
para los parámetros de entrada (tipo IN)
type Licores is (Ginebra, Vodka);
type Estilo is (Con_hielo, Seco);
type Extra
is (Aceituna, Limon);
...
procedure Martini is (Base: Licores := Ginebra;
Como: Estilo := Con_hielo;
Con: Extra
:= Limon);
Algunas
Llamadas
Martini (Como => Seco);
Martini (Vodka, Con => Aceituna);
Martini (Ginebra, Seco);
Martini;
Se pueden mezclar las notaciones Posicional y Por Nombre,
pero una vez que se empieza a nombrar, se deben nombrar hasta el final.
Introducción a Ada - 61
Sobrecarga de Subprogramas
type Raices is (Bulb, Rizoma, Otros);
type Plantas is (Margaritas, Jacintos, Lirios);
---------------------------------------------function Raiz (Mi_planta: Plantas)
return Raices is
begin
... -- Devuelve el tipo de raiz
... -- de la planta.
end Raiz;
---------------------------------------------function Raiz (V: integer) return real is
begin
... -- Calcula la raiz cuadrada
... -- de un numero entero.
end Raiz;
---------------------------------------------function Raiz (V: real) return real is
begin
... -- Calcula la raiz cuadrada
... -- de un numero real.
end Raiz;
¡3 funciones
con el mismo
nombre!
Introducción a Ada - 62
Sobrecarga de Subprogramas
Algunas Llamadas
x:= Raiz(Lirios);
Y:= Raiz(8);
Z:= Raiz(8.0);
La ambigüedad se resuelve por
el tipo de los parámetros
y el tipo del valor que devuelve la función.
¿Y si también hay ambigüedad
en los parámetros?
Hay que cualificarlos
Raices'(Bulbo)
Introducción a Ada - 63
Sobrecarga de Operadores
Se pueden definir funciones cuyo identificador
sea alguno de los operadores predefinidos
+ - * < > . . . = /=
function Suma_matrices (M1, M2: Matrices)
return Matrices is
...
end Suma_matrices;
...
A, B, C: Matrices;
...
A := Suma_matrices (B,C);
¡Mejor así!
No se permiten valores por defecto
para los parámetros.
Se debe mantener el número original de
parámetros de los operadores
predefinidos (unarios o binarios).
function "+" (M1, M2: Matrices)
return Matrices is
...
end "+";
...
A, B, C: Matrices;
...
A := B+C;
-- Uso infijo
A := "+"(B,C); -- Uso prefijo ¡¡??
Introducción a Ada - 64
Una Introducción a Ada
7. Paquetes
Introducción a Ada - 65
Paquetes
Vamos a implementar una pila de enteros …
Max : constant := 100;
Pila: array (1..Max) of integer;
Cima: integer range 0..Max := 0;
procedure Meter(X: integer) is
begin
Cima := Cima + 1;
Pila(Cima) := X;
end Meter;
procedure Sacar(X: out integer) is
begin
X := Pila(Cima);
Cima := Cima - 1;
end Sacar;
¡Problema!
El usuario tiene acceso
a las variables Pila y Cima,
por lo que podría realizar
manipulaciones incorrectas
no deseadas.
Introducción a Ada - 66
Paquetes
Los paquetes son módulos
que encapsulan un conjunto
de recursos relacionados
(todo lo que se puede declarar en Ada)
Constan de
Especificación
(parte accesible)
Implementación
o cuerpo
(parte inaccesible)
Especificación (parte accesible)
package Pila_enteros is
procedure Meter(X: integer);
procedure Sacar(X: out integer);
end Pila_enteros;
Introducción a Ada - 67
Paquetes
Implementación o cuerpo (parte inaccesible)
package body Pila_enteros is
Max: constant := 100;
Pila: array (1..Max) of integer;
Cima: integer range 0..Max;
procedure Meter(X: integer);
begin
Cima := Cima + 1;
Pila(Cima) := X;
end Meter;
procedure Sacar(X: out integer);
begin
X := Pila(Cima);
Cima := Cima - 1;
end Meter;
begin -- Inicialización del paquete (opcional)
Cima := 0;
end Pila_enteros;
Introducción a Ada - 68
Cláusula WITH
Paquetes
¿Cómo indica el usuario
los paquetes que necesita?
Con la cláusula WITH
with Pila_enteros;
procedure Ejemplo_1 is
I: integer;
begin
...
Pila_enteros.Meter(I);
...
Pila_enteros.Sacar(I);
...
end Ejemplo_1;
Introducción a Ada - 69
Cláusula USE
Paquetes
¿Y para hacer directamente visibles
los servicios del paquete?
Con la cláusula USE
with Pila_enteros;
use Pila_enteros;
procedure Ejemplo_1 is
I: integer;
begin
...
Meter(I);
...
Sacar(I);
end Ejemplo_1;
Introducción a Ada - 70
Texto
Algunos paquetes útiles para E/S
package Text_IO is
procedure New_Line(Spacing: positive := 1);
procedure Get(Item: out character);
procedure Put(Item: in character);
procedure Get(Item: out string);
procedure Put(Item: in string);
procedure Get_line(Item: out string;
Last: out natural);
procedure Put_line(Item: in string);
...
...
end Text_IO;
Introducción a Ada - 71
Algunos paquetes útiles para E/S
Texto
with Text_IO; use Text_IO;
procedure Adivina_nombre is
Nombre:
string (1..20);
Long_nombre: natural;
begin
Put("¿Cómo te llamas?: ");
Get_Line(Nombre, Long_nombre);
Put_Line("¡Ya sé cómo te llamas?");
Put("Te llamas ");
Put(Nombre(1..Long_nombre);
end Adivina_nombre;
Introducción a Ada - 72
Algunos paquetes útiles para E/S
Números Enteros
with Text_IO; use Text_IO;
procedure Adivina_numero is
type Mis_numeros is new integer range -20..20;
package Mis_numeros_IO is new integer_IO(Mis_numeros);
use Mis_numeros_IO;
Numero: Mis_numeros;
begin
Put("Piensa y escribe un número del -10 al 10: ");
Get(Numero);
New_line;
Put("El doble del número pensado es el ");
Put(Numero*2); -- ¡Se puede operar con Numero!
end Adivina_numero;
Introducción a Ada - 73
Algunos paquetes útiles para E/S
Ficheros y Números Enteros
with Sequential_IO, Text_IO;
procedure prueba_fiheros is
package Ficheros_enteros is new Sequential_IO(integer);
use Ficheros_enteros;
package Enteros_IO is new Text_IO.Integer_IO(integer);
use Enteros_IO;
fichero: file_type;
valor:
integer := 7;
begin
create(fichero, out_file, "Fichero_prueba");
write(fichero, valor*2);
close(fichero);
open(fichero, in_file, "Fichero_prueba");
read(fichero, valor);
close(fichero);
put(valor);
end prueba_ficheros;
Introducción a Ada - 74
Unidades de Biblioteca Predefinidas
Paquete CALENDAR
Paquete SYSTEM
Paquete MACHINE_CODE (opcional)
Procedimiento genérico UNCHECKED_DEALLOCATION
Función genérica UNCHECKED_CONVERSION
Paquete genérico SEQUENTIAL_IO
Paquete genérico DIRECT_IO
Paquete TEXT_IO
Paquete IO_EXCEPTIONS
Paquete LOW LEVEL_IO
Introducción a Ada - 75
Paquete SYSTEM
En la programación, hay algunos elementos cuyo manejo resulta peligroso…
pero que, a veces, son imprescindibles.
package System is
type Address is definido_en_implementación
type Name
is definido_en_implementación
System_Name
: constant Name := def_impl.
Storage_Unit : constant := def_impl.
Memory_Size : constant := def_impl.
-- Números con
Min_Int
:
Max_Int
:
Max_Digits
:
Max_Mantissa :
Fine_Delta
:
Tick
:
...
end System;
nombre dependientes del sistema.
constant := def_impl.
constant := def_impl.
constant := def_impl.
constant := def_impl.
constant := def_impl.
constant := def_impl.
Introducción a Ada - 76
Una Introducción a Ada
8. Excepciones
Introducción a Ada - 77
Excepciones
Una Excepción se produce ante:
• Una situación excepcional: Ej. Fin de Fichero (alto nivel)
• Un error: Ej. Error de Lectura en Disco
(bajo nivel)
Introducción a Ada - 78
Excepciones
procedure Facturacion is
...
Fin_fichero: boolean := FALSE;
o
t
...
mien l
a
t
a
a
n
Tr
begin
encio
v
n
o
C
while not Fin_fichero loop
Leer_pedido(Pedido, Fin_fichero);
if not Fin_Fichero then
Tratar_pedido(Peido);
end if;
end loop;
...
end Facturación;
Introducción a Ada - 79
Excepciones
iento
m
a
t
Tra
nal
o
i
c
p
Exce
procedure Facturacion is
...
Fin_fichero: boolean;
...
begin
loop
Leer_pedido(Pedido, Fin_fichero);
Tratar_pedido(Pedido);
end loop;
...
exception
when End_error => -- Fin de fichero
Text_IO.Put_line("Se acabó");
end Facturación;
Introducción a Ada - 80
Cuestiones sobre las Excepciones
" ¿Cómo se declara una excepción?
¿Cómo se alcanza o señala una condición
# de excepción?
¿A dónde se cede el control una vez tratada
$ la excepción?
procedure Principal is
Excepcion_local: exception;
begin
...
if Condición_extraña then
raise Excepcion_local;
end if
...
exception
when Constraint_error => Hacer_algo;
when Excepcion_local => Hacer_otra_cosa;
when others
=> No_se_que_hacer;
end Principal;
Introducción a Ada - 81
Excepciones
Declaración y Tratamiento
procedure Principal is
procedure Calculo is
...
Excepcion_local: exception;
begin
...
raise Excepcion_local;
...
exception
when Excepcion_local =>
Put_line("¡Te pillé!");
end Calculo;
begin -- Principal
...
Calculo;
exception
when others =>
Put_line("Algo raro pasa!!!);
raise;
end Principal;
La declaración de una excepción es
similar a la de otros objetos, y
sigue las mismas reglas de ámbito,
aunque sus efectos pueden
propagarse más allá de su ámbito.
RAISE sin nombre de excepción
solamente puede utilizarse dentro
de un manejador de excepciones.
Su efecto es propagar al exterior
la excepción que se está tratando.
El manejador OTHERS sirve para
tratar excepciones que se han
propagado fuera de su ámbito
porno encontrar un manejador.
Introducción a Ada - 82
Señalamiento de Excepciones
Una excepción puede señalarse
Implícitamente
(comprobaciones en ejecución)
CONSTRAINT_ERROR
Access_Check
Discriminant_Check
Division_Check
Index_Check
Length_Check
Overflow_Check
Range_Check
Tag_Check
Explícitamente
(sentencia RAISE)
PROGRAM_ERROR
Elaboration_Check
Accessibility_Check
STORAGE_ERROR
Storage_Check
TASKING_ERROR
pragma Suppress (All_Checks);
Introducción a Ada - 83
Descargar