Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ApunteAda PDF
ApunteAda PDF
Ao 2005
LENGUAJE ADA
Estructura de un programa
Todo programa Ada tiene 4 componentes:
la especificacin del contexto;
la especificacin del programa;
la parte declarativa;
el cuerpo.
La parte de especificacin del contexto son directivas al compilador Ada. Pueden incluir
determinadas libreras, por ejemplo: la sentencia with ada_io incluye la librera de
entrada/salida, en donde se encuentran los procedimientos que realizan la entrada/salida.
La especificacin del programa da el nombre del programa.
La parte declarativa incluye las declaraciones de cualquier objeto. Puede contener
definiciones de variables y procedimientos.
El cuerpo del programa est compuesto de la secuencia de sentencias.
Ejemplo:
parte declarativa
get(x);
-- lee un nmero
y:=x*2; -- lo multiplica por 2
put(y);
--imprime el resultado
new_line; -- avanza a la siguiente lnea
end Doble;
Paradigmas de Programacin
Ao 2005
16#FF#
2#1111_1111#
Paradigmas de Programacin
Ao 2005
Ejemplo:
estos es un string
123
Expresiones
No es posible mezclar variables de distintos tipos en una misma expresin.
Ejemplo:
i: integer;
x: float;
x:=3.7;
i:=1;
x:=x+i;
No es correcto.
Declaraciones
Existen dos tipos de objetos: variables y constantes.
Ejemplo:
x: integer;
y: constant float:=1.9;
x es una variable e y es una constante de tipo flotante.
La declaracin de constantes como en Pascal, debe incluir una inicializacin. Las
declaraciones de variables pueden incluir una inicializacin que especifica el valor inicial
de las variables.
Ejemplo:
n: integer:= 10;
p: integer:= n+1:
Paradigmas de Programacin
Ao 2005
Estructuras de control
Asignacin:
:=
Sentencias condicionales
if condicin
then sentencias
endif;
if condicin
then sentencias
else sentencias
endif;
if condicin
then sentencias
elseif cond then
elseif cond then
else
endif;
case n is
when 0 | 1 => sentencias
when 3 =>
when 4..10 =>
when others =>
end case;
Nota: la clusula others debe ir obligatoriamente cuando no se especifican todos los
posibles valores de n.
Sentencias de repeticin
while condicin loop
...................
end loop;
for i in 0..10 loop
...
end loop;
Lenguaje ADA Pgina 4
Paradigmas de Programacin
Ao 2005
Subprogramas
Ada define dos tipos de subprogramas: procedimientos y funciones.
Ejemplo:
with ada_io; use ada_io;
procedure demo is
n: integer := 4;
parmetro formal
parmetro real
Aclaracin: notar que la variable i del loop no est declarada. Esto es porque Ada
permite declarar implcitamente las variables de control del for y son definidas como
de lectura nicamente, esto es, no es posible alterar su valor.
Parmetros formales
Recordamos que los parmetros formales representan objetos locales al procedure. Hay 3
tipos de pasaje de parmetro: in, out e in out.
in: parecido al pasaje por copia, pero el parmetro acta como una constante, y,
por lo tanto no se puede modificar su valor.
out: parmetro por resultado
in out: acta como una variable local que se inicializa con el valor del parmetro
real y es asignado al parmetro real cuando finaliza el procedimiento. (Segn el
caso es valor-resultado o referencia)
Si no se especifica explcitamente ninguno de estos tipos, se asume in.
Paradigmas de Programacin
Ao 2005
Ejemplo:
procedure space(cant: integer:= 1) is.
..
end space;
De esta manera se puede invocar al procedimiento space sin parmetros reales:
space;
Los nombres de los subprogramas se puedensobrecargar. Es decir, que diferentes
subprogramas pueden tener el mismo nombre, pero distinto tipo y/o nmero de parmetros.
Ejemplo:
Procedure put(item:character)
Procedure put(item:integer);
Funciones
Ejemplo:
function pepe(n: intejer) return integer is
.
return.
end pepe;
Los parmetros de una funcin siempre son in.
Alcance de variables
El alcance de las variables va desde su definicin hasta el final del subprograma que la
engloba. (parecido a Pascal.-alcance esttico-)
Es posible calificar una variable, de esta manera se puede acceder a un identificador que
est enmascarado.
Ejemplo:
procedure A is
x: integer:=10;
procedure B is
x:float:= 1.9;
begin
put(x);
put(A.x);
Paradigmas de Programacin
Ao 2005
end B;
begin
B;
end A;
El alcance de la variable x entera definida en A es todo el procedure A y TODO el
procedure B (ya que es posible calificar y, por lo tanto, acceder a la variable).
Tipos enumerativos
Un tipo define un conjunto de valores posible para una variable o expresin y las
operaciones sobre ellos. Veamos la siguiente declaracin:
type das_de_la_semana is (dom, lun,.sab);
hoy: das_de_la_semana;
Con esta declaracin definimos un nuevo tipo (das_de_la_semana) enumerando todos los
posibles valores. La variable hoy es del tipo das_de_la_semana y, por lo tanto puede
asumir cualquiera de sus valores.
Ejemplo:
hoy:=dom;
Los tipos enumerativos son tipos discretos y sus valores pueden usarse como limites en un
rango discreto:
Ejemplo:
for ch in character loop;
for i in integer loop;
for dia in dias_de_la_semana loop;
for dia in lun..jue loop;
Adems definen un orden en la enumeracin y por lo tanto pueden utilizarse los operadores
relacionales.
Ejemplo: lun<mie
Subrangos y subtipos
x:integer;
y:integer range 1..10
no defino un nuevo tipo, sino una restriccin del tipo base (en este caso integer)
x:=y;
Paradigmas de Programacin
Ao 2005
y:=x;
Ambas asignaciones son correctas, solo que la segunda puede causar error de ejecucin si
x contiene valores fuera del rango 1..10
Nota: El operador in: Me permite testear si un valor est en un rango determinado
Ejemplo:
i in 1..n
es equivalente a 1<=i<=n
Atributos
Ada define varios atributos de tipos discretos. Los atributos de un tipo se obtienen de la
siguiente forma:
nombre del tipo nombre de atributo
Ejemplo:
dias_de_la_semana first --retorna dom
Los atributos que se pueden aplicar a tipos discretos son:
Atributo
first
last
pos
val
succ
pred
image
Descripcin
el 1ro.
el ltimo
posicin del valor dentro del tipo
dada la posicin (integer) retorna el valor correspondiente
sucesor
predecesor
retorna el string que representa a su argumento
Ejemplo:
dias_de_la_semanafirst
dias_de_la_semanalast
dias_de_la_semanapos(dom)
dias_de_la_semanaval(2)
dias_de_la_semanasucc(lun)
dias_de_la_semanaimage(lun)
integerimage(7)
--dom
--sab
--0
--mar
--mar
--lun
--7
Tipo arreglo
La forma de declarar un arreglo en Ada es
vec: array (1..5) of integer
La forma de acceder a cada componente de vec es similar a Pascal:
Paradigmas de Programacin
Ao 2005
vec(3):=0;
vec(i):=10;
--siendo i integer
Registros
type alumno is
Paradigmas de Programacin
Ao 2005
record
nombre: string(10);
numero: integer;
end record
a: alumno;
La forma de acceder a los campos es similar a Pascal:
a.numero:=10;
Adems es posible realizar las siguientes asignaciones:
a:=(pepe,10);
a:=(nombre=>pepe, numero=>10);
asignaciones
correctas
Abstraccin de datos
Un TAD es un tipo definido por el usuario que provee dos caractersticas principales:
encapsulamiento y ocultamiento de informacin.
Para encapsular la definicin del nuevo tipo y las operaciones utilizamos los paquetes.
Paradigmas de Programacin
Ao 2005
Ejemplo 1: Vamos a implementar el TAD persona. Una persona tiene un nombre, apellido,
edad, dni y domicilio. Adems disponemos de las siguientes operaciones VerNombre,
CumplirAnios y CambiarDomicilio.
package paq_persona is
-- Declaracin de los tipos
type Cadena is string (1..30);
type Persona is record
nombre: Cadena;
apellido: Cadena;
edad: integer;
dni: integer;
domicilio: Cadena;
end record
-- Declaracin de las operaciones
function VerNombre(p: Persona) return cadena;
procedure CumplirAnios(p: in out Persona);
procedure CambiarDomicilio(p: in out Persona; nuevo_dom: Cadena);
end paq_persona;
package body paq_persona is
-- Implementacin de las operaciones
function VerNombre(p: Persona) return Cadena is
begin
return p.nombre;
end VerNombre;
procedure CumplirAnios (p:in out Persona) is
begin
p.edad:=p.edad +1;
end CumplirAnios;
procedure CambiarDomicilio(p: in out Persona; nuevo_dom: Cadena) is
begin
p.domicilio:=nuevo_dom;
Lenguaje ADA Pgina 11
Paradigmas de Programacin
Ao 2005
end CambiarDomicilio;
end paq_persona;
Con esto logramos encapsular la definicin del nuevo tipo y las operaciones para
manipularlo. Aunque la estructura es visible desde afuera del paquete. Por lo tanto, no
logramos ocultar la estructura de nuestro TAD. Para esto Ada provee mecanismos. Es
posible definir tipos privados y limitados privados. Los tipos privados slo aparecen en la
especificacin de un paquete. Fuera del paquete las nicas operaciones posibles son la
asignacin, testeos por igualdad y las operaciones definidas en la especificacin del
paquete.
Ejemplo:
package paq_persona is
--Declaracin de tipos
type Cadena is string (1..30);
type Persona is private;
--Declaracin de las operaciones
function VerNombre(p:Persona) return Cadena;
procedure CumplirAnios (p:in out Persona);
procedure CambiarDomicilio(p: in out Persona; nuevo_dom:Cadena);
--Definicin de los tipos privados
private
type Persona is record
nombre:Cadena;
apellido:Cadena;
edad:integer;
dni:integer;
domicilio:Cadena;
end record;
end paq_persona;
Los tipos declarados como limitados privados son menos visibles desde afuera del paquete,
ya que las nicas operaciones permitidas para objetos de este tipo son las definidas en la
especificacin del paquete (ni siquiera la asignacin ni testeos por igualdad)
Ejemplo:
Vamos a implementar en ADA el TAD lista ordenada de enteros definido anteriormente
utilizando arreglos.
package paq_lista is
--Declaracin de tipos y constantes
maxlen:constant integer:=100;
type listaOrdenada is private;
--Decalaracin de operaciones
procedure Crear (l:in out listaOrdenada);
Lenguaje ADA Pgina 12
Paradigmas de Programacin
Ao 2005
ADT genricos
Vamos a generalizar la lista ordenada definida previamente.
generic
type tipo_items is private;
package paq_lista is
--Declaracin de tipos de datos y constantes
maxlen: constant integer:= 100;
type listaOrdenada is private;
--Declaracin de las operaciones
procedure Crear (l: in out listaOrdenada);
function Longitud (l:listaOrdenada) return integer;
procedure Insertar (l: in out listaOrdenada; i:integer; nuevo_item:tipo_items);
procedure Eliminar ( l: in out listaOrdenada; i:integer);
function Recuperar (l: listaOrdenada; i:integer) return tipo_items;
--Definicin de los tipos privados
private
type listaOrdenada is record
long:integer;
items:array(1..maxlen) of tipo_items;
end record;
end paq_lista;
package body paq_lista is
-Implementacin de las operaciones
.................
end paq_lista;
Cmo utilizo el Tad genrico?
En la aplicacin debera declarar:
.......
package lista_de_enteros is new paq_lista(integer);
package lista_de_personas is new paq_lista(Persona);
........
donde se define una lista ordenada de enteros y una lista ordenada de Personas
procedure Insertar (l: in out listaOrdenada; i:integer; nuevo_item:integer);
procedure Eliminar (l: in out listaOrdenada; i:integer);
function Recuperar (l:listaOrdenada; i:integer) return integer;
Paradigmas de Programacin
Ao 2005