1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
--| 15/03/2012 --| 4. Implementa un módulo genérico con el TAD cola, pero haciendo uso de una implementación estática. --| 5. Crea un programa con un menú que permita hacer las operaciones del ejercicio anterior y vaya mostrando --| los resultados obtenidos. Haz que la cola quede instanciada para almacenar enteros. -- Librerias: with ada.text_io, ada.integer_text_io, cola_estatica; use ada.text_io, ada.integer_text_io; procedure ada8x04 is -- Se define el tipo de datos que se quiere guardar en cada Nodo de la Cola, en este caso un registro: type datos is record num:integer; end record; -- Se instancia y emplea el paquete cola_estatica: package colaE is new cola_estatica( 10, datos ); use colaE; c:cola; temp:datos; eleccion:integer; begin -- Primer menu: put_line("Menu:"); put_line(" 1. Inicializar Cola"); put_line(" 0. Salir"); get(eleccion); while eleccion not in 0..1 loop put("Opción no valida, seleccione de nuevo: "); get(eleccion); end loop; if eleccion = 1 then inicializar(c); put_line("Cola inicializada."); -- Segundo menu: new_line; new_line; put_line("Menu:"); put_line(" 1. Insertar"); put_line(" 2. Extraer"); put_line(" 3. Solo leer"); put_line(" 0. Salir"); while eleccion /= 0 loop get(eleccion); while eleccion not in 0..3 loop put("Opción no valida, seleccioné de nuevo: "); get(eleccion); end loop; case eleccion is -- Insertar: when 1 => if esLlena(c) then put_line("La Cola esta llena."); else put("Número a insertar: "); get(temp.num); insertar( c, temp ); end if; -- Extraer: when 2 => if esVacia(c) then put_line("La cola esta vacía."); else extraer( c, temp ); put("Numero extraído: "); put(temp.num, width=>0); new_line; end if; -- Leer: when 3 => if esVacia(c) then put_line("La cola esta vacía."); else temp := leer(c); put("Numero leido: "); put(temp.num, width=>0); new_line; end if; -- Salir: when 0 => null; when others => null; end case; if eleccion /= 0 then new_line; put("oK, qué desea hacer: "); end if; end loop; end if; end ada8x04; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
--| 13/03/2012 --| ESPECIFICACIÓN DE LA COLA ESTÁTICA --| PRECONDICIÓN: --| Se ha de recibir de la instanciacion de la librería, un parámetro de tipo natural y el tipo de datos a almacenar en cada Nodo de la Cola. --| Se ha de controlar que la pila no este vacía/llena con las funciones esVacia/esLlena antes de usar insertar/leer/extraer. generic -- Parámetros recibidos de la instanciacion de la librería: (private - limited private) max:natural; type datos is private; package cola_estatica is -- Se definen las cabeceras (como private - limited private) de los tipos de datos que emplearan las funciones, se terminan de definir en la zona private: type cola is limited private; -- Se definen las cabeceras de las funciones contenidas en el fichero de implementación: procedure inicializar( c:in out cola ); function esVacia( c:in cola ) return boolean; function esLlena( c:in cola ) return boolean; procedure insertar( c:in out cola; d:in datos ); function leer( c:in cola ) return datos; procedure extraer( c:in out cola; d:out datos ); -- Desde la zona privada, se detalla como son las variables declaradas previamente como privadas: private type vector is array(1..max) of datos; type cola is record elemento:vector; numNodos:integer; primero:integer; ultimo:integer; end record; end cola_estatica; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
--| 13/03/2012 --| IMPLEMENTACIÓN DE LA COLA ESTÁTICA -- Funciones del paquete: package body cola_estatica is --| INICIALIZA UNA COLA: --| Precondición: Se ha de recibir un parámetro de tipo Cola (registro con elemento:vector; numNodos,primero,ultimo:integer) --| Poscondición: Se inicializa a 0 el contador de Nodos de la Cola. procedure inicializar( c:in out cola ) is begin c.numNodos := 0; end inicializar; --| INDICA SI LA COLA ESTA VACÍA: --| Precondición: Se ha de recibir un parámetro de tipo Cola. --| Poscondición: Se devuelve un true si la cola esta vacía o un false en caso contrario. function esVacia( c:in cola ) return boolean is begin if c.numNodos > 0 then return false; else return true; end if; end esVacia; --| INDICA SI LA COLA ESTA LLENA: --| Precondición: Se ha de recibir un parámetro de tipo Cola. --| Poscondición: Se devuelve un true si la cola esta llena o un false en caso contrario. function esLlena( c:in cola ) return boolean is begin if c.numNodos < max then return false; else return true; end if; end esLlena; --| INSERTA UN NUEVO NODO AL FINAL DE LA COLA: --| Precondición: Se ha de recibir un parámetro de tipo Cola y el tipo de dato a guardar en los Nodos de la Cola. Se ha de comprobar que haya espacio con la función esLlena(). --| Poscondición: Se insertan los datos en el último Nodo de la Cola. procedure insertar( c:in out cola; d:in datos ) is begin if c.numNodos = 0 then c.numNodos := 1; c.primero := 1; c.ultimo := 1; c.elemento(c.primero) := d; else c.numNodos := c.numNodos + 1; if c.ultimo = 1 then c.ultimo := max; else c.ultimo := c.ultimo - 1; end if; c.elemento(c.ultimo) := d; end if; end insertar; --| LEE LOS DATOS DEL PRIMER NODO: --| Precondición: Se ha de recibir un parámetro de tipo Cola. Se ha de comprobar que no este vacía con la funcion esVacia() --| Poscondición: Se devuelven los datos del primer Nodo de la Cola. function leer( c:in cola ) return datos is begin return c.elemento(c.primero); end leer; --| EXTRAE LOS DATOS DEL PRIMER NODO: --| Precondición: Se ha de recibir un parámetro de tipo Cola y el tipo de dato a guardar en los Nodos de la Cola. Se ha de comprobar que no este vacía con la función esVacia() --| Poscondición: Devuelve por referencia los datos del primer Nodo y a continuacion lo elimina. procedure extraer( c:in out cola; d:out datos ) is begin d := c.elemento(c.primero); if c.numNodos > 1 then if c.primero = 1 then c.primero := max; else c.primero := c.primero - 1; end if; end if; c.numNodos := c.numNodos - 1; end extraer; end cola_estatica; |