Está en la página 1de 6

Pontificia Universidad Javeriana

Departamento de Ingeniería de Sistemas


Estructuras de Datos, 2023-30
Parcial 2 - 11 de octubre de 2023

Reglas y recomendaciones
Durante el parcial, deben observarse las siguientes reglas:

1. El parcial se debe desarrollar en el computador, escribiendo las respuestas en los campos designados
dentro del cuestionario de BrightSpace.

2. Archivos adicionales se aceptarán sólo en el caso del diseño, de acuerdo a las instrucciones que
se encuentran en el enunciado del parcial. Guarde regularmente su trabajo (para evitar posibles
pérdidas de información), con los nombres de archivo
par2_apellido1_apellido2_nombre1_nombre2.txt (para el diseño de los TADs) y
par2_apellido1_apellido2_nombre1_nombre2_dis.pdf (para el diagrama de relación entre TADs)
Tenga en cuenta que los nombres y apellidos van todos en minúsculas, los espacios se reemplazan
por guiones bajos y no se utilizan ni tildes ni ’ñ’. Estos archivos deben enviarse únicamente dentro
de la pregunta correspondiente en el cuestionario de BrightSpace.

3. El parcial tiene una duración de dos horas, contadas a partir del inicio normal de la clase (9:00a.m.).
El cuestionario en BrightSpace está programado para cerrarse al terminar las dos horas (11:00a.m.),
por lo que no enviarlo dentro de ese lapso de tiempo se considerará como parcial no presentado y
tendrá una calificación de 0.0.

4. El parcial es estrictamente individual y se debe desarrollar únicamente en la sala de computadores


del día.

5. Se recomienda no utilizar compiladores, intérpretes de lenguajes de programación o entornos de


desarrollo de cualquier tipo.

6. Puede utilizar sus apuntes, libros, e Internet para obtener la información que necesite para el parcial.
Puede utilizar también herramientas de inteligencia artificial (tipo ChatGPT), bajo su propio riesgo
y corroborando la información obtenida.

7. Sin embargo, está absolutamente prohibido comunicarse con cualquier otro ser humano para obtener
información sobre el parcial, a través de cualquier medio (conversación directa, Teams, Skype, Zoom,
Gtalk, Whatsapp, etcétera). También está totalmente prohibido copiar o transcribir texto o código
de enunciados y respuestas de parciales anteriores, o de diseños e implementaciones que no sean
propias.

8. Los celulares deben permanecer apagados, y no se debe enviar ni recibir ningún mensaje de texto.

9. La única excepción a lo anterior son los profesores y monitores de la asignatura, quienes sólo respon-
derán consultas respecto a la claridad de las preguntas del parcial y no responderán consultas sobre
la materia.

10. Si el estudiante incumple con cualquiera de las reglas, será evaluado con nota 0.0

11. Recuerde que diseñar no implica implementar.


1 (18%) Selección múltiple con única respuesta (3 preguntas)
1.1 ¿Qué condición debe cumplir un árbol de expresión para asumir que está bien
construído?
1. Las hojas sólo contienen operandos.

2. Su recorrido en inorden está ordenado.

3. Los nodos internos sólo contienen operandos.

4. El nodo padre siempre es mayor que los hijos.

1.2 Si al hacer un recorrido en inorden de un árbol, la secuencia resultado está


ordenada ascendentemente, se puede afirmar que el árbol es:
1. binario ordenado.

2. AVL.

3. Rojo-Negro (RN).

4. binario ordenado y balanceado.

1.3 Para una imagen binaria de tamaño 8 × 8 que representa un patrón de tablero
de ajedrez, el tamaño del quadtree asociado es:
1. 64.

2. 85.

3. 84.

4. 68.

2 (14%) Falso o verdadero (2 preguntas)


2.1 La eliminación secuencial (uno a uno) de un montículo mínimo produce una
secuencia de números ordenados ascendentemente.
Verdadero
2.2 Insertar la misma secuencia de valores simultáneamente en un árbol binario
ordenado y en un árbol AVL siempre genera árboles de la misma altura.
Falso
3 (68%) Diseño e Implementación de TADs
En las primeras épocas del desarrollo de las comunicaciones, se desarrolló el código Morse (1836) para la
transmisión de mensajes de manera rápida y eficiente. Cada letra, número y algunos caracteres especiales
se codifican utilizando una secuencia estandarizada de señales cortas y largas conocidas como puntos y
rayas, y esta codificación es única para cada caracter. Dado el avance de las telecomunicaciones, el código
Morse se utiliza poco en la actualidad, sin embargo, aún se considera el método más simple y versátil de
transmisión de mensajes 1 .
La escogencia de la secuencia de puntos y rayas que debía representar cada caracter no se realizó
de manera aleatoria. Como el objetivo era la transmisión rápida de mensajes, se analizó la frecuencia de
ocurrencia de cada uno de los caracteres en los textos en inglés, y las letras más frecuentes se codificaron con
secuencias cortas, haciendo así más rápida y eficiente la transmisión. La Figura 1 representa la codificación
de las letras del alfabeto usando el código Morse, donde las letras más frecuentes se encuentran en niveles
superiores del árbol, y las menos frecuentes se encuentran en las hojas del árbol.

Figure 1: Árbol binario con la representación del código Morse

En este árbol, cada nodo almacena un símbolo del alfabeto de 26 letras utilizado en la transmisión de
un mensaje en clave Morse. Este árbol se utiliza para codificar y decodificar los símbolos de un mensaje.
Cada arista entre un nodo padre y sus hijos se etiqueta con un “.” para el hijo izquierdo y con un “-”
para el hijo derecho. Cada camino entre el nodo raíz y los nodos con símbolos se puede representar como
la concatenación de las etiquetas de las aristas que lo conforman. Esta representación corresponde a la
codificación para cada uno de los símbolos. En este caso, por ejemplo, para el símbolo “C” su codificación
es “-.-.”, el cual corresponde a las etiquetas de las aristas del camino desde la raíz hasta el nodo con el
símbolo “C”. Así mismo, la “S” se codifica como “...”, la “O” se codifica como “---” y la “Z” se codifica
como “--..”.
Para desarrollar un sistema de codificación y decodificación de mensajes utilizando el código Morse,
se utilizará una implementación basada en los árboles vistos en clase. Dentro de este sistema, se ha
identificado inicialmente una operación muy importante: la que permite codificar un texto dado. Esta
operación debe recibir un conjunto de palabras (cadenas de caracteres) y utilizar el árbol con el código
Morse para codificar, caracter a caracter, cada palabra; generando un conjunto de cadenas de caracteres
(conjunto de códigos Morse) para cada palabra. Se garantiza que el árbol ya se encuentra poblado con la
información necesaria, sin embargo, si algún caracter no se encuentra en el árbol no es posible codificarlo.
1
https://en.wikipedia.org/wiki/Morse_code
3.1 (22%) Diseño
Diseñe el sistema y el (los) TAD(s) solicitado(s). Utilice la plantilla de especificación de TADs vista en
clase para el diseño. Recuerde que diseñar es un proceso previo a la implementación, por lo que no debería
contener ninguna referencia a lenguajes de programación (es decir, si escribe encabezados o código fuente,
el punto no será evaluado y tendrá una calificación de cero). Para simplicidad del diseño, no es necesario
incluir los métodos obtener y fijar (get/set) del estado de cada TAD.

TAD NodoMorse
Datos mínimos:
- dato, caracter, información a almacenar en el nodo del árbol.
- hijoIzq, apuntador a NodoMorse, referencia al hijo izquierdo del nodo.
- hijoDer, apuntador a NodoMorse, referencia al hijo derecho del nodo.
Operaciones:
- fijarDato(n_dato), cambiar el dato actual a n_dato.
- fijarHijoIzq(n_hijoI), cambiar la referencia al hijo izquierdo por h_hijoI.
- fijarHijoDer(n_hijoD), cambiar la referencia al hijo derecho por n_hijoD.
- obtenerDato(), retornar el dato actual.
- obtenerHijoIzq(), retornar el hijo izquierdo actual.
- obtenerHijoDer(), retornar el hijo derecho actual.
- esHoja(), retorna si el nodo es actualmente una hoja del árbol o no.
- codificar(car), retorna la codificación correspondiente al caracter dado.

TAD ArbolMorse
Datos mínimos:
- raiz, apuntador a NodoMorse, referencia al nodo raíz del árbol.
Operaciones:
- fijarRaiz(n_raiz), cambiar la raíz actual a n_raiz.
- obtenerRaiz(), retornar la raíz actual.
- esVacio(), identifica si el árbol está vacío o no.
- vaciar(), elimina todos los nodos del árbol.
- codificar(car), retorna la codificación correspondiente al caracter dado.

TAD SistemaMorse
Datos mínimos:
- arbolCod, ArbolMorse, representa el árbol que almacena el código Morse.
Operaciones:
- fijarArbolCod(n_arbol), cambiar el árbol de codificación actual a n_arbol.
- obtenerArbolCod(), retornar el árbol actual.
- codificarPalabras(conjunto), se encarga de gestionar la codificación caracter a
caracter para un conjunto de palabras.

3.2 (10%) Diagrama de relación


El diseño incluye el diagrama de relación entre TADs, cuando se definen dos o más TADs en el punto
anterior. En ese caso, adjúntelo en formato PDF, JPG o PNG como parte de su entrega.

3.3 (18%) Diseño: Codificar en Morse


Dado el (los) TAD(s) ya diseñado(s), diseñe la operación que permite usar el código Morse para codificar
un texto dado, representado como un conjunto de palabras (cadenas de caracteres). El diseño deberá
especificar, en lenguaje natural, los pasos necesarios para codificar un texto dado, teniendo en cuenta los
datos y operaciones ya definidos en el (los) TAD(s).

Pasos a seguir:
1. Moverse sobre el contenedor de palabras, para realizar el proceso para cada
palabra.
2. Para cada palabra, moverse sobre cada uno de los caracteres de la palabra, para
realizar el proceso de codificación para cada caracter.
3. Para codificar, realizar un recorrido sobre el árbol, de forma sistemática y en
profundidad.
4. En cada nodo de avance en el recorrido, ir almacenando el camino de puntos y
guiones recorrido, es decir: por cada hijo izquierdo que se use para avanzar,
agregar un punto; y por cada hijo derecho que se use para avanzar, agregar un
guión.
5. Al llegar al nodo que contiene el caracter dado, retornar el camino de puntos y
guiones actual.
6. Tomar la codificación de cada caracter y agregarla a un contenedor de códigos.
7. Una vez terminada de codificar una palabra, tomar el contenedor de códigos y
agregarlo a un contenedor de códigos por palabra.
8. Una vez terminadas de codificar todas las palabras, retornar el contenedor de
códigos por palabra con el resultado de todas las codificaciones realizadas.

3.4 (18%) Implementación: Codificar en Morse


Dado el (los) TAD(s) ya diseñado(s), y el diseño de la operación escrito en el punto anterior, escriba la
implementación en C++ del algoritmo que permite usar el código Morse para codificar un texto dado. La
implementación deberá tener en cuenta:

• la definición apropiada de los prototipos de los métodos/funciones (i.e. recibir/retornar los datos
suficientes y necesarios para su correcta ejecución),

• el NO uso de salidas/entradas por pantalla/teclado (i.e. paso/retorno correcto de valores y/o obje-
tos),

• la coherencia y el correcto uso del diseño definido en los puntos anteriores, y

• la escritura de todo el código que pueda llegar a necesitar que no esté incluido en la STL.

typedef std::vector< std::string > VecCadenas;


typedef std::vector< VecCadenas > MultiCadenas;

MultiCadenas SistemaMorse::codificarPalabras (VecCadenas palabras) {


MultiCadenas res;
VecCadenas::iterator sIt;
std::string::iterator cIt;
std::string pal, cod;

for (sIt = palabras.begin(); sIt != palabras.end( ¡); sIt++) {


pal = *sIt;
VecCadenas codif;
for (cIt = pal.begin(); cIt != pal.end(); cIt++) {
cod = arbolCod.codificar(*cIt);
codif.push_back(cod);
}
res.push_back(codif);
}

return res;
}

std::string ArbolMorse::codificar (char caracter) {


if (!esVacio())
return raiz->codificar(caracter);
else
return "";
}

std::string NodoMorse::codificar (char caracter) {


std::string codigo = "";
if (dato != caracter) {
if (hijoIzq != NULL)
codigo = hijoIzq->codificar(caracter);
if (codigo == "") {
if (hijoDer != NULL)
codigo = hijoDer->codificar(caracter);
if (codigo != "")
codigo = "-" + codigo;
}
else
codigo = "." + codigo;

// Borrar valor auxiliar


if (codigo != "") {
if (codigo[codigo.size() - 1] == ’2’)
codigo = codigo.substr(0, codigo.size() - 1);
}
} else
codigo = "2";
return codigo;
}

bool ArbolMorse::esVacio () {
return raiz == NULL;
}

También podría gustarte