Page 234

4.1 Vectores din´amicos

56

return 0;

57 58

}

En esta versi´ on hemos optado, siempre que ha sido posible, por el paso de par´ametros por referencia, es decir, por pasar la direcci´on de la variable en lugar de una copia de su contenido. Hay una raz´ on para hacerlo: la eficiencia. Cada dato de tipo struct Poligono esta formado por un puntero (4 bytes) y un entero (4 bytes), as´ı que ocupa 8 bytes. Si pasamos o devolvemos una copia de un struct Poligono, estamos copiando 8 bytes. Si, por contra, pasamos su direcci´on de memoria, s´ olo hay que pasar 4 bytes. En este caso particular no hay una ganancia extraordinaria, pero en otras aplicaciones manejar´ as structs tan grandes que el paso de la direcci´on compensar´a la ligera molestia de la notaci´ on de acceso a campos con el operador ->. Puede que te extra˜ ne el t´ermino const calificando el par´ametro de perimetro_poligono. Su uso es opcional y sirve para indicar que, aunque es posible modificar la informaci´on apuntada por pol , no lo haremos. En realidad suministramos el puntero por cuesti´on de eficiencia, no porque deseemos modificar el contenido. Con esta indicaci´on conseguimos dos efectos: si intent´asemos modificar accidentalmente el contenido, el compilador nos advertir´ıa del error; y, si fuera posible, el compilador efectuar´ıa optimizaciones que no podr´ıa aplicar si la informaci´on apuntada por pol pudiera modificarse en la funci´ on. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . · 225 ¿Funciona esta otra implementaci´on de perimetro_poligono? 1 2 3 4

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

5

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

6 7 8 9 10 11

}

· 226 Dise˜ na una funci´ on que cree un pol´ıgono regular de n lados inscrito en una circunferencia de radio r. Esta figura muestra un pent´agono inscrito en una circunferencia de radio r y las coordenadas de cada uno de sus v´ertices: (r cos(2π/5), r sin(2π/5)) (r cos(2π · 2/5), r sin(2π · 2/5)) r

(r cos(0), r sin(0))

(r cos(2π · 3/5), r sin(2π · 3/5)) (r cos(2π · 4/5), r sin(2π · 4/5))

Utiliza la funci´ on para crear pol´ıgonos regulares de talla 3, 4, 5, 6, . . . inscritos en una circunferencia de radio 1. Calcula a continuaci´on el per´ımetro de los sucesivos pol´ıgonos y comprueba si dicho valor se aproxima a 2π. · 227 Dise˜ na un programa que permita manipular polinomios de cualquier grado. Un polinomio se representar´ a con el siguiente tipo de registro: 1 2 3 4

struct Polinomio { float * p; int grado; };

Como puedes ver, el campo p es un puntero a float, o sea, un vector din´amico de float. Dise˜ na y utiliza funciones que hagan lo siguiente: 228

Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement