Programación en Ada/Sentencias y estructuras de control
Clasificación de sentencias
- 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
Ada 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
bloque ::= [ identificador : ] [declareparte_declarativa ]beginsentencias [exceptionmanejador_de_excepción { manejador_de_excepción } ]end[ identificador ] ;
Ejemplo
-- Supuestas X e Y declaradas con anterioridad de tipo Float:declareTemp: 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)

Definición
sentencia_selección ::=ifcondiciónthensecuencia_de_sentencias [ {elsifcondiciónthensecuencia_de_sentencias } ] [elsesecuencia_de_sentencias ]endif;
withAda.Text_Io,Ada.Integer_Text_Io;useAda.Text_Io,Ada.Integer_Text_Io;
procedurecomptar_LAiscp,c: character; n: integer; --declaramos las variablesbeginPut("Escribe una frase"); --pedimos y recogemos texto Put(c); n := 0; --inicializamos n a cero cp := ' '; get(c); --si cp es espacio seguir leyendowhilec /= '.'loop--mientras c sea diferente del PUNTO, entrar en bucleifcp = 'L'andc = 'A'thenn := n+1;endif; -- 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 caracterendloop; --FINALIZAMOS BUCLE Put("El numero de palabras de la frase es"); --enseñamos en pantalla la variable n Put(n);endcomptar_LA;
Ejemplo
ifHoy = DOMthen-- Si hoy es domingo.Mañana := LUN;elsifHoy /= SABthen-- Si no es domingo ni sábado.Laborable := True;else-- Cualquier otro caso.Mañana := TDía'Succ(Hoy);endif;
Sentencia de selección por casos (case)

Definición
sentencia_selección_por_casos ::=caseexpresiónisalternativa_caso { alternativa_caso }endcase; alternativa_caso ::=whenelección { | elección } => secuencia_de_sentencias elección ::= expresión_simple | rango_discreto |others
Ejemplo
caseHoyiswhenMIE..VIE => Entrenar_duro;-- Rango.whenMAR | SAB => Entrenar_poco;-- Varias elecciones.whenDOM => Competir;-- Una elección.whenothers=> Descansar;-- Debe ser única y la última alternativa.endcase;
Bucles
Sentencia de bucle simple (loop)
Definición
sentencia_bucle_simple ::= [ identificador_bucle : ]loopsecuencia_de_sentenciasendloop[ identificador_bucle ] ;
Ejemplo
Vida:loop-- El bucle dura indefinidamente.Trabajar; Comer; Dormir;endloopVida;
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.
loopAlimentar_Caldera; Monitorizar_Sensor;exitwhenTemperatura_Ideal;endloop;
Sentencia de bucle iterativo (for)
Definición
sentencia_bucle_iterativo ::= [ identificador_bucle : ]forparámetros_forloopsecuencia_de_sentenciasendloop[ identificador_bucle ] ; parámetros_for ::= identificadorin[reverse] rango_discreto
Ejemplo
forIin1..Nloop-- I se itera desde 1 hasta N.V(I) := 0;endloop;
Ejemplo 2
Se desea desplegar los números del 10 al 1 de forma descendente
procedurebloque_para_inversoisi :Integer;begini := 0;foriin reverse1..10loopPut(i, 0);Put(" ");endloop;endbloque_para_inverso;
Ejemplo 3
Si 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.
procedurebloque_para_inversoisi :Integer;begini := 0;fori in 0..5loopPut(i*2, 0);Put(" ");endloop;endbloque_para_inverso;
Sentencia de bucle condicional (while)
Definición
sentencia_bucle_iterativo ::= [ identificador_bucle : ]whilecondiciónloopsecuencia_de_sentenciasendloop[ identificador_bucle ] ;
Ejemplo
I := 1;whileI > Nloop-- Se hace el bucle mientras se cumpla la condición.V(I) := 0; I := I + 1;endloop;
Otras sentencias de control (goto, exit, return, abort)
Sentencia goto
Antes 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
Termina 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 ] [whencondición ] ;
Sentencia return
Termina 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
Se 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 } ;