Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C 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 double int o_ cha Universidad de Guanajuato, DCI, Campus León float r otr o tip ... 3 / 33 Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C Estructuras de Datos Uniones Uniones Cuando dos o más variables comparten la misma memoria, entonces se define una unión. ejemplo: u n i o n tom { c h a r ch ; int 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 Programación Básica Estructuras de Datos y Funciones en C Estructuras de Datos Uniones Uniones Definición y declaración(1) union { int i ; float f ; } VariableU ; variableU es una union de dos miembros (i, f) Universidad de Guanajuato, DCI, Campus León 7 / 33 Programación Básica Estructuras de Datos y Funciones en C Estructuras de Datos Uniones Uniones Definición (2) u n i o n Nombre { t i p o 1 Campo1 ; t i p o 2 Campo2 ; ... t i p o N CampoN ; }; Declaración u n i o n Nombre VarU ; Universidad de Guanajuato, DCI, Campus León 8 / 33 Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C Estructuras de Datos Uniones Uniones Ejemplo u n i o n 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 { u n s i g n e d s h o r t word ; /∗ 2 b y t e s ∗/ unsigned char byte [ 2 ] ; /∗ 2 b y t e s ∗/ }; /∗ E l tamaño de l a u n i o n e s de d o s b y t e s ∗/ ∗/ u n i o n 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 ] ) ; /∗ Universidad de Guanajuato, DCI, Campus León 10 / 33 15 ∗/ Programación Básica Estructuras de Datos y Funciones en C 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: typedef struct { ... } NombreEstructura ; ... NombreEstructura V a r i a b l e ; Universidad de Guanajuato, DCI, Campus León 11 / 33 Programación Básica Estructuras de Datos y Funciones en C Estructuras de Datos Typedef Ejemplo typedef int entero ; typedef struct { c h a r nombre [ 3 0 ] ; char c a l l e [ 4 0 ] ; char ciudad [ 2 0 ] ; char estado [ 3 ] ; unsigned i n t codigo ; } sdireccion ; sdireccion info direccion ; 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 Programación Básica Estructuras de Datos y Funciones en C 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 n o m b r e e n u m e r a c i o n { 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 Programación Básica Estructuras de Datos y Funciones en C 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 ++) ... persona = 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 Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C 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 C o n t a d o r M e s e s ; c h a r ∗ mesNombre [ ] = { ” ” , ” E n e r o ” , ” 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 ” , ” Septiembre ” , ” Octubre ” , ” Noviembre ” , ” Diciembre ” } ; i n t CualMes =0; Universidad de Guanajuato, DCI, Campus León 16 / 33 Programación Básica Estructuras de Datos y Funciones en C Estructuras de Datos Enumeraciones Solución continuación // D e s p l i e g u e de l o s meses u s a n d o enum f o r ( C o n t a d o r M e s e s = ENE ; C o n t a d o r M e s e s <= DIC ; C o n t a d o r M e s e s++) p r i n t f ( ”%2d%11 s \n” , C o n t a d o r M e s e s , mesNombre [ C o n t a d o r M e s e s ] ) ; // s o l i c i t a r un numero p a r a 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 p r i n t f ( ” \n I n t r o d u c e un numero de mes ( 1 − 1 2 ) : ” ) ; s c a n f ( ”%d” , ( i n t ∗)(& mesesID ) ) ; // c a s t anterio // s c a n f (”%d” ,& CualMes ) ; // o t r a f o r m a u s a n d o 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 [ me s e s ID ] ) ; Universidad de Guanajuato, DCI, Campus León 17 / 33 Programación Básica Estructuras de Datos y Funciones en C 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 u s a n d o enum i f ( mese sI D >= ENE && mesesID <= DIC ) { f o r ( C o n t a d o r M e s e s = ENE ; C o n t a d o r M e s e s <= DIC ; C o n t a d o r M e s e s++) i f ( C o n t a d o r M e s e s == 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 ] ) ; else 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 [ me s e s ID ] ) ; 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 ] ) ; else p r i n t f ( ” \n E l mes s i g u i e n t e e s : %s \n” , mesNombre [ m e s e s ID + 1 ] ) } } return (0); } Universidad de Guanajuato, DCI, Campus León 18 / 33 Programación Básica Estructuras de Datos y Funciones en C El Preprocesador de C Pasos para crear un ejecutable Preprocesador: Transforma el programa fuente, convirtiéndolo en otro archivo fuente “predigerido”. Elimina comentarios, incluye otros archivos y sustituye las definiciones. Compilador: Convierte el fuente entregado por el preprocesador en un archivo en lenguaje máquina: archivo objeto. Enlazador: 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. Universidad de Guanajuato, DCI, Campus León 19 / 33 Programa fuente (código fuente) Preprocesador Compilador Enlazador Programa ejecutable Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C 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 Falso 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 Universidad de Guanajuato, DCI, Campus León e s %d\n” , A [ i ] , B [ i ] , MIN(A [ i ] , B [ i ] ) ) ; 22 / 33 Programación Básica Estructuras de Datos y Funciones en C 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 #d e f i n e #d e f i n e #d e f i n e #d e f i n e #d e f i n e Maximo 300 Minimo 0 MEX 0 EUA 1 GB 2 PAIS ACTIVO MEX #i f PAIS ACTIVO == MEX c h a r moneda [ ] = ” p e s o s ” ; #e l i f PAIS ACTIVO == EUA c h a r moneda [ ] = ” d o l a r ” ; #e l s e c h a r moneda [ ] = ” l i b r a ” ; #e n d i f Universidad de Guanajuato, DCI, Campus León 23 / 33 Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C El Preprocesador de C Control Control del preprocesador Se puede usar el compilador para controlar los valores asignados o definidos en la lı́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 Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C 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 ( ” P r o g r a m a c i o n b a s i c a . \ n” ) ; return 0; } Podemos escribir una función que realice lo mismo void imprimeMensaje ( void ) { p r i n t f ( ” P r o g r a m a c i o n b a s i c a . \ n” ) ; } Universidad de Guanajuato, DCI, Campus León 27 / 33 Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C 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> void imprimeMensaje ( void ) { p r i n t f ( ” P r o g r a m a c i ó n b á s i c a . \ n” ) ; } i n t main ( v o i d ) { imprimeMensaje ( ) ; return 0; } Universidad de Guanajuato, DCI, Campus León 29 / 33 Programación Básica Estructuras de Datos y Funciones en C 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> void imprimeMensaje ( void ) { p r i n t f ( ” P r o g r a m a c i ó n b á s i c a . \ n” ) ; } i n t main ( v o i d ) { int i ; f o r ( i =1; i <=5; i ++) imprimeMensaje ( ) ; return 0; } Universidad de Guanajuato, DCI, Campus León 30 / 33 Programación Básica Estructuras de Datos y Funciones en C Introducción a funciones Introducción a funciones en C El formato general de una función en C es: Tipo dato que regresa N o m b r e D e L a F u n c i ó 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 ó d i g o 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 Programación Básica Estructuras de Datos y Funciones en C 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 d o s 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 p a r a a l m a c e n a r e l r e s u l t a d o i f ( a<b ) m = a; else m = 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 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 Programación Básica Estructuras de Datos y Funciones en C 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 Programación Básica Estructuras de Datos y Funciones en C