Programación en Ada/Sentencias y estructuras de control
Clasificación de sentencias
editar- Simple:
- Secuencial:
- Nula (
null
). - Asignación (X := Y;)
- Llamada a procedimiento.
- Código.
- Llamada a punto de entrada (
entry
). En procesamiento paralelo. - Espera (
delay
). - Terminación abrupta (
abort
). En procesamiento paralelo.
- Nula (
- Control:
- Terminación de bucle (
exit
). - Salto a etiquetas (
goto
). No recomendable. - Elevación de excepción (
raise
). - Retorno de subprograma (
return
).
- Terminación de bucle (
- Secuencial:
- Compuesta:
- Secuencial:
- Paralela:
Bloques
editarAda distingue entre declaraciones, que introducen identificadores nuevos, y sentencias, que no lo hacen. El fragmento de texto más simple que incluye declaraciones y sentencias es un bloque.
Definición
editarbloque ::= [ identificador : ] [declare
parte_declarativa ]begin
sentencias [exception
manejador_de_excepción { manejador_de_excepción } ]end
[ identificador ] ;
Ejemplo
editar-- Supuestas X e Y declaradas con anterioridad de tipo Float:
declare
Temp: Float;-- Esta variable solo es visible dentro del bloque.
begin
-- Se intercambian 2 variables.
Temp := X; X := Y; Y := Temp;end
;
Destacar que un bloque es una sentencia y cuando se ejecuta se elaboran las declaraciones contenidas en su parte declarativa (entre declare y begin) y después se ejecutan las sentencias del cuerpo (entre begin y end).
El ámbito de las variables declaradas en un bloque finaliza cuando termina dicho bloque.
Sentencia de selección (if)
editarDefinición
editarsentencia_selección ::=if
condiciónthen
secuencia_de_sentencias [ {elsif
condiciónthen
secuencia_de_sentencias } ] [else
secuencia_de_sentencias ]end
if
;
with
Ada.Text_Io,Ada.Integer_Text_Io;use
Ada.Text_Io,Ada.Integer_Text_Io;
procedure
comptar_LAis
cp,c: character; n: integer; --declaramos las variablesbegin
Put("Escribe una frase"); --pedimos y recogemos texto Put(c); n := 0; --inicializamos n a cero cp := ' '; get(c); --si cp es espacio seguir leyendowhile
c /= '.'loop
--mientras c sea diferente del PUNTO, entrar en bucleif
cp = 'L'and
c = 'A'then
n := n+1;end
if
; -- si cp es L y c es A incrementar n y finalizar el if cp := c; Get(c); --igualamos cp a c para proceder y c sigue al próximo caracterend
loop
; --FINALIZAMOS BUCLE Put("El numero de palabras de la frase es"); --enseñamos en pantalla la variable n Put(n);end
comptar_LA;
Ejemplo
editarif
Hoy = DOMthen
-- Si hoy es domingo.
Mañana := LUN;elsif
Hoy /= SABthen
-- Si no es domingo ni sábado.
Laborable := True;else
-- Cualquier otro caso.
Mañana := TDía'Succ(Hoy);end
if
;
Sentencia de selección por casos (case)
editarDefinición
editarsentencia_selección_por_casos ::=case
expresiónis
alternativa_caso { alternativa_caso }end
case
; alternativa_caso ::=when
elección { | elección } => secuencia_de_sentencias elección ::= expresión_simple | rango_discreto |others
Ejemplo
editarcase
Hoyis
when
MIE..VIE => Entrenar_duro;-- Rango.
when
MAR | SAB => Entrenar_poco;-- Varias elecciones.
when
DOM => Competir;-- Una elección.
when
others
=> Descansar;-- Debe ser única y la última alternativa.
end
case
;
Bucles
editarSentencia de bucle simple (loop)
editarDefinición
editarsentencia_bucle_simple ::= [ identificador_bucle : ]loop
secuencia_de_sentenciasend
loop
[ identificador_bucle ] ;
Ejemplo
editarVida:loop
-- El bucle dura indefinidamente.
Trabajar; Comer; Dormir;end
loop
Vida;
Este bucle sólo se puede abandonar si alguno de los procedimientos levanta una excepción.
El bucle simple a menudo se acompaña de una sentencia exit para abandonar el bucle cuando se cumple una condición.
loop
Alimentar_Caldera; Monitorizar_Sensor;exit
when
Temperatura_Ideal;end
loop
;
Sentencia de bucle iterativo (for)
editarDefinición
editarsentencia_bucle_iterativo ::= [ identificador_bucle : ]for
parámetros_forloop
secuencia_de_sentenciasend
loop
[ identificador_bucle ] ; parámetros_for ::= identificadorin
[reverse
] rango_discreto
Ejemplo
editarfor
Iin
1..Nloop
-- I se itera desde 1 hasta N.
V(I) := 0;end
loop
;
Ejemplo 2
editarSe desea desplegar los números del 10 al 1 de forma descendente
procedure
bloque_para_inversois
i :Integer
;begin
i := 0;for
iin reverse
1..10loop
Put
(i, 0);Put
(" ");end
loop
;end
bloque_para_inverso;
Ejemplo 3
editarSi bien Ada no acepta rangos en el for, estos se puede hacer mediante cálculos. Se desea mostrar los números pares comprendidos entre 1 y 10.
procedure
bloque_para_inversois
i :Integer
;begin
i := 0;for
i in 0..5loop
Put
(i*2, 0);Put
(" ");end
loop
;end
bloque_para_inverso;
Sentencia de bucle condicional (while)
editarDefinición
editarsentencia_bucle_iterativo ::= [ identificador_bucle : ]while
condiciónloop
secuencia_de_sentenciasend
loop
[ identificador_bucle ] ;
Ejemplo
editarI := 1;while
I > Nloop
-- Se hace el bucle mientras se cumpla la condición.
V(I) := 0; I := I + 1;end
loop
;
Otras sentencias de control (goto, exit, return, abort)
editarSentencia goto
editarAntes de nada, decir que la utilización de sentencias goto se desaconseja totalmente. Ada posee estructuras de control adecuadas para evitar su uso. Si se soporta su utilización es por si se quiere traducir de otro lenguaje a Ada automáticamente.
Se especifica una etiqueta entre los símbolos << y >>, por ejemplo, <<Salto>>.
Se realiza el salto a dicha etiqueta con la sentencia
que
transferiría el control a la siguiente sentencia después de la etiqueta.
goto
Salto;
No puede usarse para transferir control fuera de un subprograma.
Sentencia exit
editarTermina el bucle nombrado en la sentencia o, si no aparece, el bucle más próximo que la contiene. Su notación sintáctica es:
sentencia_exit ::=exit
[ nombre_bucle ] [when
condición ] ;
Sentencia return
editarTermina la ejecución del subprograma más próximo que la contiene, tanto en procedimientos como en funciones donde, además, se utiliza para devolver el resultado de dicha función. Su notación sintáctica es:
sentencia_return ::= return
[ expresión ] ;
Sentencia abort
editarSe utiliza solo para tareas. Implica la terminación incondicional de las tareas que se especifiquen. Su notación sintáctica es:
sentencia_abort ::= abort
nombre_tarea { , nombre_tarea } ;