Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Tema 2: Lenguajes de Programación de Sistemas: C SSOO - Curso 2005/06 E. Domínguez C. Villarrubia Departamento de Tecnologías y Sistemas de Información Escuela Superior de Informática Universidad de Castilla - La Mancha Noviembre de 2005 E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Índice 1 Estructuras. Declaración Declaraciones typedef 2 Operaciones con Estructuras Estructuras Autorreferenciadas 3 Uniones y Enumeraciones. Declaración E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Tema 2: Lenguajes de Programación de Sistemas: C Sesión 6: Estructuras, Enumeraciones y Uniones E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Resumen de Contenidos de la Sesión Anterior En la sesión anterior hemos visto Declaraciones de punteros Operaciones con punteros Ejemplos de uso de los punteros Paso de argumentos a la función main E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Declaraciones typedef Estructuras. Declaración Definición En C se llaman estructuras los objetos de datos cuyo tipo está definido por el programador en función de tipos de datos primitivos o compuestos definidos previamente Declaración 1 3 5 struct [ < etiqueta >] { <tipo1 > miembro1 ; <tipo2 > miembro2 ; ... }[ < lista_de_identificadores > ] ; E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Declaraciones typedef Estructuras. Declaración (cont.) Ejemplo de declaración 1 3 5 struct registroNomina { long DNI ; char nombre [ 2 5 6 ] ; double sueldo ; } nominaPepe , nominaJuan ; E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Declaraciones typedef Estructuras. Declaración (cont.) Si se ha usado una etiqueta al definir la estructura, pueden hacerse declaraciones de variables del tipo de la estructura posteriormente Ejemplo 1 struct registroNomina nomPedro , nomMercedes ; Lo habitual es asignar una etiqueta al tipo de estructura y no declarar variables en el momento de definir el tipo sino dejar vacía la lista_de_identificadores (el punto y coma final es obligatorio) Así, la definición de tipo puede figurar en una cabecera e incluirse donde se necesite, mientras las declaraciones de variables se hacen en los archivos de implementación para disminuir el riesgo de declaraciones repetidas E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Declaraciones typedef Declaraciones typedef En C se pueden crear sinónimos de un nombre de tipo válido mediante una declaración typedef De esa manera se puede evitar escribir repetidamente declaradores de tipo complicados La forma general de la declaración es 1 typedef < t i p o > < i d e n t i f i c a d o r >; Ejemplo 1 typedef s t r u c t r e g i s t r o N o m i n a nomina ; typedef puede usarse con cualquier tipo definido previamente o primitivo, no sólo con las estructuras Es habitual que, en el caso de las estructuras, el nuevo nombre del tipo coincida con la etiqueta de la estructura E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Operaciones con Estructuras Las variables de tipo estructura pueden figurar en las expresiones de asignación puras. Ejemplo: 1 nominaPepe = nominaJuan ; Las estructuras pueden pasarse como argumentos a las funciones, igual que cualquier dato de tipo primitivo Las estructuras pueden ser devueltas como resultado de las funciones El valor de un miembro de una estructura puede ser obtenido usando el operador punto de forma análoga a como se hace en Java. Ejemplo: 1 nominaPepe . sueldo E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Operaciones con Estructuras (cont.) Si se dispone de un puntero a una estructura, se puede obtener el valor de un miembro mediante el operador flecha. Ejemplo: 1 pnominaPepe −> sueldo Los operadores . y -> se incluyen en el primer grupo de prioridad, y asocian de izquierda a derecha E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Distancia entre dos Puntos 1 3 struct point { int x ; int y ; }; 5 typedef s t r u c t p o i n t point ; 7 double s q r t ( double ) ; 9 11 13 double d i s t ( p o i n t pt1 , p o i n t p t 2 ) { r e t u r n s q r t ( ( double ) ( p t 2 . x−p t 1 . x ) ∗ ( p t 2 . x−p t 1 . x )+ ( double ) ( p t 2 . y−p t 1 . y ) ∗ ( p t 2 . y−p t 1 . y ) ) ; } E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Forma Canónica de un Rectángulo 2 4 struct point { int x ; int y ; }; typedef s t r u c t p o i n t point ; 6 8 10 struct rect { p o i n t pt1 ; p o i n t pt2 ; }; typedef s t r u c t r e c t r e c t ; 12 14 # d e f i n e min ( a , b ) ( ( a ) < ( b ) ? ( a ) : ( b ) ) # d e f i n e max ( a , b ) ( ( a ) > ( b ) ? ( a ) : ( b ) ) E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Forma Canónica de un Rectángulo (cont.) 2 r e c t canonRect ( r e c t r ) { r e c t temp ; 4 temp . p t 1 . x temp . p t 1 . y temp . p t 2 . x temp . p t 2 . y 6 8 = = = = min ( r . p t 1 . x , min ( r . p t 1 . y , max ( r . p t 1 . x , max ( r . p t 1 . y , r . pt2 . x ) ; r . pt2 . y ) ; r . pt2 . x ) ; r . pt2 . y ) ; r e t u r n temp ; 10 } E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Estructuras Autorreferenciadas Limitación Una declaración de estructura no puede contener como miembro una estructura con la misma etiqueta ni directa ni indirectamente Definición Una estructura se denomina autorreferenciada cuando en su declaración se usa como miembro directa o indirectamente un puntero a una estructura con la misma etiqueta E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Ordenación de Palabras mediante un Árbol Binario 1 3 #include #include #include #include < s t d i o . h> < c t y p e . h> < s t r i n g . h> < s t d l i b . h> 5 # d e f i n e MAXWORD 100 7 9 11 13 s t r u c t tnode { char ∗word ; / ∗ p a l a b r a ∗ / int count ; / ∗ cuenta ∗ / s t r u c t tnode ∗ l e f t ; / ∗ s u b a r b o l i z q u i e r d o ∗ / s t r u c t tnode ∗ r i g h t ; / ∗ s u b a r b o l derecho ∗ / }; typedef s t r u c t tnode tnode ; E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Árbol Binario (cont.) tnode ∗ a d d t r e e ( tnode ∗ , char ∗ ) ; 2 void t r e e p r i n t ( tnode ∗ ) ; 4 i n t getword ( char ∗ , i n t ) ; 6 char ∗ s t r d u p ( char ∗ ) ; 8 tnode ∗ t a l l o c ( void ) ; E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Árbol Binario (cont.) 1 3 5 / ∗ Cuenta l a f r e c u e n c i a de l a s p a l a b r a s de l a e n t r a d a ∗ / main ( ) { tnode ∗ r o o t ; char word [MAXWORD] ; 7 r o o t = NULL ; 9 while ( getword ( word , MAXWORD) ! = EOF) i f ( i s a l p h a ( word [ 0 ] ) ) r o o t = a d d t r e e ( r o o t , word ) ; 11 treeprint ( root ) ; return 0; 13 15 } E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Árbol Binario (cont.) 1 3 / ∗ a d d t r e e : agrega w a l s u b a r b o l p ∗ / tnode ∗ a d d t r e e ( tnode ∗p , char ∗w) { i n t cond ; 5 7 9 11 i f ( p == NULL ) { / ∗ p a l a b r a nueva ∗ / p = talloc (); p−>word = s t r d u p (w ) ; p−>count = 1 ; p−> l e f t = p−> r i g h t = NULL ; } E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Árbol Binario (cont.) else i f ( ( cond = strcmp (w, p−>word ) ) == 0 ) p−>count ++; / ∗ p a l a b r a r e p e t i d a ∗ / 1 3 else i f ( cond < 0 ) p−> l e f t = a d d t r e e ( p−> l e f t , w ) ; / ∗ a n t e r i o r ∗ / 5 else p−> r i g h t = a d d t r e e ( p−> r i g h t , w ) ; / ∗ p o s t e r i o r ∗ / 7 9 return p ; 11 } E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Árbol Binario (cont.) 1 3 5 / ∗ t a l l o c : crea un nuevo nodo d e l á r b o l ∗ / tnode ∗ t a l l o c ( void ) { r e t u r n ( tnode ∗ ) m a l l o c ( s i z e o f ( tnode ) ) ; } E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Árbol Binario (cont.) 2 4 6 / ∗ s t r d u p : c o p i a l a cadena dada por su argumento en memoria o b t e n i d a por e l l a ∗ / char ∗ s t r d u p ( char ∗s ) { char ∗p ; p = ( char ∗ ) m a l l o c ( s t r l e n ( s ) + 1 ) ; 8 i f ( p ! = NULL ) strcpy (p , s ) ; 10 12 return p ; 14 } E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Árbol Binario (cont.) / ∗ t r e e p r i n t : imprime e l a r b o l p en preorden ∗ / 2 4 6 8 10 void t r e e p r i n t ( tnode ∗p ) { i f ( p ! = NULL ) { t r e e p r i n t ( p−> l e f t ) ; p r i n t f ( " %4d %s\n" , p−>count , p−>word ) ; t r e e p r i n t ( p−> r i g h t ) ; } } E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Estructuras Autorreferenciadas Árbol Binario (cont.) getword El código de la función getword para obtener una palabra de la entrada puede analizarse en la bibliografía de referencia. (Ver bibliografía al final) E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Uniones. Declaración Definición En C se llaman uniones las áreas de datos que pueden almacenar valores de diferentes tipos Declaración 2 4 union [ < e t i q u e t a > ] { <tipo1 > miembro1 ; <tipo2 > miembro2 ; ... }[ < lista_de_identificadores > ] ; E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Uniones. Declaración (cont.) Ejemplo de declaración 1 3 5 union areaComun { long DNI ; char letra ; double sueldo ; } area1 , area2 ; E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Uniones. Utilización El acceso a un miembro se hace con los mismos operadores que en las estructuras Cuando se quiere manejar el valor del área común de una determinada forma, se usa el miembro correspondiente a ese tipo Ejemplo: Si se quiere manejar el área area1 como un valor de tipo double se usará area1.sueldo E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Enumeraciones. Declaración Definición En C se llaman enumeraciones los objetos de datos que pueden almacenar un entero cuyo valor es designado por un nombre Declaración 1 3 5 enum [ < e t i q u e t a > ] { nombre1 [ = v a l o r 1 ] , nombre2 [ = v a l o r 2 ] , ... }; E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Enumeraciones. Declaración (cont.) Ejemplo de declaración 5 enum c o l o r e s { Rojo , Amarillo = 3 , Verde }; 7 enum c o l o r e s 1 3 color1 , color2 ; E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Enumeraciones. Utilización Las variables declaradas de esa manera pueden tomar sólo valores correspondientes a los nombres de la enumeración Los nombres de una enumeración tienen que ser distintos entre sí y distintos de los de las variables que estén en ámbito Los valores asociados a los nombres se asignan empezando por 0 y luego incrementándose consecutivamente, a no ser que se especifiquen valores en la enumeración Los valores de los diferentes nombres en la enumeración no tienen por qué ser diferentes E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Resumen Lecturas Recomendadas Resumen En esta sesión hemos visto Declaración y uso de estructuras Declaración y uso de uniones Declaración y uso de enumeraciones E. Domínguez, C. Villarrubia Tema 2 Puntos Desarrollados en la Sesión Anterior Estructuras. Declaración Operaciones con Estructuras Uniones y Enumeraciones. Declaración Resumen y Lecturas Recomendadas Resumen Lecturas Recomendadas Lecturas Recomendadas Lecturas recomendadas B. W. Kernighan, D. M. Ritchie. El Lenguaje de Programación C. 2a ed. Prentice Hall. 1991. Capítulo 6. E. Domínguez, C. Villarrubia Tema 2