Tipos de Datos Abstractos
Uso de TDA
Un TDA es el elemento básico de la abstracción de datos. Su desarrollo es
independiente del lenguaje de programación utilizado, aunque este puede aportar
mecanismos que faciliten su realización. Debe verse como una caja negra.
Implementación
En un TDA existen dos elementos diferenciados:
 La Interfaz de utilización
 La representación
Una vez definido el TAD se escoge una representación interna utilizando los tipos que
proporciona el lenguaje y/o otros TAD ya definidos previamente.
TDA en programación
 Conjuntos: implementación de conjuntos con sus operaciones básicas (unión,
intersección y diferencia), operaciones de inserción, borrado, búsqueda...
 Árboles Binarios de Búsqueda: Implementación de árboles de elementos,
utilizados para la representación interna de datos complejos. Aunque siempre se
los toma como un TDA separado son parte de la familia de los grafos.
 Pilas y Colas: Implementación de los algoritmo FIFO y LIFO.
 Grafos: Implementación de grafos; una serie de vértices unidos mediante una serie
de arcos o aristas.
Sobrecarga de operadores y funciones
 Sobrecarga es la capacidad de un lenguaje de programación, que permite
nombrar con el mismo identificador diferentes variables u operaciones.
 Se refiere a la posibilidad de tener dos o más funciones con el mismo nombre pero
funcionalidad diferente. El compilador usará una u otra dependiendo de los
parámetros usados. A esto se llama también sobrecarga de funciones.
 También existe la sobrecarga de operadores que al igual que con la sobrecarga de
funciones se le da más de una implementación a un operador.
 El mismo método dentro de una clase permite hacer cosas distintas en función de
los parámetros.
Sobrecarga de operadores
 Se llama sobrecarga de operadores cuando reutilizando el mismo operador con un
número de usos diferentes, y el compilador decide como usar ese operador
dependiendo sobre qué opera.
 La sobrecarga de operadores solo se puede utilizar con clases, no se pueden
redefinir los operadores para los tipos simples predefinidos.
Sobrecarga de funciones
 Es un mecanismo que permite
asignar el mismo nombre a
funciones distintas. Para el
compilador estas funciones no
tienen nada en común a excepción
del identificador, por lo que se trata
en realidad de un recurso semántico
del lenguaje que solo tiene sentido
cuando se asigna el mismo nombre
a funciones que realizan tareas
similares en objetos diferentes.
Manejo de memoria estática y dinámica
La ejecución de un programa requiere que diversos elementos se almacenen en la
memoria:
 Código del programa (instrucciones)
 Datos
 Permanentes
 Temporales
 Direcciones para controlar de flujo el ejecución del programa
 Define la cantidad de memoria necesaria para un programa durante el tiempo de
compilación.
 El tamaño no puede cambiar durante el tiempo de ejecución del programa.
 Algunos lenguajes de programación utilizan la palabra static para especificar
elementos del programa que deben almacenarse en memoria estática.
 Elementos que residen en memoria estática:
 Código del programa
 Las variables definidas en la sección principal del programa, las cuales pueden solo
cambiar su contenido no su tamaño.
 Todas aquellas variables declaradas como estáticas en otras clases o módulos.
 Estos elementos se almacenan en direcciones fijas que son relocalizadas
dependiendo de la dirección en donde el cargador las coloque para su ejecución.
Memoria Estática
El stack de ejecución
 Cada subprograma (procedimiento, función, método, etc.) requiere una
representación de si en tiempo de ejecución.
 Estas representaciones se almacenan en el stack de ejecución con el fin de
controlar el flujo de ejecución del programa.
Memoria Dinámica
 Es memoria que se reserva en tiempo de ejecución. Su principal ventaja frente a
la estática, es que su tamaño puede variar durante la ejecución del programa. (En
C, el programador es encargado de liberar esta memoria cuando no la utilice
más). El uso de memoria dinámica es necesario cuando a priori no conocemos el
número de datos/elementos a tratar.
 Su tamaño y forma es variable (o puede serlo) a lo largo de un programa, por lo
que se crean y destruyen en tiempo de ejecución. Esto permite dimensionar la
estructura de datos de una forma precisa: se va asignando memoria en tiempo de
ejecución según se va necesitando.
 Las regiones de memoria que reservan/liberan estas funciones son almacenadas
en el montículo o heap.
Asignación dinámica de memoria
 Por lo regular cuando se diseña un algoritmo, se debe conocer que elementos de
entrada tendrá y cual será la salida, sin embargo, en algunas ocasiones no se
sabe de forma exacta el numero de variables que requerirá nuestro algoritmo.
 Por ejemplo, suponga que se van a registrar el numero de calificaciones de un
conjunto de alumnos, para resolver este problema se podría utilizar una arreglo de
calificaciones, sin embargo, si el numero de alumnos crece, nuestro programa ya
no seria valido, puesto que no existen los recursos necesarios para almacenar
todos los datos validos.
Función malloc()
 Malloc es la forma mas habitual de obtener bloques de memoria. La función
genera o asigna un bloque de memoria que es el numero de bytes pasados como
argumento
 El prototipo de la función malloc() sería:
 Donde:
 void*: es el apuntador que almacena la referencia o apuntara al bloque de memoria
asginado
 bytes: es el tamaño en bytes del bloque de memoria que se va a solicitar
Ejercicios para realizar
 Ingresar una matriz nxn y encontrar la matriz identidad

1. tipos de datos abstractos

  • 1.
    Tipos de DatosAbstractos
  • 2.
    Uso de TDA UnTDA es el elemento básico de la abstracción de datos. Su desarrollo es independiente del lenguaje de programación utilizado, aunque este puede aportar mecanismos que faciliten su realización. Debe verse como una caja negra.
  • 3.
    Implementación En un TDAexisten dos elementos diferenciados:  La Interfaz de utilización  La representación Una vez definido el TAD se escoge una representación interna utilizando los tipos que proporciona el lenguaje y/o otros TAD ya definidos previamente.
  • 4.
    TDA en programación Conjuntos: implementación de conjuntos con sus operaciones básicas (unión, intersección y diferencia), operaciones de inserción, borrado, búsqueda...  Árboles Binarios de Búsqueda: Implementación de árboles de elementos, utilizados para la representación interna de datos complejos. Aunque siempre se los toma como un TDA separado son parte de la familia de los grafos.  Pilas y Colas: Implementación de los algoritmo FIFO y LIFO.  Grafos: Implementación de grafos; una serie de vértices unidos mediante una serie de arcos o aristas.
  • 5.
    Sobrecarga de operadoresy funciones  Sobrecarga es la capacidad de un lenguaje de programación, que permite nombrar con el mismo identificador diferentes variables u operaciones.  Se refiere a la posibilidad de tener dos o más funciones con el mismo nombre pero funcionalidad diferente. El compilador usará una u otra dependiendo de los parámetros usados. A esto se llama también sobrecarga de funciones.  También existe la sobrecarga de operadores que al igual que con la sobrecarga de funciones se le da más de una implementación a un operador.  El mismo método dentro de una clase permite hacer cosas distintas en función de los parámetros.
  • 6.
    Sobrecarga de operadores Se llama sobrecarga de operadores cuando reutilizando el mismo operador con un número de usos diferentes, y el compilador decide como usar ese operador dependiendo sobre qué opera.  La sobrecarga de operadores solo se puede utilizar con clases, no se pueden redefinir los operadores para los tipos simples predefinidos.
  • 7.
    Sobrecarga de funciones Es un mecanismo que permite asignar el mismo nombre a funciones distintas. Para el compilador estas funciones no tienen nada en común a excepción del identificador, por lo que se trata en realidad de un recurso semántico del lenguaje que solo tiene sentido cuando se asigna el mismo nombre a funciones que realizan tareas similares en objetos diferentes.
  • 8.
    Manejo de memoriaestática y dinámica La ejecución de un programa requiere que diversos elementos se almacenen en la memoria:  Código del programa (instrucciones)  Datos  Permanentes  Temporales  Direcciones para controlar de flujo el ejecución del programa
  • 9.
     Define lacantidad de memoria necesaria para un programa durante el tiempo de compilación.  El tamaño no puede cambiar durante el tiempo de ejecución del programa.  Algunos lenguajes de programación utilizan la palabra static para especificar elementos del programa que deben almacenarse en memoria estática.  Elementos que residen en memoria estática:  Código del programa  Las variables definidas en la sección principal del programa, las cuales pueden solo cambiar su contenido no su tamaño.  Todas aquellas variables declaradas como estáticas en otras clases o módulos.  Estos elementos se almacenan en direcciones fijas que son relocalizadas dependiendo de la dirección en donde el cargador las coloque para su ejecución. Memoria Estática
  • 10.
    El stack deejecución  Cada subprograma (procedimiento, función, método, etc.) requiere una representación de si en tiempo de ejecución.  Estas representaciones se almacenan en el stack de ejecución con el fin de controlar el flujo de ejecución del programa.
  • 11.
    Memoria Dinámica  Esmemoria que se reserva en tiempo de ejecución. Su principal ventaja frente a la estática, es que su tamaño puede variar durante la ejecución del programa. (En C, el programador es encargado de liberar esta memoria cuando no la utilice más). El uso de memoria dinámica es necesario cuando a priori no conocemos el número de datos/elementos a tratar.  Su tamaño y forma es variable (o puede serlo) a lo largo de un programa, por lo que se crean y destruyen en tiempo de ejecución. Esto permite dimensionar la estructura de datos de una forma precisa: se va asignando memoria en tiempo de ejecución según se va necesitando.
  • 12.
     Las regionesde memoria que reservan/liberan estas funciones son almacenadas en el montículo o heap.
  • 13.
    Asignación dinámica dememoria  Por lo regular cuando se diseña un algoritmo, se debe conocer que elementos de entrada tendrá y cual será la salida, sin embargo, en algunas ocasiones no se sabe de forma exacta el numero de variables que requerirá nuestro algoritmo.  Por ejemplo, suponga que se van a registrar el numero de calificaciones de un conjunto de alumnos, para resolver este problema se podría utilizar una arreglo de calificaciones, sin embargo, si el numero de alumnos crece, nuestro programa ya no seria valido, puesto que no existen los recursos necesarios para almacenar todos los datos validos.
  • 14.
    Función malloc()  Malloces la forma mas habitual de obtener bloques de memoria. La función genera o asigna un bloque de memoria que es el numero de bytes pasados como argumento  El prototipo de la función malloc() sería:  Donde:  void*: es el apuntador que almacena la referencia o apuntara al bloque de memoria asginado  bytes: es el tamaño en bytes del bloque de memoria que se va a solicitar
  • 15.
    Ejercicios para realizar Ingresar una matriz nxn y encontrar la matriz identidad