Академический Документы
Профессиональный Документы
Культура Документы
que se utilicen. Un procedimento consta de: (1) una cabecera (lnea 5 del
segundo ejemplo), donde se le da nombre, (2) una seccin de declaraciones,
donde se declaran y/o definen todos los elementos que el procedimiento va a
utilizar (variables, constantes, tipos, procedimientos, funciones, ...), y (3) el
cuerpo del procedimiento --las sentencias que describen su algoritmo, lneas 7
a 10--, que comienza con la palabra "begin" y termina con la palabra "end"
acompaada del nombre del procedimiento. El cuerpo de un procedimiento no
puede estar vaco, en caso de desear, circunstancialmente, tener un
procedimiento que no haga nada, debe de contener la instruccin "null;".
Para definir una constante, se hace igual que para declarar una variable
inicializndola al mismo tiempo, pero poniendo la palabra "constant" antes
del tipo.
c: constant integer := 10;
Ahora bien, si se trata de constantes numricas, tambin se pueden definir sin
especificar su tipo:
pi: constant := 3.1416;
Definicin de tipos.
Tipos escalares.
Los tipos en Ada se clasifican en escalares (simples) y estructurados. Los
escalares se dividen en: discretos, u ordinales, y no discretos. Los tipos
discretos son enumerados y enteros. Los no discretos son los reales. Tanto los
enteros como los reales se clasifican a su vez como numricos.
Los tipos enumerados son aquellos que se definen especificando la lista
ordenada de valores que lo componen:
type Da is (Lun, Mar, Mie, Jue, Vie, Sab, Dom);
type Palos is (Oros, Bastos, Espadas, Copas);
type Gnero is (M, F);
type Color is (Blanco, Rojo, Amarillo, Verde, Azul,
Marrn, Negro);
type Luz is (Rojo, Naranja, Verde);
Una vez definido el tipo, se pueden declarar variables. Si, como ocurre con los
tipos Color y Luz, hay valores que se repiten, habr que cualificar ese valor
cuando su uso pueda ser ambiguo:
x := Color'Rojo; -- x debe ser de tipo Color
y := Luz'Rojo; -- y debe ser de tipo Luz
Ada tiene predefinido el tipo enumerado character --que representa el
alfabeto de caracteres utilizado--, y el tipo boolean, que puede tomar los
valores true o false.
Ada posee un tipo integer predefinido cuyo rango de valores depende de la
implementacin del lenguaje. Adems, se pueden definir nuevos tipos enteros
que pueden ser, con signo o sin signo:
type MiEntero is range -32768..32767; --Entero con
signo
type MiNatural is mod 32767; --Entero sin signo
(rango 0..32766)
En ambos casos se pueden usar expresiones para definir los lmites del tipo:
type MiEntero is range -2**15..2**15; --Entero con
signo
type MiNatural is mod 2**16; --Entero sin signo
(rango 0..65535)
Entrada/salida.
Las funciones bsicas de entrada/salida son:
get(X), put(X) para X de tipo character, string, integer o float
get_line(S,L), put_line(S) para S de tipo string. L es la longitud leda.
Leen o escriben una string en una lnea y pasan a la siguiente.
new_line, que, cuando se est escribiendo, inicia una nueva lnea.
skip_line, que, cuando se est leyendo, desestima el resto de la lnea
actual.
Para realizar entrada/salida de ristras o caracteres basta con incluir la clusula
de contexto "with Text_IO;". Para realizar entrada/salida de otros tipos
escalares hay que hacer, adems, una declaracin, en la seccin de
declaraciones del procedimiento, que especifica la aplicacin de un paquete
genrico de entrada/salida adecuado sobre el tipo en cuestin (a esto se
llama crear una instancia del paquete), tal como se muestra en los siguientes
ejemplos:
package Da_IO is new Enumeration_IO(Da); -Enumeration_IO sirve para tipos enumerados
package MiEntero_IO is new Integer_IO(MiEntero);-Integer_IO sirve para enteros con signo
package rf_IO is new Float_IO(rf); --Float_IO sirve
para reales en coma flotante
package rfija1_IO is new Fixed_IO(rfija1);--Fixed_IO
sirve para reales en coma fija ordinarios
package rfija2_IO is new Decimal_IO(rfija1);-Decimal_IO sirve para reales en coma fija decimales
package Natural_IO is new Modular_IO(Natural);-Modular_IO sirve para enteros sin signo
En cualquier caso, hay que utilizar la clusula "with Text_IO;", puesto que
estos paquetes de entrada/salida (Enumeration_IO, Integer_IO, Float_IO, ...),
se encuentran incluidos en la librera "Text_IO".
Sentencias de control.
Seleccin de dos alternativas.
if Exp_lgica then
sentencias;
end if;
if Exp_lgica then
sentencias;
else
sentencias;
end if;
Seleccin mltiple.
case selector is
when alternativa => sentencias;
when alternativa => sentencias;
...
when others => sentencias;
end case;
El selector debe ser una expresin discreta de tipos integer o enumerados (tipo
ordinal). Las alternativas pueden ser uno o varios valores, o rangos, del tipo
del selector separados por "|" (equivale al operador OR).
case mes is
when 1 .. 2 | 12 => put("El invierno es duro");
when 3 .. 5 => put("Primavera de la vida");
when 6 .. 8 => put("Estacin llena de diversin");
when 9 .. 11 => put("poca de reflexin");
when others => put("En qu planeta ests?");
end case;
Los valores no pueden repetirse entre dos clusulas "when". En el caso de que
las clusulas "when" no cubran todos los posibles valores del tipo del selector,
es necesario incluir la clusula "others" para los valores no contemplados.
Iteracin.
sentencias
end;
(la parte delimitada por corchetes es opcional)
Un bloque puede ponerse en cualquier sitio donde pueda ponerse una
sentencia simple.
Ejemplos de bloques:
--bloque sin declaraciones locales
begin
Put_Line("Hola");
end;
--bloque con declaraciones locales
declare
Aux : integer; --la variable Aux slo existe
dentro del bloque
begin
Aux := i; --i, j estn declarados en un mbito
ms externo
i := j;
j := Aux;
end;
Subprogramas.
Definicin de subprogramas.
Sobrecarga de operadores.
Ada permite que el programador sobrecargue los operadores del lenguaje,
esto es, que pueda redefinirlos dndoles nuevos significados. Para
sobrecargar un operador, simplemente hay que definir una funcin cuyo
nombre sea el operador entre comillas y que tenga los parmetros
adecuados. Por ejemplo, dado el siguiente tipo:
Tipos estructurados.
Arrays.
Records.
Ristras de caracteres.
Ada ofrece los tres tipos posibles de ristras de caracteres: tamao fijo,
tamao limitado y tamao dinmico.
Clusula de contexto
Para usar ristras de tamao fijo, tamao limitado y tamao dinmico, hay
que incluir en la clusula "with" los paquetes "Ada.Strings.Fixed",
"ada.Strings.Bounded" y "Ada.Strings.Unbounded", respectivamente.
with Text_IO, Ada.Strings.Fixed,
Ada.Strings.Bounded, Ada.Strings.Unbounded;
En la cusula "use" slo hay que incluir "Ada.Strings.Fixed" y
"Ada.Strings.Unbounded", ya que las ristras de tamao limitado (bounded)
necesitan una instanciacin para fijar la longitud mxima antes de poder
usarse.
use Text_IO, Ada.Strings.Fixed,
Ada.Strings.Unbounded;
Declaracin
En las ristras de tamao fijo no existe la ristra nula, dado que una variable
de tipo "String" siempre tiene la longitud definida (Ada utiliza caracteres de
relleno, por defecto es el espacio).
La ristra nula para las ristras de tamao limitado est representada por el
valor "Null_Bounded_String".
sl1 := Null_Bounded_String.
La ristra nula para las ristras de tamao dinmico est representada por el
valor "Null_Unbounded_String".
sd1 := Null_Unbounded_String;
Tambin sirve para representar la ristra nula una ristra fija vaca, que se
representa mediante dos dobles comillas (""), pero para ello son necesarias las
funciones de coversin entre ristras.
Literales ristra
sf1 := to_string(sl1);
--conversin de
bounded_string a string
sf2 := to_string(sd1);
unbounded_string a string
--conversin de
sl2 := to_bounded_string(to_string(sd1));
--
conversin dinmica->fija->limitada
Se pueden asignar entre s ristras del mismo tipo (son de distinto tipo las
ristras limitadas de diferente tamao).
En las ristras de tamao fijo, la asignacin slo puede realizarse entre
ristras del mismo tamao:
sf1 := "1234567890";
Si se necesita asignar una ristra de un tamao distinto, se puede emplear la
operacin "move":
move("prueba", sf1);
La operacin "move" admite hasta 5 parametros:
procedure Move (Source : in String;
Target : out String;
Drop
: in Truncation :=
Error;
Justify : in Alignment :=
Left;
Pad
: in Character := Space
);
Entrada / Salida
Inicio : in Positive;
Fin
: in Natural )
return String;
Hay que tener cuidado de que los lmites del slice estn comprendidos
dentro del rango de ndices de la ristra, ya que si no se producira un error.
Concatenacin
: in String;
Pattern
return Natural;
: in String )
--Source
s1,s2 : string(1..5);
s3 : string(1..10);
...
s1 := "12345";
s2 := "abcde" ;
s3 := s1 & s2;
put(Index(s3,"45")); --Se escribe un 4
Operadores relacionales
Los operadores relaciones (=, /=, <, >, <=, >=) son aplicables entre ristras
atendiendo al alfabeto utilizado.
Ms sobre ristras...
Excepciones.
Introduccin.
1. Capturarla
2. Ignorarla
Si se captura, entonces cabe:
1. Controlarla, e intentar que el programa contine su ejecucin.
2. Reenviarla a otra parte del programa.
La captura de excepciones se realiza en una seccin que se inicia con la
palabra "exception" y se puede situar al final de cada bloque (begin..end).
Dentro de esta seccin se utilizan sentencias "whenNombreExcepcin" para
capturar las distintas excepciones y situar el cdigo que realiza el tratamiento
de las mismas.
Si se quiere relanzar la excepcin, basta con poner la sentencia "raise". Si
se desea, se puede lanzar una nueva excepcin con
"raise NombreExcepcin".
begin
...
exception
when E1 =>
...
when E2|E3|...|En =>
...
when others =>
...
end;
Excepciones de entrada/salida.
raise Divisin_por_cero;
end Divide;
a, b: integer;
begin
Leer(a,b);
put("El cociente es: "); put(Divide(a,b));new_line;
exception
when Divisin_por_cero => --se deja que el programa acabe de forma
controlada
new_line;
put_line("
end Excepciones;
Paquetes.
Los paquetes son la clase de unidad ms importante. En general un
programa en Ada se compone de un conjunto de paquetes y un
procedimiento principal. La clasula de contexto "with" sirve para declarar
que se van a usar los servicios de un paquete.
Un paquete se divide generalmente en dos partes: especificacin e
implementacin (body). Ambas partes se sitan casi siempre en ficheros
diferentes, con las extensiones "*.ads" y "*.adb", respectivamente.
La estructura de la especificacin de un package es la siguiente:
package nombre_de_la_unidad is
--declaraciones
private
--declaraciones privadas
end nombre_de_la_unidad;
Las declaraciones que aparecen antes de la palabra "private" constituyen la
parte visible, o interfaz, del paquete. Las que aparecen despus son privadas;
no obstante, la parte privada es opcional, y si no aparece la palabra "private"
se entiende que el paquete no tiene parte privada.
Las declaraciones pueden ser desde declaraciones de tipos hasta prototipos
de procedimientos o funciones. Un prototipo de un procedimiento o
funcin es su cabecera, pero cambiando la palabra "is" por un punto y coma
Operadores principales
Clasificacin Operador Descripcin
Delimitadores ()
Llamada a funcin
()
.
Aritmticos
**
Elemento de un array
Operador punto para los miembros de un
estructura
Exponenciacin
abs
NOT
*
Valor absoluto
no lgico
Multiplicacin
/
rem
=
&
Divisin
Resto
Menos unario
Suma unaria
Concatenacin de string
+
Relacionales =
Suma
Sustraccin
Igualdad lgica
Lgicos
/=
<
<=
>
>=
in
not in
and
Desigualdad lgica
Menor que
Menor o igual que
Mayor que
Mayor o igual que
Miembro de
No miembro de
Y lgico
Asignacin
or
O lgico
xor
O exclusive
and then
or else
:=
Asignacin simple
Separador
Separador coma
Asociacin
De izquierda a
derecha
De derecha a
izquierda
De izquierda a
derecha
De izquierda a
derecha
De izquierda a
derecha
De izquierda a
derecha
De derecha a
izquierda
De izquierda a
derecha