Estructura de dades - 24967
11 Junio 2001

  1. Dada la funcón fun y el programa principal main, suponiendo que todos los includes están declarados correctamente:

void fun(int &e1, int &e2)
{
int c=5;
int tmp=e1;
e1=e2;
e2=tmp;
c=c+1;
return;
}

void main(void)
{
int a=1;
int b=4;
int c=5;
fun(a,b);
cout << a << "," << b << "," << c << endl;
}

la salida del programa será:
     4,1,5
     Error de compilación en la llamada fun
     1,4,5
       1,4,6
       No contesto...
 
  2. Dada la función fun y el programa principal main, suponiendo que todos los includes están declarados correctamente:

void fun(int e1, int e2)
{
int c=5;
int tmp=e1;
e1=e2;
e2=tmp;
c=c+1;
return;
}

void main(void)
{
int a=1;
int b=4;
int c=5;
fun(a,b);
cout << a << "," << b << "," << c << endl;
}

la salida del programa será:
     4,1,5
     Error de compilación en la llamada fun
     1,4,5
       1,4,6
       No contesto...
 
  3. Dada la función fun y el programa principal main, suponiendo que todos los includes están declarados correctamente:

void fun(int *e1, int *e2)
{
int tmp=e1;
e1=e2;
e2=e1;
return;
}

void main(void)
{
int a=1;
int b=4;
fun(a,b);
cout << a << "," << b << endl;
}

la salida del programa será:
     4,1,5
     Error de compilación en la llamada fun
     1,4,5
       1,4,6
       No contesto...
 
  4. Dada la clase siguiente y el programa principal (main), decidir que constructor xxx(xx) es el correcto:

class Interger
{
int i;
public:
xxx(xx)
void print( ) { cout << i << ''; }
}

int main( )
{
Interger i[5];
for(int j=0;j < 5;j++)
i[j].print();
}
     Interger(int ii):i(ii){ }
     Interger(int ii=0):i(ii){ }
     Interger(int ii) { i=ii; }
       Interger(int &ii) { i=ii; }
       No contesto...
 
  5. La organización de un vector en memoria:
     Garantiza que los objetos en posiciones consecutivas del vector serán almacenados en posiciones consecutivas de memoria física. Si no hay suficiente espacio consecutivo se produce
     La relación entre posiciones del vector y las direcciones de memoria física dependerán de la gestión de memoria que se utilice
     Garantiza que los objetos en posiciones consecutivas del vector serán almacenados en posiciones consecutivas de memoria pero si no hay suficiente espacio consecutivo se utilizan fr
       Ninguna de las anteriores
       No contesto...
 
  6. Una lista simplemente enlazada:
     Garantiza que la velocidad de las inserciones de nodo no dependen de la posición donde se inserta
     Para acceder a un nodo es necesario pasar por todos los anteriores
     Garantiza que la velocidad de borrado de nodo no depende de las posiciones donde se borra
       Todas las anteriores son correctas
       No contesto...
 
  7. La relación que existe entre un puntero y un vector normal de cpp (clase):
     El nombre de un vector es también un puntero que señala la primera posición del vector
     Se puede utilizar un puntero para recorrer un vector
     Se puede utilitzar un puntero para leer o escribir elementos en un vector
       Todas las anteriores
       No contesto...
 
  8. En una clase sus funcniones miembro pueden leer y modificar variables que se encuentren en la zona:
     privada de la clase
     protegida de la clase
     pública de la clase
       todas las anteriores
       No contesto...
 
  9. Las funciones no miembro de una clase pueden leer y modificar variables que se encuentren en la zona
     privada de la clase
     protegida de la clase
     pública de la clase
       todas las anteriores
       No contesto...
 
  10. ¿ Cuándo es necesario codificar el constructor de copia de una clase ?
     Siempre
     Nunca (no es necesario porque el lenguaje ya los proporciona)
     Cuando en la clase existan punteros y se realize gestión de memoria
       Cuando en la clase haya variables de tipo double
       No contesto...
 
  11. Un árbol es:
     Una estructura de datos que por su definición recursiva puede tener un conjunto finito o infinito de nodos
     Una estructura de datos que consiste en nodos conectados donde cada nodo excepto las hojas del árbol tiene por lo menos un nodo descendiente
     Una estructura de datos tal que si para algún nodo sus subárboles no son disjuntos hablamos de árbol cíclico
       Un tipo de datos abstractos que consiste en nodos y ramas donde para cada nodo existe una rama hacia su padre
       No contesto...
 
  12. El grado de un nodo de un árbol
     Es igual al número de subárboles de este nodo
     Es igual al número de ramas que tiene un nodo
     Es igual al número de hijos que tiene un nodo
       A y C
       No contesto...
 
  13. Sobre los árboles binarios:
     Son óptimos porque, entre otras características, minimizan el número de campos hijos igual a 0 comparados con los árboles de cualquier grado
     Un árbol binario completo de n nodos tiene menos profundidad que un árbol completo de grado 3 y que contiene n nodos
     Permite definir los algoritmos principales relacionados con árboles como son el recorrido del árbol, inserción y borrado de un nodo, y luego estos algoritmos genéricos se pueden ap
       A y C
       No contesto...
 
  14. Sobre la representación de árboles binarios:
     Utilitzaría la representación con enlaces si mi problema donde se utiliza la estructura árbol necesita muchas inserciones y borrados de nodos porque es la representación que evita
     las formas típicas son: con nodos enlazados, con vectores o matrices
     Es recomendable usar la representación vectorial si el árbol tiene pocos nodos (un árbol esparcido) porque permite concentrarlos al principio del vector
       Siempre es mejor usar la representación con enlaces porque es la única forma de encontrar cual es el hijo izquierdo e hijo derecho de un nodo
       No contesto...
 
  15. Sobre los recorridos de un árbol binario, el algoritmo siguiente:

void arbol::recorrer(node *n)
{
if (n)
{
recorre(n->izquierda);
cout << n->info << " ";
recorrer(n->derecha);
}
}
     Realiza un recorrido en preorden
     Para obtener un recorrido en postorden hemos de visitar el nodo n (en este caso imprimir su información) antes de las llamadas recursivas
     Dado un árbol de búsqueda binaria, si utilizo el algoritmo para recorrer sus nodos se obtiene una secuencia ascendente
       Ninguno de los anteriores
       No contesto...
 
  16. Dados los prototipos de las clases nodo y arbol con sus definiciones respectivamente:

class nodo
{
int info;
nodo *l;
nodo *r;
...
};

class arbol
{
nodo *raiz;
public:
arbol( );
arbol(arbol &A);
arbol &operator =(arbol &A);
bool operator==(arbol &A);
};

Un objeto B de tipo árbol, y las siguientes operaciones:

arbol A(B);
arbol C;
C=B;
if(C==B)
cout << "Los árboles B y C son iguales";
     Falta definir el destructor de la clase árbol porque la clase árbol utiliza memoria dinámica
     No hace falta definir el constructor por defecto y el constructor de copia dado que están definidos por defecto
     La expresión C==B necesita que el operador == se defina como una función global friend y no como una función miembro de la clase árbol. Al ser definido como función m
       Ninguno de los anteriores
       No contesto...
 
  17. La inserción:
     En un árbol enhebrado asegura que el árbol seguirá siendo balanceado
     En un árbol heap asegura que el árbol seguirá siendo balanceado
     En un árbol heap consiste en insertar a la raíz e ir bajándolo hasta encontrar un sitio donde será mayor que sus hijos y menor que su padre
       En una posición concreta (nodo *n) de un árbol enhebrado consiste en mover físicamente todos los nodos del subarbol con raíz (*n) un nivel hacia abajo
       No contesto...
 
  18. En un grafo:
     La potencia de orden k de la matriz adyacente nos da los caminos de longitud k-1 del grafo
     La potencia de orden k de la matriz adyacente nos da todos los caminos de longitud hasta k-1 del grafo
     El algoritmo de Warshall nos permite encontrar los nodos conectados (la matriz de los caminos) de un grafo de una forma más óptima que el método de las potencias de la matriz adyac
       El problema de Koninberg se puede resolver utilizando una estructura de datos que puede ser de tipo grafo o de tipo árbol; sin embargo usando grafos es más rápido encontrar la solu
       No contesto...
 
  19. Problema: Dado el árbol de búsqueda bianria:

   (20)
  /   \
(15)  (40)
      /  \
    (30)(60)
      \
   (32)
       \
      (38)
/
(36)

Si borramos el nodo 40 sustituyéndolo con su predecesor y leemos el árbol en preorden obtenemos la secuencia:
     20,15,30,32,60,38,36
     20,15,38,30,32,36,60
     20,15,36,30,60,32,38
       Ninguna de las anteriores
       No contesto...
 
  20. Problema: Dado el siguiente algoritmo de recorrido de una estructura de nodos:

void estructura:recorrido()
{
bool *visitado=new bool[n]; // n - numero de nodos de la estructura de datos
for (int i=0;i visitado[i]=false;
queueq;
q.push(0);//guarda el primer nodo
while(!q.empty())
{
int t=q.front();
q.pop();
cout << t << " ";
visitado[t]=true;
queue ad=adyacentes(t); // busca los nodos adyacentes del nodo t
while(!ad.empty())
{
int na=ad.front();
ad.pop();
if(!visitado[na])
q.push(na);
}
}
delete []visitado;
}
     Realiza un recorrido en amplitud de un árbol
     Realiza un recorrido en profundidad de un árbol
     Realiza un recorrido en amplitud de un grafo
       Realiza un recorrido en profundidad de un grafo
       No contesto...
 

Check...