Elementos de Programación 1º. Ingeniería Técnica de Telecomunicación Convocatoria extraordinaria Dpto. de Lenguajes y Ciencias de la Computación Universidad de Málaga 17-SEPTIEMBRE-2003 (1ª. parte) Apellidos: Nombre: Especialidad (SE/SI/ST): Tiempo: 30 minutos Puntuación máxima: 3.0 Respuesta correcta: +0.2 Respuesta nula: 0.0 Respuesta incorrecta: -0.1 Grupo (A/B) (o profesor): Marca UNA SOLA RESPUESTA o ninguna para cada pregunta ¡Las preguntas sin contestar o con más de una contest ación se considerarán NULAS! Si te equivocas al marcar, tacha la respuesta errónea o pon un “NO” al lado para DIFERENCIARLA CLARAMENTE de las respuestas que consideres válidas. ¡No contestar con lápiz! NOTA DE CORTE (para corregir la 2ª. parte) 1.5 PUNTOS Pregunta 1 Dada la siguiente definición del TAD ListaPosicional y teniendo en cuenta los valores de la ListaPosicional lista mostrados en la figura, decir cuál es el contenido de la variable resultado después de ejecutar el código lista.Insertar(4,’T’); resultado = lista.Consultar(5,ok): q q q resultado contiene el valor ‘F’. resultado contiene un espacio en blanco porque no hay ningún valor en la posición 5 de la lista posicional. resultado no podemos saber qué contiene, pero la variable booleana ok contiene el valor FALSO porque no hay ningún valor en la posición 5 de la lista posicional. INTERFAZ CLASE MÉTODOS ... Insertar(E N TipoElemento ... FIN H ListaPosicional posición, E TipoElemento dato) Consultar(E N posición, S B ok) C T F lista 1 2 3 4 5 6 ... Pregunta 2 Dado el árbol binario mostrado, su recorrido en PreOrden generará: q q q DGHEBFIJFCA DBGEHAFCIFJ ABDEGHCFFIJ A B D C E G F H F I J Pregunta 3 Di cuál de las siguientes sentencias es correcta: q q q Todos los métodos necesarios para la implementación de un TAD deben aparecer en su interfaz. En la interfaz de un TAD deben aparecer sólo aquellos métodos que serán necesarios por un algoritmo externo para la utilización del TAD. Un algoritmo externo que utilice un TAD se verá afectado si se cambia sólo la implementación del TAD. Pregunta 4 Sea una máquina que almacena números enteros en la memoria principal en el rango 0..232 -1. En la citada máquina el dato numérico 75122... q q q ... ocupa más espacio en un fichero de texto que en uno binario. ... ocupa más espacio en un fichero binario que en uno de texto. ... ocupa el mismo espacio en un fichero de texto que en uno binario. Pregunta 5 Señala la opción correcta referente a ficheros. q q q Una vez abierto un fichero, todo su contenido está en memoria principal. La escritura en un fichero binario es más rápida que en un fichero de texto. La búsqueda binaria siempre se puede utilizar para buscar un dato en un fichero, independientemente de su contenido. Pregunta 6 Dada la situación adjunta (sin más referencias), y suponiendo que la cabeza es el nodo con el contenido 2, ¿cuál de las siguientes afirmaciones es VERDADERA? q q q Si se ejecuta lista = NULO, todavía se lista puede acceder a la cabeza. 4 4 7 Si se ejecuta LIBERAR(lista), todavía se 2 puede acceder a la cabeza. Si se pasa lista como parámetro por valor a otro subprograma y en éste se libera su memoria, se pierde el contenido del nodo cabeza. Pregunta 7 Señala la opción correcta referente a ficheros. q q q Los ficheros no se pueden ordenar porque están en memoria secundaria. Los ficheros binarios son portables. Los ficheros binarios se pueden acceder secuencialmente. Pregunta 8 Dada la interfaz de la clase CPolinomio y el fragmento de código adjunto, señala cuál de las siguientes afirmaciones es correcta: INTERFAZ CLASE CPolinomio ALGORITMO UsaPolinomio TIPOS VAR REGISTRO TpTermino CPolinomio p, q R coeficiente INICIO N grado p = Crear (3.0) FINREGISTRO ....... METODOS Crear() q La sentencia es correcta. Crear(E CPolinomio p) q La sentencia es incorrecta porque no se ha definido Crear(E TpTermino t) ningún constructor con un parámetro de tipo real. Destruir() q La sentencia es incorrecta porque no se puede invocar de NuevoMonomio(E TpTermino t) forma explícita al constructor de una clase. R Evaluar(E R x) Imprimir() FIN CPolinomio Pregunta 9 Cuál de las siguientes afirmaciones sobre la asignación entre objetos es correcta: q q q a = b es siempre correcto independientemente de la clase a la que pertenezcan los objetos a y b. Si a y b son objetos de la misma clase la sentencia a = b es siempre válida. Antes de poder hacer a = b hay que llamar a la sentencia a.Destruir(). Pregunta 10 Si se define un objeto pto de la clase CPunto anteriormente definida como un atributo dentro de la clase CPoligono, ¿cuál de las siguientes afirmaciones es correcta? IMPLEMENTACION CLASE CPoligono ATRIBUTOS CPunto pivote .......... q q q Los atributos del objeto pivote son accesibles desde un objeto de la clase CPoligono. Los atributos de un objeto de la clase CPoligono son accesibles desde un objeto de la clase CPunto. Si se define un objeto poli de la clase CPoligono, se llama al constructor de pivote cuando se llame al constructor del objeto poli. Pregunta 11 Dado el fragmento de código y la interfaz de la clase CPunto definidas, ¿cuál de las siguientes afirmaciones es correcta? INTERFAZ CLASE CPunto ALGORITMO CreaPunto METODOS VAR Crear() CPunto *p Crear(E R X; E R y) INICIO Destruir() ASIGNAR (p(5.0, 3.0)) R obtenerAbscisa() Escribir (“Las coordenadas del punto son: ”) R obtenerOrdenada() Escribir (p->obtenerAbscisa()) R mover(E R offset) Escribir (p->obtenerOrdenada()) FIN CPunto ........... q q q El algoritmo es incorrecto porque para acceder a los métodos obtenerAbscisa y obtenerOrdenada es necesario sustituir el operador fecha (->) por el operador punto (.). El algoritmo es correcto. El algoritmo es incorrecto. Para que el algoritmo sea correcto hay que sustituir la declaración del objeto p que aparece en el algoritmo por CPunto *p(5.0, 3.0), y la sentencia de asignación de memoria dinámica ASIGNAR (p(5.0, 3.0)) por ASIGNAR (p). Pregunta 12 Dadas las declaraciones adjuntas (el puntero de la izquierda en cada nodo representa ant y el de la derecha sig) , si cabeza contiene: TIPOS REGISTRO TNodo N num TNodo *sig TNodo *ant FINREGISTRO TNodo *TipoLista VAR TipoLista cabeza Entonces, el siguiente código: TipoLista ptr, aux ptr = cabeza MIENTRAS ptr != cabeza->ant HACER ptr->ant->sig = ptr->sig ptr->sig->ant = ptr->ant aux = ptr ptr = ptr->sig LIBERAR(aux) FINMIENTRAS q q q Libera (elimina) correctamente toda la lista. Libera (elimina) correctamente la lista menos el último nodo, que se conserva. Es incorrecto porque en el segundo ciclo del bucle ya no existe cabeza->ant. Pregunta 13 Dada la declaración de tipos y variables de la Pregunta 12 , señala la respuesta correcta referente al siguiente trozo de código: ASIGNAR(ptr) ASIGNAR(aux) ptr->sig = aux ptr->ant = aux aux->sig = ptr aux->ant = ptr q q q La llamada a LIBERAR(ptr->sig->sig) libera el nodo apuntado por ptr. La llamada a LIBERAR(aux->sig) libera dos nodos, el apuntado por aux y el apuntado por ptr, dado que la lista que se había creado era circular. La llamada a LIBERAR(aux) hace que ptr->sig y ptr->ant se pongan a NULO. Pregunta 14 Dada la declaración de tipos y variables adjunta, ¿cuál de las siguientes afirmaciones sobre memoria dinámica es cierta?: q q q La operación ASIGNAR(nodo) es necesaria para reservar memoria para el nodo apuntado por nodo. La operación *lista = nodo permite copiar en el registro apuntado por lista el contenido de nodo, si previamente se ha reservado memoria para lista. El siguiente código... ASIGNAR(*nodo) ASIGNAR(lista) lista->sig = nodo nodo->sig = lista crea correctamente una lista circular de dos nodos. Pregunta 15 El siguiente algoritmo recursivo… ALGORITMO N Operación (E N num) INICIO SI num != 0 ENTONCES DEVOLVER num MOD 10 + Operación(num DIV 10) SINO DEVOLVER 0 FINSI FIN Operación q q q Es correcto y devuelve la suma de los dígitos de un número natural. Es incorrecto porque el caso base está mal diseñado. Es incorrecto porque en cada llamada recursiva no disminuye el tamaño del problema. TIPOS TNodo *TLista REGISTRO TNodo R dato TLista sig FINREGISTRO VAR TLista lista TNodo nodo Elementos de programación 17-SEPTIEMBRE-2003 (2ª. parte) Convocatoria ordinaria 1º. Ingeniería Técnica de Telecomunicación Dpto. de Lenguajes y Ciencias de la Computación Universidad de Málaga Apellidos: Nombre: Especialidad (SE/SI/ST): Grupo (A/B) (o profesor): Tiempo: 2 h. 30 min. Puntuación máxima: 7.0 Ejercicio 1 (5 puntos) El departamento de finanzas de una empresa se encarga de aprobar las peticiones de adquisición de recursos solicitadas por el resto de departamentos de la empresa. Se desea implementar la clase DptoFinanzas para la gestión de dichas peticiones. Los atributos de esta clase son: • • numDpto. Una variable de tipo natural donde se almacena, en cada momento, el número de departamentos que tiene la empresa. dpto. Una lista enlazada con los departamentos de la empresa. La información para cada departamento es: o Nombre, variable de tipo cadena de caracteres que almacena el nombre del departamento. o Nº Empleados, variable de tipo natural que almacena el número de empleados del departamento. o Presupuesto, variable de tipo real que almacena el presupuesto del departamento en euros. o Peticiones, con todas las peticiones de compras. Las peticiones se almacenan en un objeto de la clase Cola, cuya interfaz se muestra más abajo, para que las peticiones se estudien por riguroso orden de llegada. Cada petición es un registro de tipo TpPetición con los siguientes campos: a) Identificador del recurso a comprar (un número natural). b) Nombre del recurso a comprar (una cadena de caracteres). c) Cantidad del recurso a comprar (un número natural). d) Precio del recurso a comprar en euros (un número real). numDpto: 2 dpto Nombre: “Informática” NumEmpleados: 30 Presupuesto: 6000,76 ... ... ... ... Peticiones: Código: 1327 Nombre: papel Cantidad: 2 Precio: 20.00 Nombre: “Importación” NumEmpleados: 10 Presupuesto: 12000,00 Peticiones: Código: 1374 Nombre: cartucho Cantidad: 10 Precio: 30.50 SE PIDE: 1. Definir la interfaz de la clase DptoFinanzas, con las constantes y los tipos de datos que consideréis necesarios y las cabeceras de los siguientes métodos: a. Constructor de la clase DptoFinanzas sin parámetros. b. Destructor de la clase DptoFinanzas. c. InsertarDepartamento. Este método recibe el nombre del departamento a insertar, el número de empleados y el presupuesto del departamento e inserta un departamento en la lista de departamentos. La lista debe estar ordenada de menor a mayor según el presupuesto del departamento. d. 2. 3. CuantoComprar. Este método dado el nombre de un producto, devuelve la cantidad total solicitada de ese producto por todos los departamentos. e. UnificarDepartamentos. Este método unifica en uno todos los departamentos que tengan menos de 5 empleados. El nombre del nuevo departamento será el nombre del primero de los departamentos unificados. El presupuesto será la suma del presupuesto de todos ellos. Las colas será necesario unificarlas en una única cola. El nuevo departamento debe insertarse de forma ordenada según el nuevo presupuesto. Definir las estructuras de datos necesarias para implementar la clase DptoFinanzas (ver la figura anterior). Deberá hacerse mediante listas enlazadas con punteros (memoria dinámica). Implementar la clase DptoFinanzas. Implementar cada uno de los métodos descritos anteriormente. La interfaz de la clase Cola es la siguiente. INTERFAZ CLASE Cola TIPOS ... TpElemento MÉTODOS Crear() Destruir() TpElemento Frente() Encolar(E TpElemento e) Desencolar() B EstáLlena() B EstáVacía() FIN CLASE Cola NOTAS Nota 1: Se pueden implementar los métodos auxiliares que se consideren necesarios. Nota 2: No hay que implementar la clase Cola. Tampoco se pueden añadir ni modificar los métodos de esa clase. Nota 3: Se valorará la modularización. Ejercicio 2 (2 puntos) Escribe un algoritmo recursivo SumaNivel que dado un árbol binario cualquiera y un nivel, calcule la suma de los elementos del árbol en ese nivel. El algoritmo debe tener la siguiente cabecera: ALGORITMO Z SumaNivel (E CArbolBin arbol; E N nivel) INTERFAZ CLASE CArbolBin TIPOS Z TipoElemento MÉTODOS Crear() Crear(E CArbolBin a) Componer(E TipoElemento x, E CArbolBin hijoizq, hijoder) B ArbolVacio() TipoElemento Raíz() CArbolBin Izq() CArbolBin Der() Destruir() FIN CLASE CArbolBin Por ejemplo, para el árbol binario arb de la siguiente figura y en función del valor del parámetro nivel se obtendrían los resultados de la tabla: 7 4 8 2 3 5 6 Llamada Resultado SumaNivel(arb, 0) 7 SumaNivel(arb, 1) 4+2 = 6 SumaNivel(arb, 2) 8+3+5 = 16 SumaNivel(arb, 3) 6+1 = 7 1