Está en la página 1de 4

Ingenierı́a Técnica en Informática de Sistemas

Estructuras de Datos y de la Información (IS13)

Primer Parcial
19 de Enero de 2009

1 (1.0 puntos) Un alumno diseña la clase Tiempo, que se muestra parcialmente a continuación,
para ası́ poder gestionar citas de un dı́a. Para representar un instante de tiempo del dı́a, se utiliza
un único valor numérico que representa la cantidad de segundos transcurridos desde las 00:00
horas de ese dı́a.
Esta clase trabaja exclusivamente con segundos, por lo que convierte previamente el tiempo en
horas, minutos y segundos, al número total de segundos.
// F i c h e r o Tiempo . h
#i n c l u d e <i o s t r e a m >
#i n c l u d e < c s t d l i b >

c l a s s Tiempo {
public :
Tiempo & Tiempo ( i n t h=0, i n t m=0, i n t s =0) ;
Tiempo ( const Tiempo & d e r ) ;
˜ Tiempo ( ) ;
Tiempo & o p e r a t o r =( const Tiempo & d e r ) ;
Tiempo o p e r a t o r +( const Tiempo & d e r ) const ;
bool operator <( const Tiempo &d e r ) ;
.....
private :
int segundos ;
};

// F i c h e r o Tiempo . c++
Tiempo & Tiempo : : Tiempo ( i n t h , i n t m, i n t s ) {
i f ( h < 0 | | h > 24 | | m < 0 | | 60 <= m | | s < 0 | | 60 <= s ) {
c e r r << " Parametros erroneos para un objeto Tiempo ." << e n d l ;
e x i t ( EXIT FAILURE ) ;
}
s e g u n d o s = h * 60 * 60 + m* 60 + s ;
}

Tiempo : : Tiempo ( const Tiempo & d e r ) {


segundos = 0;
o p e r a t o r =( d e r ) ;
}

Tiempo : : ˜ Tiempo ( ) {
d e l e t e &s e g u n d o s ;
}

1
Tiempo & Tiempo : : o p e r a t o r =( const Tiempo & d e r ) {
i f ( t h i s != &d e r ) {
segundos = der . segundos ;
}
return (* t h i s ) ;
}

Tiempo Tiempo : : o p e r a t o r +( const Tiempo & d e r ) const {


Tiempo tmp ;
segundos = segundos + der . segundos ;
r e t u r n tmp ;
}

bool Tiempo : : operator <( const Tiempo & d e r ) {


segundos = segundos − der . segundos ;
return ( segundos < 0) ;
}

En esta definición e implementación existen errores y elementos que son innecesarios. Corrige
los errores que encuentres e indica qué elementos son innecesarios para la clase Tiempo.

2 (1.0 puntos) Una matriz triangular inferior es un tipo especial de matriz cuadrada cuyos
elementos por encima de la diagonal son ceros. Recuerda que una matriz cuadrada tiene el
mismo número de filas que de columnas. Por ejemplo, para n = 4 tendrı́amos la siguiente matriz
triangular inferior:
 
a11 0 0 0
 a21 a22 0 0 
A=
 
a31 a32 a33 0

 
a41 a42 a43 a44

Para representar en C++ este tipo de estructuras se utiliza a menudo una estrategia consistente
en almacenar cada fila en un vector nativo de C dinámico de forma que los ceros del triangulo
superior no se almacenan. La matriz A del ejemplo anterior, se representarı́a ası́:

elementos
a11

talla a21 a22


4
a31 a32 a33

a41 a42 a43 a44

Declara en C++ la clase MatrizTriangularInferior con elementos de tipo entero, de tal man-
era que se utilice dicha estrategia, y declara e implementa un constructor que admita como
parámetro la talla n de la matriz (su número de filas o de columnas). No debes declarar ni
implementar ninguna otra función de la clase.

2
3 (1.75 puntos) En algunas aplicaciones que utilizan colas para la gestión de procesos o usuarios
es necesario aplicar algunas acciones para penalizar el orden de los elementos en una cola. Por
ejemplo, los sistemas que gestionan el acceso a programas vacacionales de ciertos colectivos
utilizan colas que tienen en cuenta el orden de llegada de las peticiones, pero, además, penalizan a
aquellos usuarios que ya han disfrutado de algún programa vacacional con anterioridad colocando
su petición al final de la cola.

a) Implementa el método Penaliza de la clase ColaE vista en teorı́a, basada en una lista
enlazada de nodos y cuya declaración debe ser:
v o i d ColaE : : P e n a l i z a ( const TBCE & e l ) ;

Este método busca si el elemento el se encuentra en la cola, y si lo encuentra lo mueve al


final de la misma, y en caso contrario no hace nada.
b) ¿Cuál es el coste del método implementado? La implementación de este método con un
vector circular, ¿serı́a más o menos eficiente? Razona tu respuesta.

4 (1.00 puntos) Dada una pila de enteros, desarrolla una función que separe los números positivos
(el cero incluido) de los números negativos. La función devolverá una nueva pila con los números
negativos, dejando los positivos en la pila de entrada. Además, en las dos pilas resultantes los
números deben aparecer con el mismo orden que tenı́an en la pila de entrada. El siguiente ejemplo
muestra el contenido inicial de una pila, y el contenido que tendrán las dos pilas resultantes al
finalizar el algoritmo.

Pila1: 3 4 6 8 0 3

Cima
Pila1: 3 −1 4 6 −7 −2 8 0 3

Cima
Pila2: −1 −7 −2

Cima

5 (1.75 puntos) Dado el siguiente algoritmo recursivo:


void D i g i t o s ( i n t n , L i s t a E & L) {
i f ( n >= 1 ) {
L . I n s e r t a r ( n %10, 1 ) ;
D i g i t o s ( n /10 ,L ) ;
}
}

donde L es una lista de nodos enlazados, contesta las siguientes preguntas:

a) Indica el contenido de la lista L cuando termina la llamada inicial a la función con un


número entero n cualquiera y la lista L vacı́a.
b) Determina la relación de recurrencia asociada al algoritmo Digitos y expandiendo dicha
relación, obtén el coste computacional de la función.
c) ¿Mejorarı́a el coste utilizando una pila en lugar de la lista L? Razona tu respuesta.

3
6 (2.0 puntos) Podemos definir la igualdad elástica de listas de la siguiente manera: dos listas
son iguales elásticamente si tienen el mismo conjunto de valores diferentes y estos aparecen en
el mismo orden relativo (de izquierda a derecha) aunque el número de ocurrencias de cada valor
sea distinto. Por ejemplo, las las listas L1 , L2 , L3 y L4 son iguales elásticamente entre ellas, pero
L5 y L6 no lo son entre ellas ni con las anteriores.

L1 = (7, 7, 7, 2, 2, 5, 0, 0, 0, 0, 6, 6) L2 = (7, 2, 2, 2, 2, 5, 5, 5, 0, 0, 6, 6, 6)
L3 = (7, 7, 7, 7, 2, 2, 2, 2, 2, 5, 5, 5, 0, 0, 6, 6, 6) L4 = (7, 7, 2, 5, 5, 5, 0, 0, 0, 0, 0, 6)
L5 = (7, 7, 5, 2, 2, 2, 5, 5, 0, 0, 6, 6, 6) L6 = (7, 7, 2, 5, 5, 5, 0, 0, 0, 4, 4, 6, 6)

Considerando la implementación de listas de nodos enlazados vista en clase (ListaE) desarrolla u


método de la clase que determine si dos listas (el objeto que invoca el método y una lista pasada
como argumento) son iguales elásticamente. El coste computacional del método desarrollado
debe ser lineal respecto a la talla mayor de las listas implicadas.

7 (1.5 puntos) La siguiente función invierte los elementos de una lista pasada como argumento
de entrada.
void I n v i e r t e L i s t a ( L i s t a & L) {
L i s t a aux ;
f o r ( i n t i=L . T a l l a ( ) ; i >= 0 ; i −−)
aux . I n s e r t a r ( L . O b t e n e r ( i ) , aux . T a l l a ( ) +1) ;
L=aux ;
}

a) ¿Cuál es el coste computacional de esta función, considerando que la lista se implementa


con un vector dinámico (clase Lista de teorı́a). Si el coste obtenido es superior a O(n),
¿sabrı́as corregir el código para mejorar la eficiencia de la función?
b) Repite el apartado anterior, pero considerando ahora que la lista se implementa con nodos
enlazados (clase ListaE de teorı́a).

También podría gustarte