Page 231

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

4 Estructuras de datos: memoria din´amica

Representaci´ on de pol´ıgonos con un n´ umero arbitrario de v´ ertices Desarrollemos un ejemplo m´ as: un programa que lea los v´ertices de un pol´ıgono y calcule su per´ımetro. Empezaremos por crear un tipo de datos para almacenar los puntos de un pol´ıgono. Nuestro tipo de datos se define as´ı: struct Punto { float x, y; }; struct Poligono { struct Punto * p; int puntos; };

F´ıjate en que un pol´ıgono presenta un n´ umero de puntos inicialmente desconocido, por lo que hemos de recurrir a memoria din´amica. Reservaremos la memoria justa para guardar dichos puntos en el campo p (un puntero a una secuencia de puntos) y el n´ umero de puntos se almacenar´ a en el campo puntos. Aqu´ı tienes una funci´ on que lee un pol´ıgono por teclado y devuelve un registro con el resultado: 1 2 3 4

struct Poligono lee_poligono(void) { int i; struct Poligono pol ;

5

printf ("N´ umero de puntos: "); scanf ("%d", &pol.puntos); pol.p = malloc( pol.puntos * sizeof (struct Punto)); for (i=0; i<pol.puntos; i++) { printf ("Punto %d\n", i); printf ("x: "); scanf ("%f", &pol.p[i].x); printf ("y: "); scanf ("%f", &pol.p[i].y); } return pol ;

6 7 8 9 10 11 12 13 14

}

Es interesante la forma en que solicitamos memoria para el vector de puntos: pol.p = malloc( pol.puntos * sizeof (struct Punto));

Solicitamos memoria para pol.puntos celdas, cada una con capacidad para un dato de tipo struct Punto (es decir, ocupando sizeof (struct Punto) bytes). Nos vendr´ a bien una funci´ on que libere la memoria solicitada para almacenar un pol´ıgono, ya que, de paso, pondremos el valor correcto en el campo puntos: 1 2 3 4 5 6

void libera_poligono(struct Poligono * pol ) { free (pol ->p); pol ->p = NULL; pol ->puntos = 0; }

Vamos ahora a definir una funci´ on que calcula el per´ımetro de un pol´ıgono: 1 2 3 4

float perimetro_poligono(struct Poligono pol ) { int i; float perim = 0.0;

5

for (i=1; i<pol.puntos; i++) perim += sqrt( (pol.p[i].x - pol.p[i-1].x) * (pol.p[i].x - pol.p[i-1].x) + (pol.p[i].y - pol.p[i-1].y) * (pol.p[i].y - pol.p[i-1].y) ); perim += sqrt( (pol.p[pol.puntos-1].x - pol.p[0].x) * (pol.p[pol.puntos-1].x - pol.p[0].x) + (pol.p[pol.puntos-1].y - pol.p[0].y) * (pol.p[pol.puntos-1].y - pol.p[0].y) ); return perim;

6 7 8 9 10 11 12

}

Introducci´ on a la Programaci´ on con C

225

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement