Está en la página 1de 9

Elementos bsicos del lenguaje Ada

Ejercicio 1
Objetivo: Practicar con literales de array Descripcin: Suponer que se han realizado las siguientes declaraciones:
type Dia_Semana is (Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo); type Num_Semana is range 1..53; type Festivos is array(Dia_Semana,Num_Semana) of Boolean; Festivos_2010 : Festivos;

Escribir la instruccin necesaria para dar el siguiente valor inicial al array Festivos_2010, usando un literal de array: Todos los sbados y domingos a true; el martes de la semana 14 y el jueves de la 28 a true: todo lo dems a false.

Ejercicio 2
Objetivo: Practicar con el recorrido de arrays. Descripcin: Dado el siguiente array que contiene los datos personales de unas personas, hacer un fragmento de programa que muestre por la pantalla los DNIs y los nombres de todas ellas. Suponer que del nombre se usan slo los caracteres del 1 a N_Nombre
type Persona is record Nombre : String(1..30); N_Nombre : Integer range 0..30; DNI : String(1..9); end record

Lista_Personas : array (1..50) of Persona;

Ejercicio 3
Objetivo: Practicar con las reglas de visibilidad y el paso de parmetros Descripcin: El siguiente procedimiento usa variables globales para comunicarse con sus subprogramas internos. Reescribirlo para que no use variables globales. Para ello, se deben declarar las variables en un lugar inaccesible a los subprogramas internos, y pasarles a stos los datos por parmetros. Pensar cuidadosamente si los parmetros deben ser de entrada, salida, o entrada/salida.

with Ada.Text_IO, Ada.Integer_Text_IO; use Ada.Text_IO, Ada.Integer_Text_IO; procedure Muestra is A,B : Integer; X1, S : Integer; procedure Dist is begin X1:=A*A+B*B; end Dist; procedure Suma is begin S:=A+B+X1; end Suma; begin Put("A:"); Get(A); Skip_Line; Put("B:"); Get(B); Skip_Line; Dist; Suma; Put_Line("X1="&Integer'Image(X1)); Put_Line("S ="&Integer'Image(S)); end Muestra;

Ejercicio 4
Objetivo: Practicar con bsquedas en arrays Descripcin: Escribir la funcin cuya cabecera se muestra abajo que busque en el array temp si hay alguna casilla errnea que no cumpla min<=media<=max. La funcin debe retornar true si se encuentra la casilla errnea sin buscar ms. En caso de que no haya ninguna casilla errnea retornar false. Indicar tambin un ejemplo de cmo llamar a esa funcin almacenando el valor retornado en una variable booleana.
type Mes is (Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre, Octubre, Noviembre, Diciembre); type Temperatura is record Min, Media, Max : Float; end record; type Lista_Temperaturas is array(Mes) of Temperatura;

function Hay_Errores(Temp : in Lista_Temperaturas) return Boolean is ...

Estructuras de datos dinmicas


Ejercicio 1
Objetivo: Practicar con la creacin y uso de variables dinmicas. Descripcin: Con los siguientes tipos de datos:
type Info_Vehiculo is record Propietario : String (1..20); Matricula : String (7); Fecha_Fabricacion : Natural := 1970; end record; type P_Info_Vehiculo is access Info_Vehiculo; type Lista_Vehiculos is array (1..50) of P_Info_Vehiculo; type P_Lista_Vehiculos is access Lista_Vehiculos;

Se crean las siguientes variables:


Mi_Lista : P_Lista_Vehiculos; V1 : Info_Vehiculo; -- Asignar aqu un valor inicial V2 : Info_Vehiculo; -- Asignar aqu un valor inicial

Realizar un segmento de programa que cree una variable dinmica de tipo Lista_Vehiculos apuntada por Mi_Lista y realice las siguientes asignaciones:

Al elemento 5 del array apuntado por Mi_Lista el valor del registro V1 Al campo Matricula del elemento 12 del array apuntado por Mi_Lista el correspondiente valor del registro V2 Al campo Fecha_Fabricacion del elemento 43 del array apuntado por Mi_Lista el valor 2010

CUIDADO: Se debern crear todas las variables dinmicas que se necesiten para soportar los datos que se piden.

Ejercicio 2
Objetivo: Paso de parmetros de tipo access a los subprogramas. Descripcin: Tenemos el tipo vector y un tipo puntero al mismo definido en los apuntes:
type Vector is array(1..3) of Float; type P_Vector is access Vector;

Se pide crear un procedimiento que permita intercambiar el valor de dos vectores, y que tenga el siguiente prototipo:
procedure Intercambia (V1, V2 : in out P_Vector);

Realizar un programa de prueba que intercambie los valores de dos vectores definidos como variables estticas, y de dos vectores definidos como variables dinmicas. Pintar los vectores que se intercambian antes y despus de llamar al procedimiento.

Modularidad y programacin orientada a objetos


Ejercicio 1
Objetivo: Practicar con paquetes y tipos privados. Descripcin: Modificar la especificacin del paquete Conjuntos_Privados de los apuntes para representar el conjunto como un array de datos del tipo Elemento. Utilizar un array de un tamao fijo y un contador para indicar el nmero actual de elementos en el conjunto.
with Elementos; -- define el tipo Elemento, que es discreto use Elementos; package Conjuntos_Privados is type Conjunto is private; function Vacio return Conjunto; procedure Inserta (E : Elemento; C : in out Conjunto); procedure Extrae (E : Elemento; C : in out Conjunto); -- pertenencia function "<" (E: Elemento; C: Conjunto) return Boolean; private type Conjunto is array ...; end Conjuntos_Privados;

Realizar tambin la implementacin de todas las operaciones (en el cuerpo del paquete) excepto la extraccin. Comprobar que compila (poner la implementacin de Extrae vaca, con la instruccin null, o comentar la definicin en la especificacin). Nota: extraer el cdigo de este documento o del PDF de los apuntes (copiar/pegar).

Ejercicio 2
Objetivo: Practicar el uso de paquetes. Descripcin: Dadas las dos implementaciones de Conjuntos_Privados,la del Ejercicio 1 y la original, hacer un programa de prueba que realice lo siguiente:

Utilice como Elemento los nmeros del 1 al 100 Defina un conjunto en el que se insertan los nmeros 3, 17, 46 y compruebe si pertenecen los nmeros 65, 17, 23 y 46 mostrando los resultados por pantalla.

Comprobar que el programa funciona de igual modo con cualquiera de las dos implementaciones.

Ejercicio 3
Objetivo: Practicar con el desarrollo de paquetes hijo. Descripcin: Partiendo del paquete desarrollado en el Ejercicio 1 y sin modificarlo, aadir una operacin que devuelva el nmero de elementos que tiene un conjunto determinado:
function Num_Elementos (C : Conjunto) return Natural;

Definir esta operacin en un paquete hijo de Conjuntos_Privados. Hacer un pequeo programa de prueba que inserte tres elementos y pinte el nmero de elementos del conjunto.

Tratamiento de errores
Ejercicio 1
Objetivo: Escribir un manejador de excepcin Descripcin: Tenemos disponible el siguiente paquete
package Brazo_Robot is type Eje is range 1..6; subtype Angulo is Float range -360.0..360.0; -- en grados type Posicion_Ejes is array(Eje) of Angulo; function Pos_Actual return Posicion_Ejes; -- eleva Error_Sensor si se detecta un error con el sensor de posicin procedure Mueve_A (Pos_Nueva : Posicion_Ejes); -- Eleva Motores_Inhibidos si los motores no estn operativos Error_Sensor : exception; Motores_Inhibidos : exception; end Brazo_Robot;

Escribir un procedimiento llamado Ir_A que:


Llame Si Si Si

a Mueve_A para dirigirse a la posicin que se le pasa en un parmetro a Ir_A.

se eleva Motores_Inhibidos poner un mensaje de error en la pantalla y terminar

no se eleva Motores_Inhibidos llamar a Pos_Actual en un bucle hasta que la posicin retornada sea la deseada (la indicada en el parmetro) se eleva Error_Sensor poner un mensaje de error en pantalla y terminar

Ejercicio 2
Objetivo: Creacin de bloques para tratamiento de excepciones Descripcin: Con el brazo robot del ejercicio 1 se quiere realizar un desplazamiento en el eje 2 hasta un punto concreto en varios pasos y luego retornar rpidamente a la posicin inicial, anotando las distintas posiciones reales alcanzadas. En la siguiente secuencia de instrucciones:
-- Ir a 105 grados del eje 2 poco a poco Mueve_A ((10.0,100.0,30.0,0.0,180.0,-180.0)); Pos1:=Pos_Actual; Mueve_A ((10.0,101.0,30.0,0.0,180.0,-180.0)); Pos2:=Pos_Actual; Mueve_A ((10.0,102.0,30.0,0.0,180.0,-180.0)); Pos3:=Pos_Actual; Mueve_A ((10.0,103.0,30.0,0.0,180.0,-180.0)); Pos4:=Pos_Actual; Mueve_A ((10.0,104.0,30.0,0.0,180.0,-180.0)); Pos5:=Pos_Actual; Mueve_A ((10.0,105.0,30.0,0.0,180.0,-180.0)); Pos6:=Pos_Actual; -- Regresar a la posicin inicial rpidamente Mueve_A ((10.0,100.0,30.0,0.0,180.0,-180.0)); Pos_Final:=Pos_Actual;

crear los bloques y manejadores de excepcin necesarios para que:


Si Si

se lanza Error_Sensor se ejecuten las dos ltimas instrucciones. Si se vuelve a lanzar Error_Sensor aqu, ignorar el error se lanza Motores_Inhibidos poner un mensaje de error y abandonar la secuencia de instrucciones lanzando de nuevo la misma excepcin

Abstraccin de tipos mediante unidades genricas


Ejercicio 1
Objetivo: Escribir un paquete genrico e instanciarlo Descripcin: Escribir un paquete llamado Almacen que sirva para almacenar un dato que se puede consumir. Despus de consumido el dato deja de estar disponible. Dispondr de las siguientes variables definidas en el cuerpo:
Var:

una variable de un tipo indeterminado que se pasa como parmetro genrico un booleano que indique si existe un valor almacenado disponible o no (valor

Disponible:

inicial False) Las operaciones de este paquete sern:


Hay_Dato: Lee:

funcin que devuelve el dato Disponible

funcin que retorna el dato si existe. Si el dato Disponible vale true, pone Disponible a False y retorna Var; si no, lanza una excepcin
Escribe:

procedimiento que da valor a Var y pone Disponible a true;

Escribir tambin un programa de prueba que instancie el paquete para el tipo Float y pruebe las operaciones.