Universidad Rey Juan Carlos Curso 2012/13 Ingeniería Técnica en Informática de Gestión Estructura de Datos y de la Información Examen Final Mayo 2013 Fecha: 18-5-2013 PRIMER PARCIAL - soluciones Ejercicio 1. (Puntuación total: 3,5 puntos) PROCEDURE PrefijoMax(lista: LE.TipoLista; n: Natural; prefijo: IN OUT LE.TipoLista) IS salida: LE.TipoLista; cursor: LE.TipoCursor := LE.PrimerCursor(lista); suma : Natural := 0; BEGIN LE.CrearVacia(salida); WHILE LE.EsCursorValido(lista,cursor) AND THEN LE.Elemento(lista,cursor) >= 0 AND THEN suma + LE.Elemento(lista,cursor) <= n LOOP suma := suma + LE.Elemento(lista,cursor); LE.InsertarFinal(salida, LE.Elemento(lista,cursor)); cursor := LE.Siguiente(lista, cursor); END LOOP; -- terminar de recorrer la lista para ver negativos WHILE LE.EsCursorValido(lista,cursor) AND THEN LE.Elemento(lista,cursor) >= 0 LOOP cursor := LE.Siguiente(lista, cursor); END LOOP; IF LE.EsCursorValido(lista,cursor) AND THEN LE.Elemento(lista,cursor) < 0 THEN LE.Destruir(salida); RAISE HayNegativos; ELSE LE.Copiar(prefijo, salida); LE.Destruir(salida); END IF; END PrefijoMax; Ejercicio 2. (Puntuación total: 2 puntos) OPERACIONES (* observadoras no selectoras *) TamHastaPrioridad: TipoColaP x TipoPrioridad -> Natural VARIABLES cola: TipoColaP; e: TipoElemento; p: TipoPrioridad; ECUACIONES TamHastaPrioridad (CrearColaVacía, p) = 0 TamHastaPrioridad (Insertar(e,cola), p) = SI MejorOIgual(Prioridad(e), p) -> 1 + TamHastaPrioridad(cola, p) | TamHastaPrioridad(cola, p) 1 Ejercicio 3. (Puntuación total: 4,5 puntos) PROCEDURE Mezcla (entrada: IN TipoCola; salida: IN OUT TipoCola) IS -- instanciación del paquete pilas PACKAGE MiPila IS NEW Pilas (TipoElemento); -- variables copia: TipoCola; -- para copiar la entrada pila_noprop: MiPila.TipoPila; -- para almacenar los elementos que no cumplen 'propiedad' cola_prop: TipoCola; -- para almacenar los elementos que cumplen 'propiedad' ele: TipoElemento; BEGIN IF EsColaVacia(entrada) THEN CrearColaVacia(salida); ELSE Copiar(copia, entrada); MiPila.CrearPilaVacia(pila_noprop); CrearColaVacia(cola_prop); WHILE NOT EsColaVacia(copia) LOOP ele := PrimeroCola(copia); IF Propiedad(ele) THEN Insertar(ele, cola_prop); ELSE MiPila.Apilar(ele, pila_noprop); END IF; Eliminar(copia); END LOOP; CrearColaVacia(salida); WHILE NOT EsColaVacia(cola_prop) AND THEN NOT MiPila.EsPilaVacia(pila_noprop) LOOP Insertar(Combina(PrimeroCola(cola_prop), MiPila.Cima(pila_noprop)), salida); Eliminar(cola_prop); MiPila.Desapilar(pila_noprop); END LOOP; -- una de las dos estructuras auxiliares puede no estar vacía Destruir(cola_prop); MiPila.Destruir(pila_noprop); END IF; EXCEPTION WHEN MiPila.PilaLLena => Raise ColaLLena; END Mezcla; 2