Ejercicio 1 Se considera el siguiente tipo mlist (lista de listas de cardinales): TYPE (* lista de listas de cardinales *) mlist = POINTER TO mcelda; mcelda = RECORD info: list; sig: mlist; END; (* lista de cardinales *) list = POINTER TO celda; celda = RECORD info: CARDINAL; sig: list; END; a) Escribir un subprograma que reciba una mlist y un cardinal k y retorna 2 cardinales m y n que indican las coordenadas de la primera aparición del cardinal dentro de la lista. Esto significa que el cardinal k aparece en la msima lista en la celda n-sima. Si el cardinal no aparece en la lista, retorna m y n en el valor 0. b) Escribir un subprograma que reciba una mlist y retorne una list con los mismos elementos en el mismo orden. Ejemplo: entrada: ( (1,2,3) , (5,6), () , (8) ) ( 1, 2 , 3, 4, 5, 6, 8 ) salida: c) Escribir un subprograma que reciba una list y un número n y retorne una mlist cuyos elementos sean las listas obtenidas agrupando de a n los elementos de la lista de entrada. La última de las listas puede tener menos de n elementos en caso de que la cantidad de elementos de la lista de entrada no sea un múltiplo de n. Ejemplo: (1,2,3,4,5,6,7) 3 entrada: salida: ( (1,2,3), (4,5,6),(7) ) Observaciones: Cuando se pide subprograma, se hace referencia a función o procedimiento, donde deberá elegir lo más apropiado. Debe implementar todas las operaciones auxiliares que utilice. Puede hacer los algoritmos recursivos o iterativos. Ejercicio 2 Se considera el TAD IndexFile que representa un conjunto de registros. Cada registro tiene una clave asociada. El conjunto puede recorrerse secuencialmente ordenado según la clave de cada registro y también es posible acceder directamente a un elemento dada su clave. El TAD Registro se define como sigue: IMPLEMENTATION MODULE Registro; TYPE Registro; (* tipo opaco *) Clave; (* tipo opaco *) PROCEDURE IgualClave(k1,k2 : Clave) : BOOLEAN; (* retorna true si k1 = k2 *) PROCEDURE MenorClave(k1,k2: Clave) : BOOLEAN; (* retorna true si k1 < k2 *) PROCEDURE LaClave(reg: Registro) : Clave; (* retorna la clave asociada al registro *) (* otras operaciones *) . . . El TAD IndexFile representa un conjunto de registros. En todo momento existe un registro que es el llamado registro corriente; sobre él se realizan muchas de las operaciones. En un momento dado, el registro corriente puede ser cualquiera de los registros del archivo. Existe un registro especial llamado EOF que siempre representa el último registro del conjunto (el de clave máxima) Las operaciones del tad IndexFile son: Crear Retorna el conjunto de registros vacío. El corriente es el EOF. Insertar Agrega un registro al conjunto y pone el corriente en ese registro. EsEOF Retorna true si está en EOF. Buscar Recibe una clave, y pone como registro corriente aquél que tiene la clave igual a la dada. Si no hay ningún registro con esa clave, queda como registro corriente el inmediato mayor; si no hay ninguno mayor queda el EOF. Borrar Borra del conjunto el registro corriente. Si está en EOF no tiene efecto. Siguiente Corre el registro corriente al más chico de los registros con clave mayor que el corriente. Si no existe tal registro, queda en EOF. Previo Corre el registro corriente al más grande de los registros con clave menor. Si no existe ninguno menor, la operación no tiene efecto. Leer Retorna el registro corriente. Tiene como precondición que el corriente no esté en EOF. El registro corriente se corre al ``siguiente''. a) Escribir el módulo de definición del TAD IndexFile. b) Escribir un módulo de implementación para el módulo definido en la parte a). File translated from TEX by TTH, version 2.01. On 21 Aug 2001, 17:11.