Está en la página 1de 14

Paradigmas de Programacin

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:

especificacin del contexto

with ada_io; use ada_io;


procedure Doble is
x, y: integer;
begin

especificacin del programa

parte declarativa

comienzo del cuerpo

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;

fin del cuerpo

Tipos predefinidos y operaciones


Tipo integer: Representa una secuencia de uno o ms dgitos. Ada permite que cualquiera
de los dgitos (excepto el primero) est precedido por el carcter _ para dar legibilidad al
programa.
Ejemplo:
57
18_502_007
nro. de documento
10_18502007_001 nro. de IOMA
Por defecto, se asume que son nmeros decimales, pero existen mecanismos para expresar
enteros en otra base:
Ejemplo:
8#377#
377 octal (255 en decimal)

Lenguaje ADA Pgina 1

Paradigmas de Programacin
Ao 2005

16#FF#
2#1111_1111#

FF hexadecimal (255 en decimal)


1111_1111 binario (255 en decimal)

La base siempre se define en decimal y puede ser entre 2 y 16.


Estn definidas las operaciones aritmticas tradicionales tales como +,-,*,/, y -(negacin)
(los nmeros negativos tcnicamente son expresiones y no literales)
Existen dos procedimientos en ada_io para leer y escribir nmeros enteros: get(i) y put(i)
Tipo flotante: se distinguen por la presencia de un punto decimal. Pueden incluir un
exponente.
Ejemplo:
10.0
0.5
3.14159_26
1.15E-12
1.0e+6
Las mismas operaciones que para los reales de Pascal.
Nota: Es importante aclarar que los valores flotantes y enteros NO pueden
mezclarse en una expresin
Tipo Boolean: Los valores booleanos estn denotados por unos de dos literales
predefinidos: true y false.
Los operadores para este tipo son:
x and y
x or y
x xor y
not x
y los operadores relacionales (=,!=,<,>,etc.)
Tipo Character: Los valores de este tipo representan valores ASCII. Son caracteres
encerrados entre comillas simples.
Ejemplo:
a,A,
Las nicas operaciones definidas para el tipo character son las relacionales.
Tipo string: todos los tipos anteriores son tipos escalares, esto es, que tiene valores que no
pueden ser divididos en partes ms pequeas. Ada tiene un tipo predefinido que es un tipo
compuesto, el tipo String, que consiste de una secuencia de valores character.
Un literal string es una secuencia de cero, o ms caracteres encerrados entre comillas
dobles.
Lenguaje ADA Pgina 2

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.

La forma correcta sera realizando un casting (conversin de tipo explcita)


x:=x + float(i)
Una conversin de tipo consiste del nombre del tipo seguido por una expresin entre
parntesis.

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:

Lenguaje ADA Pgina 3

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

for i in reverse 0..10 loop


....
end loop;

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

procedure space (cant:integer) is


begin
for i in 1..cant loop
put ( );
end loop;
end space;
opcional
begin
space(6);
space(n+2);
end demo;

especificacin del procedimiento

cuerpo del procedimiento

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.

Lenguaje ADA Pgina 5

Paradigmas de Programacin
Ao 2005

Los parmetros pueden tener valores por defecto.

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);

Lenguaje ADA Pgina 6

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

-- y puede tomar valores del 1 al 10.

no defino un nuevo tipo, sino una restriccin del tipo base (en este caso integer)
x:=y;

Lenguaje ADA Pgina 7

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:

Lenguaje ADA Pgina 8

Paradigmas de Programacin
Ao 2005

vec(3):=0;
vec(i):=10;

--siendo i integer

Es posible iniciar arreglos sin la necesidad de utilizar un for:


vec:=(0,0,0,0,0);
vec:=(1=>0, 2=>0, 3=>0, 4=>0, 5=>0);
vec:=(1|2|3|4|5=>0);
vec:=(1..5=>0);
vec:=(others=>0);

Arreglos irrestrictos (var. semidinmicas)


Definen una clase de tipos de array posibles. Cada miembro de la clase tiene el mismo tipo,
el mismo nmero de ndices y el mismo tipo de ndice.
Ejemplo:
type matriz is (integer range<>, integer range<>) of integer;
si quiero declarar una variable matriz debera limitar el ndice
x: matriz(1..5, 1..5);
y: matriz(10..20, 2..3);
Atributos de los arreglos:
first
last
lenght
range
Ejemplo:
procedure imprimir (m:matriz) is
begin
for i in mrange(1)
for j in mrange(2)
put(x(i,j));
end loop;
end loop;
end imprimir;

Registros
type alumno is

Lenguaje ADA Pgina 9

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);

Tipos derivados y subtipos


Cuando se declaran tipos derivados se crean tipos nuevos que heredan todas las
caractersticas del tipo base pero incompatibles con l.
Ejemplo:
type longitud is new integer;
longitud es un nuevo tipo que no es compatible con el tipo integer. Para mezclarlos en
expresiones ser necesario realizar un casting.
subtype cantidad is integer;
cantidad es un subtipo de integer que s es compatible con l.
l: longitud;
c: cantidad;
i: integer;
l:= i;
l:= c;
c:=i;
i:=c;

Cualquiera de las dos asignaciones son


incorrectas. La forma de hacer esto es:
l:= longitud (i) o
l:= longitud

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.

Lenguaje ADA Pgina 10

Paradigmas de Programacin
Ao 2005

Un paquete (package) consiste de dos partes: una especificacin y un cuerpo. La


especificacin da el nombre al paquete y describe sus caractersticas externas, mientras que
el cuerpo define los detalles de implementacin.
Ejemplo:
package nombre is
....
end nombre;
package body nombre is
.
end nombre;

Ac va la parte visible o interfase

Ac van las variables locales y la


implementacin del paquete

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

function Longitud( l:lista Ordenada) return integer;

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;

Lenguaje ADA Pgina 13

Paradigmas de Programacin
Ao 2005

--Definicin de los tipos privados


private
type listaOrdenada is record
long: integer;
items: array(1..maxlen) of integer;
end record;
end paq_lista;
package body paq_lista is
-Implementacin de las operaciones
procedure Crear (l: in out listaOrdenada) is
begin
l.long:=0;
end Crear;
function Longitud (l:listaOrdenada) return integer is
begin
return l.long;
end Longitud;
procedure Insertar (l: in out listaOrdenada; i:integer; nuevo_item:integer) is
begin
.
end Insertar;
procedure Eliminar (l: in out listaOrdenada; i:integer) is
begin
if (i>1) or (i>Longitud(l)
then Indicar error
else
--desplazar los items
for j in 1..Longitud(l) - 1 1oop
l.items(j):= l:items(j+1);
end loop;
l.long:= l.long -1;
endif;
end Eliminar;
function Recuperar (l:listaOrdenada; i:integer) return integer is
begin
......
end Recuperar;
end paq_lista;

Lenguaje ADA Pgina 14

También podría gustarte