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 |
--| 15/03/2012 --| Implementa un módulo genérico con el TAD cola, pero haciendo uso de una implementación dinámica. --| Utiliza el ejercicio anterior para probar el módulo sin modificar ni una línea. -- Librerias: with ada.text_io, ada.integer_text_io, cola_dinamica; use ada.text_io, ada.integer_text_io; procedure ada8x06 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 colaD is new cola_dinamica(datos); use colaD; c:ptCola; 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, seleccione de nuevo: "); get(eleccion); end loop; case eleccion is -- Insertar: when 1 => put("Numero a insertar: "); get(temp.num); insertar( c, temp ); -- Extraer: when 2 => if esVacia(c) then put_line("La cola esta vacía."); else extraer( c, temp ); put("Numero extraido: "); 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 => borrar(c); when others => null; end case; if eleccion /= 0 then new_line; put("oK, qué desea hacer: "); end if; end loop; end if; end ada8x06; |
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 |
--| 15/03/2012 --| ESPECIFICACIÓN DE LA COLA DINAMICA --| 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) type datos is private; package cola_dinamica 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 ptCola is limited private; -- Se definen las cabeceras de las funciones contenidas en el fichero de implementación: procedure inicializar( c:in out ptCola ); function esVacia( c:in ptCola ) return boolean; procedure insertar( c:in out ptCola; d:in datos ); function leer( c:in ptCola ) return datos; procedure extraer( c:in out ptCola; d:out datos ); procedure borrar( c:in out ptCola ); -- Desde la zona privada, se detalla como son las variables declaradas previamente como privadas: private type nodo; type ptNodo is access nodo; type cola; type ptCola is access cola; type nodo is record elemento :datos; siguiente:ptNodo; end record; type cola is record numNodos:integer; primero:ptNodo; ultimo:ptNodo; end record; end cola_dinamica; |
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 |
--| 15/03/2012 --| IMPLEMENTACIÓN DE LA COLA DINÁMICA -- El siguiente paquete permite borrar la memoria dinámica. with unchecked_deallocation; -- Funciones del paquete: package body cola_dinamica is --| INICIALIZA UNA COLA: --| Precondición: Se ha de recibir un parámetro de tipo ptCola (puntero a colas) --| Poscondición: Se hace que el puntero apunte a una nueva Cola y se inicializa su contenido a 0/null. procedure inicializar( c:in out ptCola ) is begin c := new cola; c.numNodos := 0; c.primero := null; c.ultimo := null; end inicializar; --| INDICA SI LA COLA ESTA VACÍA: --| Precondición: Se ha de recibir un parámetro de tipo ptCola. --| Poscondición: Se devuelve un true si la cola esta vacía o un false en caso contrario. function esVacia( c:in ptCola ) return boolean is begin if c.numNodos > 0 then return false; else return true; end if; end esVacia; --| INSERTA UN NUEVO NODO AL FINAL DE LA COLA: --| Precondición: Se ha de recibir un parámetro de tipo ptCola, y el tipo de dato a guardar en los Nodos de la Cola. --| Poscondición: Se crea un nuevo Nodo y se agrega al final de la Cola con los nuevos datos. procedure insertar( c:in out ptCola; d:in datos ) is temp:ptNodo := new nodo; begin temp.elemento := d; temp.siguiente := null; if c.numNodos = 0 then c.primero := temp; else c.ultimo.siguiente := temp; end if; c.ultimo := temp; c.numNodos := c.numNodos + 1; end insertar; --| LEE LOS DATOS DEL PRIMER NODO: --| Precondición: Se ha de recibir un parámetro de tipo ptCola. 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 ptCola ) return datos is begin return c.primero.elemento; end leer; --| EXTRAE LOS DATOS DEL PRIMER NODO: --| Precondición: Se ha de recibir un parámetro de tipo ptCola, 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 libera. procedure extraer( c:in out ptCola; d:out datos ) is procedure borrar is new unchecked_deallocation(nodo,ptNodo); temp:ptNodo; begin d := c.primero.elemento; temp := c.primero; c.primero := c.primero.siguiente; c.numNodos := c.numNodos - 1; borrar(temp); end extraer; --| BORRA TODOS LOS NODOS DE LA COLA: --| Precondición: Se ha de recibir un parámetro de tipo ptCola. --| Poscondición: Borra recursivamente todos los Nodos y por ultimo la Cola. procedure borrar( c:in out ptCola ) is procedure borrar is new unchecked_deallocation(nodo,ptNodo); procedure borrar is new unchecked_deallocation(cola,ptCola); temp:ptNodo; begin if c.primero /= null then temp := c.primero; c.primero := c.primero.siguiente; borrar(c); -- Envía el segundo Nodo para su borrado. borrar(temp); -- Borra el primer Nodo. else borrar(c); -- Borra la Cola. end if; end borrar; end cola_dinamica; |