with Ada.Text_IO; use Ada.Text_IO;
procedure Loop_test is
Type Index is range 1..10;
type My_Array is array (Index) of Integer;
: Index;
I: My_Array;
A begin
for J in Index loop
(J) := Integer'Val(J) + 10;
Aend loop;
:= 1;
I while I < 10 loop
(Index'Image(I) & " -> " & Integer'Image(A(I)));
Put_Line :=I+1;
Iend loop;
("");
Put_Line
loop
:=I-1;
I(Index'Image(I) & " -> " & Integer'Image(A(I)));
Put if I > 4 then
("");
Put_Line else
("**");
Put_Line exit when I = 1;
end if;
end loop;
for J in Index loop
(Integer'Image(A(J)));
Put end loop;
("");
Put_Line
for J in reverse Index loop
(Integer'Image(A(J)));
Put end loop;
("");
Put_Line
end Loop_test;
Ada nos ofrece los típicos bucles for
y
while
, además de una construcción mas genérica utilizando
la palabra clave loop
, a la que a veces se refieren como
Bare Loops
o bucles desnudos.
Los bucles for
permiten iterar a través de un rango
discreto el cual se puede invertir usando la palabra clave
reverse
antes del rango. La variable índice en el bucle es
local y de hecho una constante dentro del bucle para cada iteración,
donde no puede ser modificada. Digamos que la variable índice es
solamente modificada por el bucle y para el cuerpo del bucle es una
constante.
Los bucles while
funcionan exactamente igual que en el
resto de los programas. Por tratarse de Ada donde el tipado es muy duro,
aqui la condición siempre debe ser un valor booleano.
Finalmente, los bucles loop
, simplemente definen bloques
de código que se repetirán indefinidamente. Podemos parar cualquier
bucle (también for
, loop
y while
)
utilizando el comando exit
, al cual podemos associar una
codición booleana o usarlo sin más.
SOY NOVATO
‘Image’ y ‘Val’ son lo que se conoce como atributos y accedemos a ellos utilizando el nombre de un tipo seguido del apóstrofe. El attributo
Image
, nos permite convertir un determinado tipo en una cadena de caracteres que podamos imprimir conPut
oPut_line
. El attributVal
nos permite acceder al valor de un tipo númerico.En el ejemplo de arriba, hemos definido un subtipo de un valor entero
Index
, el cual vamos a utilizar como rango en los bucles para poder detectar errores de overflow y similares. Cuando en el primer bucle queremos usar el contador del bucle para inicializar el array que espera elementos del tipoInteger
se produce un error de compilación. El attributeVal
del tipoInteger
nos permite obtener el valor entero de la variable indicada.
Ada no ofrece una forma directa de reiniciar la iteración del bucle
similar a la palabra clave continue
que encontramos en la
mayoría de los lenguajes. Si necesitamos hacer eso debemos o bien,
modificar la lógica del programa para poder simular ese comportamiento,
por ejemplo añadir todo el código a repetir en un if
como
hicimos en el tercer bucle del código de ejemplo o utilizar
goto
. Este es un ejemplo de como usarlo.
for I in 1..10 loop
(Integer'Imagen(I));
Put if I = 5 then
("");
Put_Line goto Continue;
endif(",");
Put <<Continue>>
end loop;
Este fragmento de código imprime los números del 1 al 10 separados
por comas, excepto por el 5, el cual es seguido por un retorno de carro.
Podéis ver el uso de la etiqueta al final del bucle y el
goto
en el lugar donde queremos continuar el
bucle.
¿SABÍAS QUÉ?
Ada es tan formal que permite definir bucles vacíos, los cuales se suelen utilizar en sistemas embebidos en los que varias tareas se ejecutan concurrentemente y es necesario tener una tarea activa aunque no haga nada… Cosas de los sistemas embebidos, ¿que os voy a contar?. Pues bien, Ada no os permite generar un bucle vacío sin más y debemos utilizar la instrucción
null
para indicar que explícitamente queremos generar un bucle vacío.task body MiTarea is begin loop null; -- La tarea no hace nada end loop; end MiTarea
Si hablamos de bucles infinitos, una vez más ADA sobresale puesto que
los bucles loop
específicamente son bucles infinitos… habrá
Rust copiado esto?… Aquí tenéis algunas formas de implementar bucles
infinitos:
loop
-- Repite para siempre
end loop;
while True loop
-- Repite para siempre
end loop;
<<Infinito>>
-- Repite para siempre
goto Infinito;
Resumen
- Ada ofrece bucles
for
,loop
ywhile
- Ada ofrece la palabra clave
exit
para controlar el flujo de los bucles - Ada no ofrece
continue
pero puede ser simulado fácilmente congoto
■