Anda di halaman 1dari 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: with ada_io; use ada_io; procedure Doble is x, y: integer; begin
comienzo del cuerpo especificacin del contexto especificacin del programa

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