Elementos de Programación - Departamento de Lenguajes y

Anuncio
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
Descargar