Professional Documents
Culture Documents
Omar Andrs Zapata Mesa Grupo de Fenomenologa de Interacciones Fundamentales, (Gfif) Universidad de Antioquia
Qu es una Estructura?
En
la creacin de soluciones para algunos problemas surge la necesidad de agrupar datos de diferente tipo o de manejar datos que seran muy difcil de describir en los tipos de datos primitivos, esta es la situacin en la que debemos aprovecharnos de las caractersticas que hacen al lenguaje C especial, o sea el uso de estructuras uniones y punteros.
estructura contiene varios datos. La forma de definir una estructura es haciendo uso de la palabra clave struct.
struct mystruct { int int_member; double double_member; char string_member[25]; } variable;
"Variable"
es una instancia de "mystruct" y no es necesario ponerla aqu. Se podra omitir de la declaracin de "mystruct" y ms tarde declararla usando: struct mystruct variable;
Ejemplo
#include<stdio.h> #include<string.h> struct Planeta{ char Nombre[20]; double Posicion[3]; double Masa; }; void Print(struct Planeta *p){ printf("Planeta:\n"); printf("Nombre:%s\n",p->Nombre); printf("Posicion: (%.2lf, %.2lf, %.2lf)\n",p->Posicion[0],p->Posicion[1],p->Posicion[2]); printf("Masa: %.2lf \n",p->Masa); } int main(int argc,char *argv[]){ struct Planeta Tierra; strcpy(Tierra.Nombre,"Tierra"); Tierra.Posicion[0]=10e3; Tierra.Posicion[1]=1.2e2; Tierra.Posicion[2]=1.8e4; Tierra.Masa=312e11; Print(&Tierra); }
Punteros a estructuras
Al
igual que la mayora de los tipos de datos en C, las estructuras pueden contener punteros y a su vez ser un puntero. Cuando se accede a un dato de tipo struct que no es punto se accede a travs del opreador punto (Planeta.Nombre), pero cuendo la variable es puntero se accede con el operador (-> Planeta->Nombre ). Ver ejemplo anterior.
estructura anidada es una estructura que a su vez contiene otra estructura como variable, esto es posible ya que la estructura creada por nosotros para a ser un tipo de datos mas en el sistema. Al igual que podemos trabajar con punteros de estructuras, podemos trabajar con arrays de estructuras, esto nos permite tener en una sola variable un conjunto de estructuras.
Ejemplo
#include<stdio.h> #include<string.h> #include<malloc.h> //en mac stdlib.h para funciones de alocacion de memoria enum ParticulaTipo {Electron=1,Proton=2,Neutron}; struct Particula{ int Tipo; int NivelOrbital; }; typedef struct Particula Particula; struct Atomo{ char Nombre[20]; Particula *Particulas; int nroParticulas; }; typedef struct Atomo Atomo; int main(int argc,char *argv[]){ Atomo helio; strcpy(helio.Nombre,"Helio"); Particula electron; Particula neutron; Particula proton; electron.Tipo = Electron; electron.NivelOrbital = 1; neutron.Tipo = Neutron; neutron.NivelOrbital = -1;//no aplica proton.Tipo = Proton; proton.NivelOrbital = -1; helio.Particulas=malloc(sizeof(Particula)*5); helio.Particulas[0]=electron; helio.Particulas[1]=neutron; helio.Particulas[2]=neutron; helio.Particulas[3]=proton; helio.Particulas[4]=proton; helio.nroParticulas = 5; }
Ejercicio
Basados
en el cdigo anterior, y tomando como ayuda el primer ejemplo, hacer una funcin que imprima cualquier tomo en los trminos en los que los definimos.
ya hemos visto en sesiones anteriores las funciones se pueden representar a travs de sus prototipos como punteros, valindonos de esta propiedad, podramos declarar variables de este tipo dentro de una estructura y luego asignarlas para que algunas de las variables internas de los objetos a estructura sean funciones. Veamos el siguiente ejemplo:
Ejemplo
#include<math.h> #include<stdio.h> typedef double (*fun)(double); struct funciones_trigonometricas{ double (*seno)(double); double (*coseno)(double); double (*tangente)(double); }ft = {sin,cos,tan}; //metodo dos struct funciones_trigonometricas_inversas{ fun funciones[3]; }fti = {{asin,acos,atan}}; int main(int argc,char *argv[]){ printf("seno de seno(pi) %lf\n",ft.seno(M_PI)); printf("seno de seno inverso de 0.5 %lf\n",fti.funciones[0](1)); }
Ejercicios
Hacer
una estructura que contenga la informacin del sistema solar incluyendo las lunas de los planetas. Note que la jerarqua sera estructura tipo estrella que contiene planetas y planetas que contienen lunas, eso sera una triple anidacin de estructuras.
Referencias
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Estructu