Bucles en Ada
SOLUCIONARIO
Bucles en Ada
2025-07-27
Por
Occam's Razor

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 con Put o Put_line. El attribut Val 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 tipo Integer se produce un error de compilación. El attribute Val del tipo Integer 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
  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 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 y while
  • Ada ofrece la palabra clave exit para controlar el flujo de los bucles
  • Ada no ofrece continue pero puede ser simulado fácilmente con goto

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)