Semana 1 - Introducción a los tipos abstractos de datos

✔️ Objetivos
  • Conocer la definición de Tipo Abstracto de Datos.

  • Utilizar los mecanismos de encapsulación de C++ para la implementación de Tipos Abstractos de Datos.

  • Conocer la terminología básica de TADs: modelo, representación, e invariantes.

✔️ Tiempo de estudio
  • Vídeos: 1h 4min

  • Total (incluyendo vídeos, cuestionarios y actividades de autoevaluación, pero no los problemas de la sección 1.4): 2h 10min

En la última clase de teoría hemos hecho un ejercicio de planificación de horarios. Aquí tienes el ejercicio junto con las soluciones.

📝 Planificación de horarios A (con solución)

📝 Planificación de horarios B (con solución)

Este ejercicio es similar al siguiente problema de Acepta el Reto: ACR 278: El baile de Cenicienta.

1.1. Motivación

En el ejercicio de planificación de horarios, tenemos dos maneras de representar las duraciones: (1) mediante un struct que almacene los distintos campos de una duración por separado, y (2) mediante un único número entero que denote una cantidad de segundos. Cada una de estas representaciones tiene sus ventajas e inconvenientes, y no existe una opción que sea mejor que la otra en todos los casos. No obstante, lo que sí resultaría claramente perjudicial sería que tu código dependiese, en gran medida, de la opción escogida. ¿Qué pasaría si, pasado un tiempo tras haber escogido una representación, tienes que rectificar y escoger la otra?

En el primer video que se enlaza a continuación vamos a presentar un ejemplo parecido:

▶️ Tipos Abstractos de Datos (TADs) - Motivación (8:32)

📄 Código fuente

📝 Ejercicio 1.1

Antes de que en el siguiente video arreglemos nuestra implementación, puedes acceder en el siguiente enlace a una sesión de Compiler Explorer con el código que tenemos hasta ahora.

💻 Implementación inicial del juego

¿Puedes arreglarlo tú mismo? El objetivo es que modifiques la función main, añadiendo las funciones auxiliares que necesites, para que puedas cambiar entre las dos implementaciones de ConjuntoChar sin tener que realizar cambios en la función main resultante.

¿No sabes utilizar Compiler Explorer? Aquí tienes un mini-manual: Cómo usar Compiler Explorer

En el siguiente video veremos cómo se puede realizar esta encapsulación:

▶️ Definición de TAD (11:56)

📄 Código fuente (versión que utiliza un array de elementos)

📄 Código fuente (versión que utiliza un array de valores booleanos)

📝 Ejercicio 1.2

En la siguiente sesión de Compiler Explorer se encuentra el nuevo método main.

💻 Método main

Observa que se hace un #include sobre la implementación que utiliza arrays de caracteres (ConjuntoCharArray.h). Vamos a demostrar que esta implementación es intercambiable con la que utiliza un array de booleanos (ConjuntoCharBool.h). Para ello sustituye el #include anterior por uno que haga referencia a este último fichero. El programa debería funcionar perfectamente, ¡sin modificar una línea del método main!

1.2. Clases en C++

El último vídeo de la sección anterior nos deja un interrogante. ¿No sería mejor que el compilador nos impidiese acceder a las representaciones internas de los tipos de datos? Pues bien, esto es posible mediante clases en C++. A continuación se presentan tres vídeos sobre esto. Los dos primeros presentan conceptos que ya conocéis de la asignatura de Tecnología de la Programación: clases, métodos, constructores, etc. Aun así, prestad atención porque la sintaxis difiere bastante de lo que habéis visto en Java. El último vídeo introduce los métodos constantes; una característica propia de C++ que no se encuentra en Java.

▶️ C++ - Atributos y métodos (8:04)

▶️ C++ - Constructores y Listas de inicialización (11:14)

▶️ C++ - Métodos const (7:42)

📄 Código fuente

📝 Ejercicio 1.3
Mediante el siguiente cuestionario podrás practicar los conceptos vistos en los tres vídeos anteriores.

Cuestionario de autoevaluación - Clases en C++

📝 Ejercicio 1.4
El siguiente enlace presenta una sesión de *Compiler Explorer* con el código del juego tras encapsular el acceso a `ConjuntoChar` mediante funciones auxiliares.

💻 Transformar ConjuntoChar en una clase

Sustituye el struct por una clase de C++, y modifica las funciones definidas sobre conjuntos para queden integradas como métodos dentro de la clase.

La solución está en el siguiente video, en el que introducimos las clases de C++ en nuestro juego.

▶️ Encapsulación en TADs (7:58)

📄 Código fuente

1.3. Conceptos básicos en Tipos Abstractos de Datos

En este último vídeo vamos a introducir de manera informal los conceptos que aparecen en el estudio de las estructuras de datos y los TADs: modelos, representaciones e invariantes de representación. También se introduce la importante distinción entre operaciones constructoras, observadoras y mutadoras.

▶️ Modelo vs representación en TADs (13:31)

📝 Ejercicio 1.5
El siguiente cuestionario presenta más ejemplos de TADs y sus correspondientes modelos.

Cuestionario - Modelo vs Representación

1.4. Problemas de laboratorio

📝 Ejercicio 1.6
📝 Ejercicio 1.7
📝 Ejercicio 1.8
📝 Ejercicio 1.9