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;
I: Index;
A : My_Array;
begin
for J in Index loop
A(J) := Integer'Val(J) + 10;
end loop;
I := 1;
while I < 10 loop
Put_Line (Index'Image(I) & " -> " & Integer'Image(A(I)));
I:=I+1;
end loop;
Put_Line ("");
loop
I:=I-1;
Put (Index'Image(I) & " -> " & Integer'Image(A(I)));
if I > 4 then
Put_Line ("");
else
Put_Line ("**");
exit when I = 1;
end if;
end loop;
for J in Index loop
Put (Integer'Image(A(J)));
end loop;
Put_Line ("");
for J in reverse Index loop
Put (Integer'Image(A(J)));
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 conPutoPut_line. El attributValnos 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 tipoIntegerse produce un error de compilación. El attributeValdel tipoIntegernos 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
Put (Integer'Imagen(I));
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
nullpara 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,loopywhile - Ada ofrece la palabra clave
exitpara controlar el flujo de los bucles - Ada no ofrece
continuepero puede ser simulado fácilmente congoto
■
