Busqueda

Resultados

jueves, 22 de julio de 2010

Arreglo de Objetos. Un poco de ayuda

Creación de Objetos
Creamos un objeto mediante la siguiente sintaxis:

Objeto a(arg1, arg2); //Creo un objeto Objeto, usando el contructor de argumentos arg1 y arg2
Objeto b; //Creo un objeto Objeto, usando el constructor sin parámetros

En ambos casos, se creo un objeto en memoria estática. Es decir, la memoria asignada para la función o método donde se creo el objeto. Una vez que la función finaliza, el objeto se destruye.

Para crear un objeto en memoria dinámica usamos:


Objeto* a = new Objeto(arg1, arg2);

Objeto* b = new Objeto;

Si queremos crear un arreglo de objetos en memoria dinámica usamos:


Objeto* c = new Objeto[20] //Creo un arreglo de 20 espacios de Objeto.


Cuando definimos un objeto en memoria dinámica, esta memoria queda tomada por el resto de la ejecución del programa hasta que nosotros llamemos al destructor por medio de:

delete a;
delete b;
delete [] c; //Si al crear el objeto usamos [] (Hicimos un arreglo) entonces delete // se debe llamar con []

Debemos tener en cuenta que la memoria estática se obtiene en el momento en que se compila el programa. La memoria dinámica se asigna durante la ejecución. Es decir, podemos pedir la medida justa de memoria de acuerdo a parámetros que se pueden obtener en tiempo de ejecución. A cambio de este beneficio, debemos preocuparnos de liberar la memoria que pedimos. Cada vez que hacemos un new, debemos preocuparnos de hacer delete después. Edemas, en los destructores de la clase debemos preocuparnos de hacer delete en la memoria que hayamos pedido con new dentro del objeto.

un ejemplo de como hacer lo anteriormente descrito

main()
{

... // Aquí deberían estar declaradas algunas o las variables que se necesitan

int dim; //Dimensión del arreglo de objetos

alumno *p; //Crea un puntero a objeto alumno, Se asume que la clase alumno esta implementada
alumno *aux; //Puntero auxiliar tipo alumno (Solo por ejemplo pero no es necesario)

cout << "Cuantos alumnos tiene la clase? ";
cin >> dim; //Para cuantos objetos hay que liberar memoria? // es de ejemplo
cout << "\n";

p = new alumno[dim]; //Asigna memoria dinámicamente

if (p==0) //Si p=0 no hay memoria suficiente
{
cout << "Error no hay suficiente memoria";
return 0; //Sale del programa
};

aux=p; //Asignación de un puntero a otro del mismo tipo

do //estructura do...while
{ //que mantiene en el ciclo principal
cout << " \n";

... // aqui debería estar el menu de opciones

cin >> opcion;

switch (opcion)
{
case 1: (p+numero_objeto) -> ingresar(); //operador flecha en vez de operador punto
numero_objeto++;
break;
case 2: cout <<"\n";
cout <<"Lista de Estudiantes inscritos \n";
for (i=0;i<numero_objeto;i++)
{
cout << "Estudiante numero " << i;
cout << ": ";
(aux+i) -> mostrar_nombre();
cout << "\n";
}
break;
case 3: cout << "Ingrese el número de lista del estudiante a examinar \n";
cin >> n;
cout << "Alumno: ";
(p+n) ->mostrar_nombre();
cout << "\n";
(p+n) -> reporte();
break;
default: return 0; //Sale del programa
}
} while (opcion !=4); //sale del programa

delete [] p; //libera la memoria asignada a *p
}


Ing. Tom Zambrano

"El hombre inteligente no es aquel que lo sabe todo, sino aquel que sabe aplicar lo poco que sabe"
Zilver sTone

"El poder del hombre no radica en su fuerza, sino en el poder de su palabra"










Get news, entertainment and everything you care about at Live.com. Check it out!

martes, 20 de julio de 2010

Cómo convertir un número de base decimal a otra y no morir en el intento con C



Saludos seguidores;

Acá les dejo un sencillo programa realizado en c++ para convertir un numero de base decimal a base binaria, octal o hexadecimal, solo hay que especificar con que base se desea trabajar. Deseo les sirva de orientación y ayuda...

#include <iostream>
#include <string.h>
using namespace std;

void invertir(char origen[], char destino[]){
    int j = strlen(origen)-1;
   
    destino[j+1] = '\0';  //colocar el fin de cadena
    for(int i=j;i>=0;i--){
        //cout<<origen[i];
        destino[j-i] = origen[i];
    }
}

/**
* numero: número decimal a convertir
* base: la base del numero a la cual convertir (2: binaria, 8: octal, 16: hexadecimal
* c[]: el número convertido
**/

void dec2base(int numero, int base, char c[]){
    int resto = 0;
    int n = numero;
    int i = 0;
    char aux[100];
   
    if (base!=2 && base!=8 && base!=16){ //validar que la base sea valida
        cout << "base no valida debe ser 2,8 o 16"<<endl;
        return;
    }
    strcpy(c, "");
    if (n==0){
        strcpy(c,"0");
    } else {
        while (n>0){
            resto = n % base;  //Obtiene el resto de la division entera
            if (resto<10){
                c[i] = '0'+resto; //el ASCII de 0 es 48 y así sucesivamente   
            } else {
                c[i] = '7'+resto; //el ASCII de A es 65 y así sucesivamente
            }
           
            n = n / base;     //división entera y se actualiza el valor de n
            i++;
        }
        c[i] = '\0';   //se coloca el fin de la cadena
        invertir(c,aux); // se invierte la cadena
        strcpy(c,aux); // se asigna aux a c
    }
   
}

int main(){
    char s[100],d[100];
    dec2base(1024,16,d);
    cout<<d;
    return 0;
}



Get news, entertainment and everything you care about at Live.com. Check it out!

miércoles, 14 de julio de 2010

Ejercicios prácticos propuestos

Saludos;


Acá les dejo seis ejercicios prácticos evaluados, de los cuales deben resolver sólo cuatro.


1. Diseña la clase Circulo representado por el radio r con dos método que calculan su perímetro y su área. Implemente la clase junto con sus métodos en una aplicación funcional para obtener dichos valores.

2. Diseñe un calculadora básica la cual tiene como atributos dos operadores x e y de tipo float y como métodos las operaciones matemáticas básicas; suma, resta, multiplicación y división. Implemente la clase junto con sus métodos en un programa funcional para obtener dichos resultados.

3. Desarrolle una clase Fecha representado por el atributo día, el cual es un dato de tipo long y es introducido en el formato AAAA-MM-DD, por ejemplo 31 de diciembre sería 20101231, implemente los métodos para determinar el número de días transcurridos desde el día 1 de enero de ese año, cuál es el día anterior, cuál es el día siguiente.

4. Realizar una aplicación para gestionar cierta información de los empleados de una empresa. El diseño de la aplicación estará formado por dos clases: la clase empleado y la clase empleadoPorHoras (que hereda de empleado), junto con un programa principal que llama a las operaciones públicas de ambas clases. La Clase empleado: contiene como datos privados el nombre del empleado y su número de CI. Además, sus métodos públicos son: un constructor de la clase, dos operaciones obtenedoras (GetNombre y GetCI), y una operación destructora de la clase. La Clase empleadoPorHoras: contiene como datos privados el costo por hora de un empleado y el número de horas trabajadas durante la semana. Además, dispone de los siguientes métodos públicos: un constructor de la clase (que requiere de su clase base el nombre y la CI del empleado) y una operación llamada DevuelvePago (que calcula el pago del empleado multiplicando su costo por hora por el número de horas trabajadas en la semana).

5. Crear una clase base abstracta Vehículo que contenga una función virtual para mostrar los atributos de un objeto en pantalla y dos clases derivadas que deberán concretar la clase anterior: vehiculo_de_tierra y vehiculo_de_aire. La clase base definirá dos atributos: costo y año del vehículo y dos funciones para obtener sus valores. Las clases derivadas vehiculo_de_tierra y vehiculo_de_aire contienen los atributos kilometraje y horas de vuelo respectivamente. Además deberán ofrecer funciones para obtener y establecer esos atributos. Escriba una aplicación funcional que cree objetos de las clases derivadas y un apuntador de clase base que haga uso de la función virtual que se ha concretado en cada una de las clases derivadas.

6. Dada una clase llamada Figuras que tiene dos atributos, identificador que es un arreglo de char de 25 caracteres y area de tipo float. La clase Figuras implementa dos métodos virtuales Calcular_Area(), e Identificar(). Defina dos clases derivadas; Rectangulo y Triangulo donde son redefinidos estos métodos y calculan los valores correspondientes. A continuación la implementación de la clase Figuras:
class Figuras{

protected:

char identificar[25];
float area;

public:
// Definiendo las funciones virtuales en la clase base
virtual void Calcular_Area();
virtual void Identificar();
};
// Cuando se definen las funciones no es necesario utilizar virtual
void Figuras::Calcular_Area(){
}
void Figuras::Identificar(){
cout << "Nombre Figura:" << identificar << endl; cout << "El Area es:" << area << endl;

}

viernes, 25 de junio de 2010

Configurar el NetBeans IDE para C/C++ / Fortran

Saludos estudiantes, seguidores y seguidoras;

Acá les dejo una guia tomada y traducida de la página de netbeans.org en la cual les explica como configurar el netbeans para C/C++ con MinGW.

Deseo realmente les sirva este material. Pues sin más preambulo aqui el enlace a la guia traducida:

http://www.scribd.com/doc/33457512/Configurar-El-NetBeans-IDE-Para-C-C-Fortran

Aprovechen al máximo y no olviden de dejar sus comentarios

martes, 22 de junio de 2010

Proyecto de Paradigma de Programación

Saludos estimados estudiantes;

Acá les dejo el enlace al enunciado del Proyecto de Paradigma de programación

http://www.scribd.com/doc/33416800/Enunciado-Proyecto-Paradigma-Programacion

Así que desde ya a ponerle muchas ganas y empeño.

Por favor no olviden de dejar sus comentarios, éstos son importantes para el crecimiento de este blog, su blog!!!!

viernes, 18 de junio de 2010

sábado, 12 de junio de 2010

Ejercicios prácticos propuestos

Paradigmas de la Programación
Ing. Tom Zambrano
A continuación se proponen tres ejercicios, de los cuales debe resolver dos. Los mismos deben ser entregados en formato físico y digital. Valor diez (10) puntos.
1. Construya una clase llamada Rectángulo que tenga miembros de datos en número de precisión doble llamados largo y ancho. La clase deberá tener una función miembro llamada perimetro() y area() para calcular el perímetro y el área de un rectángulo, una función miembro llamada setDatos() para establecer el largo y el ancho de los rectángulos y una función miembro llamada getDatos() que despliega el largo, ancho, perímetro y área de un rectángulo, así como el constructor correspondiente. Incluya la clase en un programa C++ funcional.

2. Construya una clase llamada Tiempo que tenga miembro de datos en número entero llamados segundos, minutos y horas. Construya la sección de implementación de clase para el constructor y los miembros de la funciones setTiempo() y getTiempo() correspondientes a la declaración. Incluya la clase en un programa C++ funcional.

3. Agregue una función miembro a la definición de clase Fecha que determine el día de la semana para cualquier objeto fecha. Emplee un algoritmo que se ajuste a la necesidad. Incorpore la definición de clase en un programa C++ funcional. La función main() deberá desplegar el nombre del día de la semana (Sab, Dom, Lun, Mar, etc.) para el objeto fecha que se esté probando.

viernes, 4 de junio de 2010

esperar pulsado de tecla en C

Saludos seguidores;

éste es un artículo enviado por Leonardo Mosquera de una lista de correo de programación (Programacion@listas.fi.uba.ar) el cual se tomo textualmente y respetando los creditos, deseo les sirva de ayuda a ustedes programadores:

On 9/11/07, Andorogynus ! <[EMAIL PROTECTED]> wrote:
>
> Como puedo hacer en C para simular un INKEY$ (que viejo !)
> Es decir, efectuar una pausa hasta que el tipo presione una tecla.
>
> Probe con getchar() pero no me permite abortar (Ctrl-C) el programa.
>

A continuacion te adjunto una contribucion que hizo alguien a la lista de mi
universidad una vez. Podes recortar todo lo que no sea getch() y su soporte.
Tene en cuenta la licencia, o al menos no copies/pegues sino que
"inspirate".

Nota: tradicionalmente se usa ncurses para eso que queres hacer, pero yo
mismo ya conclui que ncurses es demasiado armatoste si simplemente queres
pausar el programa por la duracion de exactamente 1 tecla.


------------------------------------------------------------------------

/* +++++++++++ conio.h de Porland (versión trucha del Borland :-)
+++++++++++
*
* Autor: Omar Murray (Crux_) Versión: 0.0.2
* Licencia: GPL Fecha: 05/06/07
*
* Esto intenta ser una recopilación de las funciones más utilizadas en
* la librería de Borland para poder generar código y compilar
* utilizando gcc en GNU/Linux, y luego poder correrlo en un entorno
* Borland sin necesidad de modificar el código escrito. Mayormente son
trozos
* de código obtenido de inet y recopilados en una sola librería. La
idea es
* utilizarlo para fines educativos; está en absoluto estado alfa, así
que su
* uso queda a riesgo de quien lo utilice.
*
* CHANGELOG
* v 0.0.1 Se implemente funciones getch() y clrscr().
* v 0.0.2 se agrega función gotoxy(), se ordena código.*/

#include < stdio.h >
#include < termios.h >
#include < unistd.h >
#include < stdlib.h >
#include < string.h >

//******************FUNCION GETCH****************************
int getch( ) {
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}

//******************FUNCION CLRSCR*****************************
void clrscr( ) {
system("clear");
}

//**************** **FUNCION GOTOXY*****************************
int gotoxy(int x, int y) {
char essq[100]; // String variable to hold the escape sequence
char xstr[100]; // Strings to hold the x and y coordinates
char ystr[100]; // Escape sequences must be built with characters

// ** Convert the screen coordinates to strings
sprintf(xstr, "%d", x);
sprintf(ystr, "%d", y);

// ** Build the escape sequence (vertical move)
essq[0] = '\0';
strcat(essq, "\033[");
strcat(essq, ystr);

// ** Described in man terminfo as vpa=\E[%p1%dd
// ** Vertical position absolute
strcat(essq, "d");

// ** Horizontal move
// ** Horizontal position absolute
strcat(essq, "\033[");
strcat(essq, xstr);

// // Described in man terminfo as hpa=\E[%p1%dG
strcat(essq, "G");

// ** Execute the escape sequence
// ** This will move the cursor to x, y
printf("%s", essq);
return 0;
}

_______________________________________________
Lista de correo Programacion.
Programacion@listas.fi.uba.ar
http://listas.fi.uba.ar/mailman/listinfo/programacion

miércoles, 12 de mayo de 2010

Cómo calcular el valor de una resistencia?

Saludos amigos y seguidores;

me preguntaban unos estudiantes como calcular la resistencia según su codificación de colores, aca les dejo un sencillo programa de como se hace:

http://www.scribd.com/doc/31258442


Deseo les sirva de utilidad y que los pueda ayudar....

viernes, 9 de abril de 2010

La solución esta a un click de distancia!!!

saludos estimados estudiantes y seguidores;

Hacia tiempo no dejaba algún post, ya hasta me estaban preguntado el por qué?
pero bueno, la respuesta algunos la conocen!!!!

Sin emabargo, retomaremos este espacio nuevamente para crear un sitio de discución y de construcción de conocimiento

porque recuerden que la solución esta a un click de distancia

jueves, 28 de enero de 2010

Codigo Fuente de Lista Simple Con Cabecera

Tipo Lista Con Cabecera
/***********************************************************/
/* Ejemplo de programa para manejar una: */
/* LISTA SIMPLEMENTE ENLAZADA CON CABECERA, */
/* como Estructura de Datos Dinámica (con punteros). */
/* Incluye: Primitivas de la lista y programa de prueba. */
/* Todo en el mismo fichero. */
/***************************************/
#include
#include
#include

/*Declaración del tipo base de la lista*/
struct element {
long num;
};
/* Tipos de la lista: */
/* Tipo de cada celda de la lista */
struct celda{
struct element elem;
struct celda *sig;
};
/* Tipo lista: Puntero a celda */
typedef struct celda *lista;

/***************************************/
/* Inicializa una lista simplemente enlazada y CON cabecera. */
/* Devuelve -1 en caso de ERROR. */
int Inicializar_lista(lista *list){
if (((*list)=(struct celda *) malloc(sizeof(struct celda))) == NULL)
return -1;
(*list)->sig=NULL;
return 0;
}
/***************************************/
/*Devuelve TRUE si la lista está vacía.*/
int Lista_vacia(lista list){
if (list->sig) return 0;
return 1;
}
/***************************************/
/* Inserta el elemento e en la posición pos de la lista ant. */
/* Si pos<=1 inserta en la primera posición. */
/* Si pos>longitud_lista, inserta en la última posición. */
/* Devuelve -1 si no hay memoria suficiente para la inserción. */
int Insertar_pos (lista ant, struct element e, long pos){
lista p, L=ant->sig;
long i=1;
if ((p=(struct celda *) malloc(sizeof(struct celda))) == NULL)
return -1;
p->elem=e;
while (L && i
ant=L;
L=L->sig;
i++;
}
ant->sig=p; /* Insertar elemento apuntado por p, entre anterior y L */
p->sig=L;
return 0;
}
/***************************************/
/* Inserta el elemento e en la lista ant ordenadamente por */
/* el campo elem.num */
/* Devuelve -1 si no hay memoria suficiente para la inserción. */
int Insertar_orden (lista ant, struct element e){
lista p, L=ant->sig;
unsigned i=1;
if ((p=(struct celda *) malloc(sizeof(struct celda))) == NULL)
return -1;
p->elem=e;
while (L && e.num>L->elem.num){ /* Hallar posición en la que insertar */
ant=L;
L=L->sig;
i++;
}
ant->sig=p; /* Insertar elemento apuntado por p, entre anterior y L */
p->sig=L;
return 0;
}
/***************************************/
/* Borra el elemento en la posición pos de la lista ant. */
/* Si la pos=1 borra el primer elemento. */
/* Devuelve -1 si no existe la posición: */
/* pila vacía, pos<1>long */
int Borrar_elemento(lista ant, long pos){
lista aux, L=ant->sig;
long i=1;
if (Lista_vacia(ant) || pos<1)
return -1; /* Posición NO válida */
while (L && i
ant=L;
L=L->sig;
i++;
}
if (L){
/* Borrar elemento apuntado por L, teniendo un puntero al anterior */
ant->sig=L->sig;
free(L);
return 0;
}
return -1; /* La lista tiene menos de pos elementos */
}
/***************************************/
/* Devuelve la longitud de la lista list (núm. de elementos). */
long Long_lista(lista list){
long i=0;
list=list->sig;
while (list) {
list=list->sig;
i++;
}
return i;
}
/***************************************/
/* Vacía la lista totalmente, dejándola inicializada. */
/* Tras esta operación NO es necesario inicializarla. */
void Vaciar_lista(lista list){
while (Borrar_elemento (list,1) != -1);
}
/***************************************/
/* Destruye la lista totalmente, liberando toda la memoria. */
/* Tras esto ES necesario Inicializar la lista para reusarla. */
void Destruir_lista(lista *list){
Vaciar_lista(*list);
free(*list); /* Liberar la cabecera */
*list=NULL;
}
/***************************************/
/* Devuelve en e, el elemento que está en la posición pos */
/* de la lista list. */
/* Si no existe esa posición, devuelve -1. En otro caso 0. */
int Leer_element (lista list, long pos, struct element *e){
long i=1;
if (Lista_vacia(list) || pos<1)
return -1;
list=list->sig; /* Nos saltamos la cabecera */
while (list && i
list=list->sig;
i++;
}
if (list){
*e=list->elem;
return 0;
}
return -1;
}
/*************************************/
/* Devuelve la posición de la primera ocurrencia del elemento */
/* e en la lista list, a partir de la posición pos (inclusive).*/
/* Esta ocurrencia será considerada por el campo elem.num */
/* Devuelve 0 si no ha sido encontrada. */
/* Con esta función, cambiando pos, podremos encontrar TODAS */
/* las ocurrencias de un elemento en la lista. */
long Posic_lista(lista list, struct element e, long pos){
long i=1;
list=list->sig; /* Saltar cabecera */
while (list && i
list=list->sig;
i++;
}
if (!list) return 0; /* No existe posición pos, luego... */
while (list && e.num!=list->elem.num) { /* Intentar encontrar el
elemento */
list=list->sig;
i++;
}
if (!list) return 0; /* No encontrado */
return i; /* Encontrado en la posición i */
}
/***************************************/
/* Actualiza la posición pos de la lista list con el elemento e*/
/* Devuelve -1 si no existe esa posición. */
int Actualiza_lista(lista list, struct element e, long pos){
long i=1;
if (Lista_vacia(list) || pos<1)>
list=list->sig; /* Saltar cabecera */
while (list && i
list=list->sig;
i++;
}
if (!list) return -1; /* Posición no existe */
list->elem=e; /* Actualización */
return 0;
}
/* FIN de las PRIMITIVAS de la LISTA SIMPLEMENTE ENLAZADA CON CABECERA */
/***************************************/
/* Imprime un elemento e por la Salida estándar. */
void Imprimir_elemento (struct element e){
printf("%li",e.num);
}
/***************************************/
/* Muestra todos los elementos de la lista list por su orden. */
void mostrar_lista(lista list){
struct element e;
unsigned i=1,tama=Long_lista(list);
while (i<=tama) {
printf("\nElemento %u: ",i);
Leer_element(list,i++,&e);
Imprimir_elemento(e);
}
}
/***************************************/
/* Muestra un menu de opciones. */
void menu(void){
puts("\n\t\t***** MENU *****\n");
puts("\tS. Destruir lista y SALIR.");
puts("\t1. Inicializar lista.");
puts("\t2. Insertar por orden.");
puts("\t3. Insertar por posición.");
puts("\t4. Mostrar lista.");
puts("\t5. Borrar elemento.");
puts("\t6. Longitud lista");
puts("\t7. Ver si está vacía.");
puts("\t8. Ver elemento n-ésimo.");
puts("\t9. Posición de un elemento a partir de una dada.");
puts("\t0. Modificar un elemento en una posición.");
printf("\n\tOpcion: ");
}
/***************************************/
void main(){
lista list;
struct element e;
char opcion='x';
long pos;
Inicializar_lista(&list);

while (opcion!='S' && opcion!='s'){
menu();
opcion=getche();
switch (opcion) {
case 's':
case 'S':Destruir_lista(&list);
break;
case '1':Vaciar_lista(list);
break;
case '2':printf("\nDame número: ");
scanf("%li",&(e.num));
if (Insertar_orden(list,e))
puts("\n\aERROR: No existe memoria suficiente.");
break;
case '3':printf("\nDame número: ");
scanf("%li",&(e.num));
printf("\nDame la posición: ");
scanf("%li",&pos);
if (Insertar_pos(list,e,pos))
puts("\n\aERROR: No existe memoria suficiente.");
break;
case '4':printf("\n----------------");
mostrar_lista(list);
puts("\n----------------");
getch();
break;
case '5':printf("\nDame posición a borrar: ");
scanf("%li",&pos);
if (Borrar_elemento(list,pos))
puts("\n\aERROR: No existe esa posición.");
break;
case '6':printf("\n- Longitud: %u.",Long_lista(list));
break;
case '7':if (Lista_vacia(list))
puts("\n- Lista VACIA.");
else puts("\n- Lista NO VACIA.");
break;
case '8':printf("\nDame posición a leer: ");
scanf("%li",&pos);
if (Leer_element(list,pos,&e))
puts("\n\aERROR: No existe esa posición.");
else
printf("\n- Elemento %li: %li.\n",pos,e.num);
break;

case '9':printf("\nDame número para buscar su posición: ");
scanf("%li",&(e.num));
printf("\nDame la posición a partir de la que buscar: ");
scanf("%li",&pos);
if (!(pos=Posic_lista(list,e,pos)))
puts(
"\n\aERROR: No existe ese elemento a partir de esa posición.");
else
printf(
"\n-La primera posición encontrada de ese elemento es: %i",
pos);
break;
case '0':printf("\nDame número para actualizar: ");
scanf("%li",&(e.num));
printf("\nDame la posición a modificar: ");
scanf("%li",&pos);
if (Actualiza_lista(list,e,pos))
puts("\n\aERROR: No existe esa posición. No se ha
modificado.");
break;
}
}
puts("\n\t***** FIN *****");
}

Estructuras de Datos Dinámicas

Son aquellas cuyo tamaño (longitud, número de elementos...) varía en tiempo de ejecución. Las más famosas son: Listas simplemente enlazadas (con y sin cabecera), Listas doblemente enlazadas (con y sin cabecera), Pilas, Colas, Árboles y Grafos.

Las Listas
Las listas son estructuras de datos que son dinámicas, esto significa que adquieren espacio y liberan espacio a medida que se necesita. sin embargo, hay una advertencia. Como regla general siempre hay que tener cuidado al manejar direcciones de espacios de memoria, porque es posible que accedamos a una localidad de memoria de la cual no deseabamos cambiar su contenido.

Las listas son estructuras de datos que son dinámicas, esto significa que adquieren espacio y liberan espacio a medida que se necesita. sin embargo, hay una advertencia. Como regla general siempre hay que tener cuidado al manejar direcciones de espacios de memoria, porque es posible que accedamos a una localidad de memoria de la cual no deseabamos cambiar su contenido.

Una lista es un conjunto de nodos que están relacionados. Cada nodo consta de dos partes:
- una donde se almacena la información,
- otra donde se guarda una referencia al siguiente nodo.

La creación de los nodos es dinámica, es decir, se crean nodos (por tanto se reserva memoria para ellos) según se van necesitando. Estos nodos finalmente estarán relacionados por un puntero que los enlaza. Ventaja: como creamos los nodos según los necesitamos, no necesitamos saber a priori la cantidad de datos que se van a manejar.

Sintaxis de un nodo:
Un nodo es una estructura donde se almacena la información y que además tiene una referencia al siguiente nodo:

struct nodo
{
struct nombre_estructura información;
struct nodo *siguiente;
}


Si cada nodo tiene sólo una referencia al nodo siguiente, se dice que la lista está enlazada de forma simple. Si cada nodo tiene dos referencias, una al nodo siguiente y otra al nodo anterior, se dice que la lista está doblemente enlazada.

/*Lista simple*/
está formado por nodos como el siguiente:
struct nodo_articulo
{
art info_articulo;
struct nodo_articulo *sig;
}

/*Lista doble*/
está formado por nodos como el siguiente:
struct nodo_articulo

{
art info_articulo;
struct nodo_articulo *sig;
struct nodo_articulo *ant;
}

Lista Simple


Lista doblemente enlazada


Además si el puntero del último elemento de la lista apunta al principio de la lista, se dice que la lista es circular. Cuando esto no ocurre, el puntero del último elemento de la lista debe tener el valor NULL. Este valor concreto representa que el puntero no está apuntando a ninguna dirección válida.

Lista Circular



Ejemplo: Supongamos que tenemos una aplicación para un registro de estudiantes. En este caso el ejemplo de nodo corresponde al estudiante que va a contener como subcampos la cédula, el nombre, el apellido, la edad y el. indice académico.

Definimos la estructura estudiante:
struct
estudiante
{
long cedula;
char *nombre;
char *apellido;
int edad;
float ia;
}

/*Definición de nodo en una lista simple*/
struct nodo_estudiante
{
struct estudiante info;
struct nodo_estudiante *sig;
}

/*Definición de nodo en una lista doblemente enlazada*/
struct nodo_estudiante
{
struct estudiante info;
struct nodo_estudiante *sig;
struct nodo_estudiante *ant;
}

Es importante tener siempre un puntero que referencie el principio de la lista, ya que si se pierde esa referencia se pierde el contenido de toda la lista.