Arturo Vega González a.vega@ugto.mx Division de Ciencias e Ingenierías Universidad de Guanajuato Campus León Sesión 8 Universidad de Guanajuato, DCI, Campus León 1 / 33
Contenido 1 Estructuras de Datos Uniones Typedef Enumeraciones 2 El Preprocesador de C Subcomandos (directivas) Control 3 Introducción a funciones 4 Ejercicios Universidad de Guanajuato, DCI, Campus León 2 / 33
Estructuras de Datos Estructura de Datos Conjunto de N elementos que están agrupados por medio de un único nombre. Pueden ser de distinto tipo Es un tipo definido dentro del programa Los elementos o miembros de la estructura pueden a su vez ser otra estructura Se utiliza la palabra reservada struct para declarar una estructura int char double float otro_tipo... Universidad de Guanajuato, DCI, Campus León 3 / 33
Estructuras de Datos Uniones Uniones Conjunto de N elementos que están agrupados por medio de un único nombre. Pueden ser de distinto tipo Es un tipo definido dentro del programa Los elementos o miembros de la estructura pueden a su vez ser otra union Se utiliza la palabra reservada union para declarar una union Entonces, Cuál es la diferencia entre una estructura y una unión? Universidad de Guanajuato, DCI, Campus León 4 / 33
Estructuras de Datos Uniones Uniones La diferencia entre las dos es que en una estructura, los miembros ocupan diferentes áreas de la memoria, pero en una unión, los miembros ocupan la misma área de memoria. Los miembros pueden ser de distinto tipo El tamaño de una unión es el de su miembro de mayor tamaño Es una variable la cual podría guardar (en momentos diferentes) objetos de diferentes tamaños y tipos Universidad de Guanajuato, DCI, Campus León 5 / 33
Estructuras de Datos Uniones Uniones Cuando dos o más variables comparten la misma memoria, entonces se define una unión. ejemplo: union tom { char ch ; i n t x ; } t ; El código anterior declara una unión que se vería así en memoria. X byte 1 byte 2 ch Universidad de Guanajuato, DCI, Campus León 6 / 33
Estructuras de Datos Uniones Uniones Definición y declaración(1) union { i n t i ; f l o a t f ; } V a r i a b l e U ; variableu es una union de dos miembros (i, f) Universidad de Guanajuato, DCI, Campus León 7 / 33
Estructuras de Datos Uniones Uniones Definición (2) union Nombre { t i p o 1 Campo1 ; t i p o 2 Campo2 ;... tipon CampoN ; } ; Declaración union Nombre VarU ; Universidad de Guanajuato, DCI, Campus León 8 / 33
Estructuras de Datos Uniones Union El acceso es de forma similar a la de una estructura Se realiza indicando nombre de la variable tipo union y el elemento individual separados por un punto. VariableUnion.ElementoUnion Cuando se utilizan apuntadores (pointer), el separador es: > VariableUnion->ElementoUnion El procesamiento de una unión solo se puede hacer elemento por elemento. Recordar que los elementos ocupan la misma área de memoria. Del ejemplo anterior: Como variableu.i y variableu.f ocupan la misma área de memoria, modificar uno modifica el valor del otro, algunas veces de maneras impredecibles. Universidad de Guanajuato, DCI, Campus León 9 / 33
Estructuras de Datos Uniones Uniones Ejemplo union w o r d b y t e / Se d e c l a r a l a u n i o n w o r d b y t e / { unsigned s h o r t word ; / 2 b y t e s / unsigned char b y t e [ 2 ] ; / 2 b y t e s / } ; / E l tamaño de l a u n i o n e s de dos b y t e s / union w o r d b y t e wb ; / Se d e c l a r a una v a r i a b l e t i p o u n i o n / wb. word = 0 x 0 f 0 a ; / Se a s i g n a un v a l o r a e s t a v a r i a b l e / / Por medio d e l o t r o miembro s e a c c e s a e l v a l o r a s i g n a d o / p r i n t f ( b y t e b a j o : %d\n, wb. b y t e [ 0 ] ) ; / 10 / p r i n t f ( b y t e a l t o : %d\n, wb. b y t e [ 1 ] ) ; / 15 / Universidad de Guanajuato, DCI, Campus León 10 / 33
Estructuras de Datos Typedef Typedef: Nuevos tipos de datos Se puede dar un nombre nuevo a cualquier tipo de datos mediante typedef. Es común utilizarlo para dar un alias o sinónimo al nombre de la estructura, de esta forma se evita el tener que poner struct NombreEstructura cada vez que se declare una variable. Sintaxis: t y p e d e f s t r u c t {... } NombreEstructura ;... NombreEstructura V a r i a b l e ; Universidad de Guanajuato, DCI, Campus León 11 / 33
Estructuras de Datos Typedef Ejemplo t y p e d e f i n t e n t e r o ; t y p e d e f s t r u c t { char nombre [ 3 0 ] ; char c a l l e [ 4 0 ] ; char c i u d a d [ 2 0 ] ; char e s t a d o [ 3 ] ; unsigned i n t c o d i g o ; } s d i r e c c i o n ; s d i r e c c i o n i n f o d i r e c c i o n ; s d i r e c c i o n Agenda [ 1 0 0 ] ; e n t e r o a, b=3; Universidad de Guanajuato, DCI, Campus León 12 / 33
Estructuras de Datos Enumeraciones Enumeraciones Es un conjunto de constantes enteras con nombre. En su declaración se especifica todos los valores legales que puede tener una variable del tipo enum Se declara de forma similar a la de una estructura: enum nombre enumeracion { l i s t a d e e n u m e r a c i ó n } l i s t a d e v a r i a b l e s ; Los valores de una enumeración se inician con 0 a menos que se indique otro valor, y se incrementan en 1. Los identificadores en una enumeración deben ser únicos. Los nombres de las constantes no pueden ser modificados en el programa. Universidad de Guanajuato, DCI, Campus León 13 / 33
Estructuras de Datos Enumeraciones Ejemplo enum ComunidadDCI { a d m i n i s t r a t i v o, e s t u d i a n t e, p r o f e s o r } ;... enum ComunidadDCI p e r s o n a ; f o r ( i=a d m i n i s t r a t i v o ; i <=p r o f e s o r ; i ++)... p e r s o n a = a d m i n i s t r a t i v o ; i f ( p e r s o n a == e s t u d i a n t e )... enum ComunidadDCI { a d m i n i s t r a t i v o =200, e s t u d i a n t e, p r o f e s o r } ;... enum ComunidadDCI { a d m i n i s t r a t i v o, e s t u d i a n t e =200, p r o f e s o r } ; Universidad de Guanajuato, DCI, Campus León 14 / 33
Estructuras de Datos Enumeraciones Ejercicio Escribir un programa que use el tipo enumeración para mostrar el nombre de un mes, su predecesor y su sucesor. El mes se ingresará desde el teclado dando un número entre 1 y 12. Universidad de Guanajuato, DCI, Campus León 15 / 33
Estructuras de Datos Enumeraciones Solución #i n c l u d e <s t d i o. h> i n t main ( v o i d ) { enum meses {ENE = 1, FEB, MAR, ABR, MAY, JUN, JUL, AGO, SEP, OCT, NOV, DIC } ; enum meses mesesid ; enum meses Contador Meses ; char mesnombre [ ] = {, Enero, F e b r e r o, Marzo, A b r i l, Mayo, J u n i o, J u l i o, Agosto, S e p t i e m b r e, Octubre, Noviembre, D i c i e m b r e } ; i n t CualMes =0; Universidad de Guanajuato, DCI, Campus León 16 / 33
Estructuras de Datos Enumeraciones Solución continuación // D e s p l i e g u e de l o s meses usando enum f o r ( Contador Meses = ENE ; Contador Meses <= DIC ; Contador Meses++) p r i n t f ( %2d%11s \n, Contador Meses, mesnombre [ Contador Meses ] ) ; // s o l i c i t a r un numero para i m p r i m i r e l mes s e l e c c i o n a d o, e l a n t e r i o p r i n t f ( \n I n t r o d u c e un numero de mes (1 12): ) ; s c a n f ( %d, ( i n t )(& mesesid ) ) ; // c a s t // s c a n f ( %d,& CualMes ) ; // o t r a forma usando un e n t e r o // mesesid = CualMes ; // p r i n t f ( \ n E l mes e s : %s \n \n, mesnombre [ mesesid ] ) ; Universidad de Guanajuato, DCI, Campus León 17 / 33
Estructuras de Datos Enumeraciones Solución continuación // D e s p l i e g u e d e l mes a n t e r i o r y s i g u i e n t e usando enum i f ( mesesid >= ENE && mesesid <= DIC ) { f o r ( Contador Meses = ENE ; Contador Meses <= DIC ; Contador Meses++) i f ( Contador Meses == mesesid ) { i f ( mesesid==ene) p r i n t f ( \n E l mes a n t e r i o r e s : %s, mesnombre [ DIC ] ) ; e l s e p r i n t f ( \n E l mes a n t e r i o r e s : %s, mesnombre [ mesesid 1 ] ) ; p r i n t f ( \n E l mes s e l e c c i o n a d o e s : %s, mesnombre [ mesesid ] ) ; i f ( mesesid==dic ) p r i n t f ( \n E l mes s i g u i e n t e e s : %s \n, mesnombre [ ENE ] ) ; e l s e p r i n t f ( \n E l mes s i g u i e n t e e s : %s \n, mesnombre [ mesesid + 1 ] ) } } r e t u r n ( 0 ) ; } Universidad de Guanajuato, DCI, Campus León 18 / 33
El Preprocesador de C Pasos para crear un ejecutable Preprocesador: Compilador: Enlazador: Transforma el programa fuente, convirtiéndolo en otro archivo fuente predigerido. Elimina comentarios, incluye otros archivos y sustituye las definiciones. Convierte el fuente entregado por el preprocesador en un archivo en lenguaje máquina: archivo objeto. Un archivo objeto es código máquina, pero no se puede ejecutar, porque le falta código que se encuentra en otros archivos binarios. El enlazador genera el ejecutable binario, a partir del contenido de los archivos objetos y de las bibliotecas. Programa fuente (código fuente) Preprocesador Compilador Enlazador Programa ejecutable Universidad de Guanajuato, DCI, Campus León 19 / 33
El Preprocesador de C El Preprocesador Preprocesador: Transforma el programa fuente, convirtiéndolo en otro archivo fuente predigerido. Elimina comentarios, incluye otros archivos y sustituye las definiciones. El preprocesador tiene su propio lenguaje Los programas son más fáciles de leer Los programas son más fáciles de modificar Facilita la transferencia a otros arquitecturas Universidad de Guanajuato, DCI, Campus León 20 / 33
El Preprocesador de C Subcomandos (directivas) #include Se utiliza para incluir otro archivo de definiciones o archivo de biblioteca y de esta forma compilar otro archivo. #include <archivo> #include archivo Elemplo #i n c l u d e <s t d i o. h> #i n c l u d e <math. h> #i n c l u d e < l i b r e r i a e s p e c i a l. h> Cuando se indica <archivo> se le dice al compilador que busque donde están los archivos de biblioteca o del sistema. Si se usa la forma archivo entonces el compilador busca en el directorio actual, es decir, donde el programa esta siendo ejecutado. Universidad de Guanajuato, DCI, Campus León 21 / 33
El Preprocesador de C Subcomandos (directivas) #define Se utiliza para definir constantes o una macro. Esta definición es sustituida por el código establecido por el programador. #define acepta argumentos en la definición de macros. #define <Nombre-Cte-Macro> <Nombre-de-Remplazo> Elemplo #d e f i n e Maximo 300 #d e f i n e Minimo 0 #d e f i n e F a l s o 0 #d e f i n e Verdadero 1 #d e f i n e MIN( a, b ) ( a<b )? a : b... f o r ( i=minimo ; i <Maximo ; i ++) p r i n t f ( E l minimo de %d y %d e s %d\n, A [ i ], B [ i ], MIN(A [ i ], B [ i ] ) ) ; Universidad de Guanajuato, DCI, Campus León 22 / 33
El Preprocesador de C Subcomandos (directivas) #if, #ifdef Evalúa una expresión constante entera. Siempre se debe terminar con #endif para delimitar el fin de esta sentencia. Se puede utilizar else ( #elif o #else) Elemplo #d e f i n e Maximo 300 #d e f i n e Minimo 0 #d e f i n e MEX 0 #d e f i n e EUA 1 #d e f i n e GB 2 #d e f i n e PAIS ACTIVO MEX #i f PAIS ACTIVO == MEX char moneda []= p e s o s ; #e l i f PAIS ACTIVO == EUA char moneda []= d o l a r ; #e l s e char moneda []= l i b r a ; #e n d i f Universidad de Guanajuato, DCI, Campus León 23 / 33
El Preprocesador de C Subcomandos (directivas) #if, #ifdef Otro método de compilación condicional es utilizar las clausulas #ifdef y #ifndef. Sintaxis: #i f d e f <nombre macro> <s e c u e n c i a de s e n t e c i a s > #e n d i f #i f n d e f <nombre macro> <s e c u e n c i a de s e n t e c i a s > #e n d i f #undef se utiliza para quitar una definición de una constante o macro que se haya definido previamente. El formato general es: #undef <nombre macro> Universidad de Guanajuato, DCI, Campus León 24 / 33
El Preprocesador de C Control Control del preprocesador Se puede usar el compilador para controlar los valores asignados o definidos en la ĺınea de comandos. Para esto, se usa la opción -Dmacro[=defn], por ejemplo: gcc -DTAMLINEA=80 prog.c -o prog.out Esto es equivalente a: #define TAMLINEA 80 También se puede poner un símbolo sin valor, por ejemplo: gcc -DDEBUG prog.c -o prog.out En donde el valor que se toma es de 1 para esta macro. Universidad de Guanajuato, DCI, Campus León 25 / 33
Introducción a funciones Introducción a funciones en C Una función es un conjunto de instrucciones (declaraciones, definiciones,...), que realizan una tarea especifica. En C, la función main es la que indica donde comienza la ejecución de nuestro programa, es decir es la función principal Funciones vs. Procedimientos Una función regresa un valor Un procedimiento no regresa un valor, pero puede modificar sus argumentos. En C, una función puede o no regresar un valor y puede o no modificar sus argumentos. Universidad de Guanajuato, DCI, Campus León 26 / 33
Introducción a funciones Introducción a funciones en C Recordando el primer programa... #i n c l u d e <s t d i o. h> i n t main ( v o i d ) { p r i n t f ( Programacion b a s i c a. \ n ) ; r e t u r n 0 ; } Podemos escribir una función que realice lo mismo v o i d imprimemensaje ( v o i d ) { p r i n t f ( Programacion b a s i c a. \ n ) ; } Universidad de Guanajuato, DCI, Campus León 27 / 33
Introducción a funciones Introducción a funciones en C La diferencia entre la función imprimemensaje y la función main, esta en la primer linea, la cual indica: Quien puede invocarla El tipo de valor que regresa Su nombre Los argumentos que requiere La selección del nombre de la función es tan relevante como la selección del nombre de las variables. estos tienen que ser relevantes y acorde a su uso, de tal forma que la lectura del programa sea fácil. Universidad de Guanajuato, DCI, Campus León 28 / 33
Introducción a funciones Introducción a funciones en C Escribiendo e invocando una función. Valor de retorno? #i n c l u d e <s t d i o. h> v o i d imprimemensaje ( v o i d ) { p r i n t f ( Programación b á s i c a. \ n ) ; } i n t main ( v o i d ) { imprimemensaje ( ) ; r e t u r n 0 ; } Universidad de Guanajuato, DCI, Campus León 29 / 33
Introducción a funciones Introducción a funciones en C Más sobre invocación de las funciones #i n c l u d e <s t d i o. h> v o i d imprimemensaje ( v o i d ) { p r i n t f ( Programación b á s i c a. \ n ) ; } i n t main ( v o i d ) { i n t i ; } f o r ( i =1; i <=5; i ++) imprimemensaje ( ) ; r e t u r n 0 ; Universidad de Guanajuato, DCI, Campus León 30 / 33
Introducción a funciones Introducción a funciones en C El formato general de una función en C es: T i p o d a t o q u e r e g r e s a Nombre De La Función ( L i s t a d e A r g u m e n t o s ) { D e c l a r a c i ó n de v a r i a b l e s l o c a l e s Código de l a f u n c i ó n } r e g r e s o de a l g ú n v a l o r de a c u e r d o a l t i p o Universidad de Guanajuato, DCI, Campus León 31 / 33
Introducción a funciones Introducción a funciones en C Ejemplo: // f u n c i ó n que d e v u e l v e e l mínimo de dos números e n t e r o s i n t minimo ( i n t a, i n t b ) { i n t m; // d e c l a r a l a v a r i a b l e m para a l m a c e n ar e l r e s u l t a d o i f ( a<b ) // a s i g n a un v a l o r de a c u e r d o a l o s p a r á m e t r o s m = a ; e l s e m = b ; } r e t u r n (m) ; // r e g r e s a e l v a l o r Universidad de Guanajuato, DCI, Campus León 32 / 33
Ejercicios Ejercicios Objetivo: Entender el uso de las directivas del preprocesador y el uso de las funciones en C Definir una macro min(a,b) para determinar el entero más pequeño. Definir otra macro min3(a,b,c) en términos de min(a,b). Incorporar las macros en un programa demostrativo en donde se pida al usuario tres números y se muestre el más pequeño. Escriba una función que calcule de la distancia euclidiana entre dos puntos e incorpore la función en un programa demostrativo donde se pida al usuario el valor de dos puntos y despliegue la distancia euclidiana. Puede o no usar estructuras. Universidad de Guanajuato, DCI, Campus León 33 / 33