Tema 2 - Escuela Superior de Informática

Anuncio
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
Descargar