Estructuras en C Felipe Osorio http://www.ies.ucv.cl/fosorio Instituto de Estadı́stica Pontificia Universidad Católica de Valparaı́so Abril 13, 2015 1 / 11 Estructuras en C I Las estructuras permiten agrupar elementos de distinto tipo. I Es un tipo de elemento muy flexible. I Son particularmente útiles cuando se usan asociadas con funciones y punteros. 2 / 11 Definición de una estructura Definición (estructura) struct nombre { declaraciones de variables ; } Por ejemplo, podemos crear una estructura para almacenar fechas: struct int int int } fecha { dia ; mes ; ano ; En este caso, dia, mes y ano son llamados miembros de la estructura. 3 / 11 Ejemplo con estructura “fecha” # include < stdio .h > int main () { struct fecha { /* define estructura ’ fecha ’ */ int dia , mes , ano ; } struct fecha hoy ; /* declara variable ’ hoy ’ */ /* asigna hoy . dia = hoy . mes = hoy . ano = valores a miembros de ’ hoy ’ */ 13; 4; 2015; printf ( " La fecha de hoy es : % i /% i /% i \ n " , hoy . dia , hoy . mes , hoy . ano ); return 0; } 4 / 11 Creando álias: typedef Para crear álias (A.K.A., pseudónimo o nombre asociado) a una variable o estructura es útil usar el comando typedef. Para el ejemplo de la “fecha” podemos considerar: typedef struct { int dia , mes , ano ; } fecha ; Realmente, lo anterior es equivalente a: struct fecha { int dia , mes , ano ; } typedef struct fecha fecha ; 5 / 11 Creando álias: typedef Para crear álias (A.K.A., pseudónimo o nombre asociado) a una variable o estructura es útil usar el comando typedef. Para el ejemplo de la “fecha” podemos considerar: typedef struct { int dia , mes , ano ; } fecha ; Realmente, lo anterior es equivalente a: struct fecha { int dia , mes , ano ; } typedef struct fecha fecha ; 5 / 11 Ejemplo con estructura “fecha”, revisado # include < stdio .h > typedef struct { /* define estructura ’ fecha ’ */ int dia , mes , ano ; } fecha ; int main () { fecha hoy ; /* declara variable ’ hoy ’ como ’ fecha ’ */ /* asigna hoy . dia = hoy . mes = hoy . ano = valores a miembros de ’ hoy ’ */ 13; 4; 2015; printf ( " La fecha de hoy es : % i /% i /% i \ n " , hoy . dia , hoy . mes , hoy . ano ); return 0; } 6 / 11 Inicializando estructuras # include < stdio .h > typedef struct { /* define estructura ’ fecha ’ */ int dia , mes , ano ; } fecha ; int main () { fecha hoy , manana ; /* declara variables ’ hoy ’ y ’ ma~ n ana ’ */ hoy = ( fecha ) {. dia = 13 , . mes = 4 , . ano = 2015}; manana = ( fecha ) { hoy . dia + 1 , hoy . mes , hoy . ano }; /* imprime fechas */ printf ( " La fecha de hoy es : % i /% i /% i \ n " , hoy . dia , hoy . mes , hoy . ano ); printf ( " fecha de manana es : % i /% i /% i \ n " , manana . dia , manana . mes , manana . ano ); return 0; } 7 / 11 Funciones y estructuras Si z ∈ C entonces z puede ser escrito como z = a + ib, con a, b ∈ R y i = digamos √ −1. De este modo, si deseamos sumar dos numeros complejos, x = a + ib, y = c + id, debemos hacer: z = x + y = (a + c) + i(b + d). 8 / 11 Funciones y estructuras # include < stdio .h > typedef struct { /* define estructura ’ complejos ’ */ double real ; double imag ; } complejo ; complejo suma r_comple jo ( complejo x , complejo y ); int main () { complejo x , y , z ; /* declara variables ’x ’, ’y ’ y ’z ’ como complejos */ /* asigna valores a ’x ’ e ’y ’ */ x = ( complejo ) {. real = 1.5 , . imag = 0.8}; y = ( complejo ) {. real = 1.0 , . imag = 1.2}; printf ( " x : % g + i % g \ n " , x . real , x . imag ); printf ( " y : % g + i % g \ n " , y . real , y . imag ); z = sumar_co mplejo (x , y ); printf ( " z : % g + i % g \ n " , z . real , z . imag ); return 0; } complejo suma r_comple jo ( complejo x , complejo y ) { /* suma dos números complejos */ complejo z ; z . real = x . real + y . real ; z . imag = x . imag + y . imag ; return z ; } 9 / 11 Arreglos de estructuras Volviendo al ejemplo de la ‘fecha’. Note que también podemos definir un arreglo de fechas para almacenar, por ejemplo, los cumpleños de quienes están en este curso. Defina: typedef struct { /* define estructura ’ fecha ’ */ int dia , mes , ano ; } fecha ; fecha cumpleanos [15]; /* alumnos + profe */ /* fecha de cumplea~ n os del profe */ cumpleanos [0]. dia = 16; cumpleanos [0]. mes = 7; cumpleanos [0]. ano = 1977; 10 / 11 Más opciones con estructuras... Aunque más generalmente, las estructuras pueden “contener”: I Arreglos. I Otras estructuras. I Punteros. y también se puede definir punteros a estructuras1 . 1 Asista a la próxima clase! 11 / 11