2. 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.
3. 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.
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 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.
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 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
9. 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
10. 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.
11. 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.
12. Las regiones de memoria que reservan/liberan estas funciones son almacenadas
en el montículo o heap.
13. 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.
14. 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