miércoles, 29 de junio de 2016

TE DAMOS LA BIENVENIDA

En este blog encontraras información relacionada con el tema de ESTRUCTURA DE DATOS.
Te invitamos a consultar todo nuestro contenido y dejarnos un comentario expresando tu opinión.

Aquí encontraras información sobre:
  1.  Gestión Dinámica de Memoria
  2. Apuntadores
  3. Operadores y Funciones de la Gestión Dinámica de Memoria
  4. Pilas
  5. Colas
  6. Listas
  7. Arboles
  8. Grafos
  9. Arboles Binarios




Costado derecho de la pagina, podrás encontrar información mas detallada de cada tema.












martes, 28 de junio de 2016

1. GESTIÓN DINÁMICA DE MEMORIA


DEFINICIÓN


       VIDEO GESTION DINAMICA DE MEMORIA
  •       Un puntero es un tipo especial de variable que contiene, ni más ni menos una dirección de memoria. 
  •       A partir de esa dirección de memoria puede haber cualquier tipo de objeto (o dato): un char, un int, un float, un array, una estructura, una función u otro puntero.
  •      El programador será el responsables de decidir ese contenido de acuerdo a la cantidad de memoria que requiere dentro de una estructura.




Operaciones Básicas de Gestión Dinámica de Memoria



       MALLOC

Esta función asigna un cierto espacio de memoria  a una estructura de datos (por ejemplo, un vector).

REALLOC

Cambia el tamaño del espacio de memoria asignado a una estructura de datos.

FREE 

Libera el espacio de memoria asignado a una estructura de datos (ese espacio queda libre
para ser asignado en el futuro a otras estructuras).


Operaciones de Reserva de Memoria con un Vector





La figura compara el funcionamiento de los vectores estáticos y dinámicos. A la izquierda
se muestra cómo al declarar un vector estático el computador automáticamente reserva
espacio en memoria según el tamaño establecido en la declaración, y crea la variable que
apunta a ese espacio, para poder acceder después y durante el programa. A la derecha se
muestra como, en el caso de los vectores dinámicos, primero se crea la variable que
apuntará al vector, después se reserva el espacio justo que se necesite, se hace que la
variable apunte al espacio y se accede al vector con normalidad.


Matrices dinámicas



La figura muestra la estructura que tiene una matriz dinámica de N filas y M columnas.
La variable matriz es un apuntador a un vector de N posiciones. Cada posición
contiene un apuntador a una de las filas de la matriz. El apuntador que  hay primera
posición de ese vector apunta al espacio de memoria donde están los M
elementos de la fila 0 de la matriz. 





Ventaja de utilizar memoria dinámica

  •       Los programas aprovecharán mejor la memoria del ordenador en la ejecución de un programa.
  •       Solo se utiliza la memoria que es necesario.
  •       Se puede dimensionar el rango de memoria que el usuario requiere.
  •       Se puede liberar la memoria.


2. APUNTADORES


Los apuntadores son variables que almacenan direcciones de memoria.




CARACTERÍSTICAS DE LOS APUNTADORES



• PARÁMETROS POR REFERENCIA
• APUNTADOR UNIVERSAL
• OPERADORES PERMITIDOS
• OPERADORES PROHIBIDOS
• APUNTADOR NULO
• PELIGRO
• PRECAUCIÓN



 PARÁMETROS POR REFERENCIA:

en vez de una copia del valor de un parámetro, con apuntadores pasas la dirección del objeto y por lo tanto, la función puede alterar el objeto "externo".






APUNTADOR UNIVERSAL:

(void *) declara un apuntador genérico, i.e. apunta a cualquier tipo de objeto.










OPERADORES PERMITIDOS:

Asignar, sumar con contantes, restar, comparar, convertir y manejo de bits.




OPERADORES PROHIBIDOS: 

multiplicar, dividir y sumar dos o más apuntadores.


APUNTADOR NULO: 

valor reservado, dirección cero, significa "apuntador vacío", definido en <stdlib.h>, i.e.  NULL == (void *)0


PELIGRO: 

Un apuntador puede acceder indirectamente el contenido de un objeto.





PRECAUCIÓN

Todo apuntador debe inicializarse antes de usarse.






APUNTADORES Y SUS BENEFICIOS


1. Generar elementos bajo demanda, i.e. asignación dinámica de memoria
2. Manipular y recorrer grandes espacios de memoria

3. Generar estructuras de datos complejas

4. Parámetros de entrada/salida para funciones, i.e. parámetros por referencia



APUNTADORES Y SUS DIFICULTADES

1. Programación avanzada, caótica y/o complicada
2. Programación más susceptible de errores muy difíciles de depurar
3. Dificultad para leer y comprender código

TABLA DE OPERACIONES BÁSICAS



Ejemplo similitudes y diferencias entre declaraciones





3. OPERADORES Y FUNCIONES DE LA GESTIÓN DINÁMICA DE MEMORIA

INTRODUCCIÓN

La temática relacionada con los operadores y las funciones utilizadas para la gestión dinámica de memoria, trata sobre programas de aplicación a los operadores new y delete propios de C++, al igual que las funciones malloc(), free(), calloc() y realloc().

QUÉ ES UN OPERADOR

Un operador es un símbolo (+, -, *, /, etc) que tiene una función predefinida
 (suma, resta, multiplicación, etc)


TIPOS DE OPERADORES 
Aritméticos
- Relacionales
- Lógicos
- A nivel de bit (bitwise operators)
- Especiales

TIPOS DE OPERADORES 

Aritméticos: Nos permiten, básicamente, hacer cualquier operación aritmética, que necesitemos (ejemplo: suma, resta, multiplicación, etc).

OPERADOR
FUNCIÓN
-
Resta
+
Suma
*
Multiplicación
/
División
·/.
Módulo
--
Decremento
++
Incremento



Relacionales: Al igual que en matemáticas, estos operadores nos permitirán evaluar las relaciones (igualdad, mayor, menor, etc) entre un par de operandos. Los operadores relacionales de los que dispone C++ son:

OPERADOR
FUNCIÓN
> 
Mayor que
>=
Mayor o igual que
< 
Menor que
<=
Menor o igual que
==
Igual
!=
Distinto
El resultado de cualquier evaluación de este tipo, es un valor ``cierto'' (true) o ``falso'' (false). 

vRelacionales:

Al igual que en matemáticas, estos operadores nos permitirán evaluar las relaciones (igualdad, mayor, menor, etc) entre un par de operandos. Los operadores relacionales de los que dispone C++ son:

OPERADOR
FUNCIÓN
> 
Mayor que
>=
Mayor o igual que
< 
Menor que
<=
Menor o igual que
==
Igual
!=
Distinto
El resultado de cualquier evaluación de este tipo, es un valor ``cierto'' (true) o ``falso'' (false). 

Lógicos:

Como operadores lógicos designamos a aquellos operadores que nos permiten ``conectar'' un par de propiedades


OPERADOR
FUNCIÓN
&&
Conjunción (Y)
||
Disyunción (O)
!
Negación

OPERADORES NEW Y DELETE


El lenguaje C++ cuenta con dos operadores pre construidos, ellos son:
New y Delete
Por esta razón no se requiere incluir ninguna librería o archivo de cabecera para utilizarlos.

El operador New: Realiza una labor parecida a la de la función malloc(), asignando un bloque de memoria según sea requerido


OPERADOR DELETE

Este operador libera un bloque de memoria asignada por New en tiempo de ejecución, de manera semejante a como lo hace la función free().

La sintaxis para el uso del operador new es: 

Apuntador = new tipo_de_dato;
Este operador hace una petición al sistema operativo para que se le asigne un espacio en memoria, con el tamaño acorde al tipo de datos, si este espacio está disponible, la operación regresa la dirección real que se otorga, en caso de no haber espacio regresa el valor de NULL (0).


FUNCION DE MALLOC () Y FREE ()

FUNCIÓN MALLOC ():
Es una de las funciones de asignación de memoria propias del
lenguaje de programación C.
Cuando se usa malloc () se pasa la cantidad de bytes de memoria que
se necesita (asigna el numero especifico de bytes).
Malloc () encuentra y reserva un bloque de menoría del tamaño pedido
y regresa la dirección del primer byte del bloque. No hay de qué preocuparse sobre que parte de memoria se usa, ya que esto es manejado automáticamente.
 La función malloc () regresa una dirección, y su tipo de retorno es un apuntador a tipo void.

POR QUE VOID

  Un apuntador a tipo void es compatible con todos los tipos de datos. Como la memoria asignada por malloc () puede ser usada para guardar cualquiera de los tipos de datos de C, es adecuado el tipo de retorno void.

LA FUNCIÓN FREE()
Al igual que malloc(), free() es una función del lenguaje de programación C, utilizado para liberar la memoria asignada por malloc (). Al usar la función free () se debe tener en cuenta la regla de oro explicada en el apartado del operador delete:
"toda la memoria que se reserve durante el programa hay que
liberarla antes de salir del programa“.


Al usar las funciones malloc () y free () se debe incluir el archivo de cabecera o librería STDLIB.H.
Ejemplos de aplicación
Ejemplo 1
Asigna memoria para un arreglo de 50 enteros
Int *numero;
numero = (int* )malloc (50 * sizeof (int));

OTRAS FUNCIONES PARA ASIGNAR FUNCIONES DINÁMICAS

La Funcione Calloc()
A continuación se presentan el prototipo para la definición de la función Calloc().
void *calloc(size_tnmemb, size_tsize);
Cuando se usa la función malloc() la memoria no es inicializada (a cero) o borrada. Si se quiere inicializar la memoria entonces se puede usar la función calloc. La función calloc es computacionalmente un poco más cara pero, ocasionalmente, más conveniente que malloc. 


       Se debe observar también la diferencia de sintaxis entre calloc y malloc, ya que calloc toma el número de elementos deseados (nmemb) y el tamaño del elemento (size), como dos argumentos individuales. 
Por lo tanto para asignar a 100 elementos enteros que estén inicializados a Cero se puede hacer: 
int *ip;
ip = (int *) calloc(100, sizeof(int) );


La Función Realloc( )
Esta función intenta cambiar el tamaño de un bloque de memoria previamente asignado. El nuevo tamaño puede ser más grande o más pequeño. Si el bloque se hace más grande, entonces el contenido anterior permanece sin cambios y la memoria es agregada al final del bloque. Si el tamaño se hace más pequeño entonces el contenido sobrante permanece sin cambios.
El prototipo de definición para la función realloc() es como se presenta a continuación.
void *realloc(void *ptr, size_tsize);

RESUMEN DE LAS FUNCIONES


FUNCIÓN
DESCRIPCCIÓN
MALLOC
Asigna el numero especifico de bytes.
REALLOC
Aumenta o disminuye el tamaño del bloque de memoria especificada. Reasigna si es necesario.
CALLOC
Asigna el numero especificado de bytes y los inicializa a cero (0).
FREE
Libera el bloque de memoria especificada de nuevo al sistema.