Está en la página 1de 38
Funciones en C Objetivos + Comprender cémo construir programas de manera modular ‘mediante pequefias piezas llamadas funciones. + Presentar al lector las funciones matematicas disponibles en la biblioteca estandar de C. + Crear nuevas funciones. + Comprender e] mecanismo utilizado para pasar informaciGn entre funciones. + Introducir las técnicas de simulacion mediante la generacién de smimeros aleatorios, + Comprender cémo escribir y utilizar funciones que se invocan a si mismas, La forma siempre sigue a la funcién, Louis Henri Sullivan E pluribus unum. (Cho compuesto por muchos) Virgilio Oh! volvi6 a llamar ayer, ofreciéndome volver. William Shakespeare Ricardo IL Lidémame Ismael Herman Melville Moby Dick Cuando me Hames asi, sonrie (Owen Wister 128 Funciones en ¢ Capitulo 5 Plan general 5.1 Introduecién 5.2 Médulos de programas en C 5.3. Funciones mateméticas de la biblioteca 5.4 Funciones 5.5 Definicién de funciones 5.6 Prototipos de funciones 5.7 Encabezados 5.8 Llamada a funciones: Liamada por valor y llamada por referencia 5.9 Generacién de niimeros aleatorios 5.10 Ejemplo: Un juego de azar 5.11 Clases para almacenamiento 5.12. Reglas de alcance 5.13 Recursividad 5.14. Ejemplo sobre cémo utilizar la recursividad: La serie de Fibonacci 5.15 Recursividad versus iteracién Resumen + Terminologia + Errores comunes de programacién + Tips para provenis errores » Buenas précticas de pprogramacién + Tips de rendiniento + Tips de portabilidad + Observaciones de ingenieria de software + Ejercicios de autoevaluacién + Respuestas a los ejercicios de autoevaluacién + Ejercicios §.1 Introduccién a mayoria de los programas de cSmputo que resuelven problemas reales son mucho més grandes que los pro- _gramas que presentamos en el primer capitulo. La experiencia nos ha mostrado que la mejor manera de desa- rrollar y mantener un programa grande es construtlo a partir de piezas pequefias 0 médulos, los cuales son mas manejables que el programa original, Esta técnica se denomina divide y venceras. En este capitulo describimos las caracteristicas del lenguaje C que faciitan el disefio, Ia implementacin, la operacién y el mantenimiento de programas grandes. 5.2 Médulos de programa en C los médulos en C se les llama funciones. Por Io general, las programas en C se escriben combinando nuevas funciones que escribe el programador con funciones “preempacadas” disponibles en la biblioteca estindar de C. Eneste capitulo explicaremos ambos tipos de funciones. La biblioteca estandar de C proporciona una rica co- leccién de funciones para realizar célculos matematicos comunes, manipulacién de cadenas, manipulacion de caracleres, entrada/salida, y muchas otras operaciones iiles. Esto hace que el trabajo de programador sea més facil, debido a que estas funciones proporcionan muchas de las capacidades que los programadores necesita Buena practica de programacién 5.1 Cunozca la rea coleceiin de fanciones de a biblioteca extdndar de C Observacién de Ingenieria de software 5.1 Bite “weinventar Ia rueda”. Cuando sea posible, uilice las lanciones do fa biblioteca estindar de C, on lugar de escribir eras fanciones. Esto puede reducir el tempo de desarrollo de un programa, Tip de portabilidad 5.1 ilar fanciones de Ta bilioteca estindar do C hace que los programs sean mas portables. Capitulo 5 Funciones en 129 Aunque las funciones de la biblioteca estandar téenicamente no son parte del lenguaje C, invariablemente son proporcionadas con los sistemas de C. Las funciones printé, seanf y pow que utilizamos en los capi tulos previos son funciones de la biblioteca estindar. El programador puede escribir funciones para definir tareas especificas que se podtrian utilizar en muchos puntos del programa. A éstas se les lama funciones definidas por el programador. Las instrucciones reales que definen a las funciones se escriben solamente una vez, y estén ocullas a las demés funciones, Las funciones se invocan mediante una Hamada a funcién, la cual especifica el nombre de la funcién y proporciona informacion (como argumentos) que la funci6n invocada necesita para llevar a cabo su tarea. Una analogia comtin para esto es la forma jerdrquica de administracin. Un jefe (la funcidn que hace la Hamada 0 a llamada a funcidn) le pide a un empleado (la funcin invocada) que realice una tarea y le eporte cuando és- ta haya terminado (figura 5.1). Por ejemplo, una funcién que debe desplegar informacién en la pantalla llama ala funcién trabajadora peinté para realizar la tarea; después, print despliega la informacidn y la reporta (6 1a devuelve) ala funcién que hace la llamada cuando se levé a cabo la tarea. [.a funcién jefe no sabe cémo realiza su tarea la funcidn trabajadora, La funci6n trabajadora podria lamar a otras funciones trabajadoras, y el {jefe no se dard cuenta de esto. Muy pronto veremos cémo estos detalles de “ocultamiento” de informacién pro- ‘mueven la buena ingenieria de software. La figura 5.1 muestra a la funcién jefe comunicdndose con varias, funciones trabajadoras de una manera jerérquica. Observe que trabajadorat actia como la funcidn jefe de trabajadorad y trabajadora5. Las relaciones entre funciones pueden ser diferentes de la estructura je- rarquica que mostramos en ia figura 5.3 Funciones matematicas de la biblioteca Las funciones matemsticas de la biblioteca permiten al programador realizar ciertos céleulos mateméticos co- ‘munes. Aqui utilizamos varias funciones matemiticas para introducir el concepto de funciones. Ms adelante, explicaremos muchas de las demas funciones de la biblioteca estandar de C. Pot lo general, las funciones se wtilizan en tn programa escribiendo el nombre de la funciéa seguido por un paréntesis izquierdo y por el argumento (o una lista de argumentos separada por comas) de la funcién y por el paréntesis derecho. Por ejemplo, un programador que quiere calcular e imprimir la raiz.cuadrada de 900 .0 podria escribir print£( "4.26", sart( 900.0) ); Cuando se ejecuta esta instruccién, se Hama a la funcidn sqrt de la biblioteca estandar para que calcule la ratz, cuadrada del nimero contenido entre las paréntesis (900.0). El miimero 900..0 es el argumento de la fun- cidn sqrt. La instruccion anterior imprimiré 30.00, La funcion sqrt toma un argumento de tipo double ¥y devuelve un resultado de tipo doubLe. Todas las funciones mateméticas de la biblioteca devuelven tipos de datos double. Observe que los valores double, como los valores £Loat, se pueden mostrar utilizando el especificador de conversion i: trabajadorat| [trabajadoraz| [trabajadora3| fecabajadoraé| [trabajadoras| Figura §.1_ Rolacian jorérquica entre funciones jefe y funclones habajadoras 130 Funciones en ¢ Capitulo 5 Tip para prevenir errores 5.1 Cuando uilice las Tunciones matemticas de Ia biblioteca, nclaya el encabezado math por medio de la drectiva de preprocesador #inelucto Los argumentos de la funcién pueden ser constantes, variables, o expresiones. Si e: 0, entonces la instruccién 3.0, d=3.0y printf( “#.2£", sqrt( cl +4 *£) ); calcula ¢ imprime la raiz cuadrada de 13.0 + 3.0 * 4.0 = 25.0, asaber, 5.00, En la figura §.2 aparecen algunas funciones matemiticas de la biblioteca de C. En la figura, las variables x yy son de tipo double. 5.4 Funciones Las funciones permiten a los usuarios dividir un programa en médulos. Todas las variables que se definen en tuna funcién son variables locales, es decir, se conocen sélo en la funcién en la que se definen. La mayoria de Funelén Deseripcién Ejomplo sart( x) la raz cuadrada de x sqrt ( 900.0 ) 530.0 sqrt ( 9.0) 3.0 exp( x) ‘unctén exponencial e* exp( 1.0 ) e52.716282 exp( 2.0 ) «5 7.389056 tog( x) logaritmo natural de x (base «) tog( 2.718282 ) 1.0 log( 7.389056 ) es 2.0 logio ( x) logaritmo de x (base 10) 1ogi0( 1.0 ) 50.0 1ogi0( 10.0 ) es1.0 1ogi0( 100.0 ) 2.0 fabs( x ) valor absoluto de x fabs( 5.0 ) 55.0 fabs( 0.0 ) es0.0 fabs( 5.0 ) ¢s5.0 eeil( x) redondea xal entero mis ceil ( 9.2} es10.0 pequefio no menor que x ceil ( -9.8 ) es-9.0 floor( x ) redondea xal entero mis floor ( 9.2) 9.0 grande no mayor que x floor ( 9.8 ) es -10.0 Pow( x, y) xelevada ala potencia y (#) pow( 2, 7) «126.0 Pow( 9, 5) «3.0 fmod ( x, ¥) residuodewycomo un némero mod 13.657, 2.333 ) e51.992 de punto Mlotante sin( x) seno trigonométrico de x sin( 0.0 ) 50.0 (een radianes) cos( x) ccoseno tigono (xen radianes) rico de x c0s( 0.0 )es 1.0 tan( x) tangentetrigonométrica de x tan( 0.0 ) 60.0 (een radianes) Figura §.2 Funciones mateméticas comunes de la biblioteca. Capitulo 5 Funcionesen€ 131 las funciones tiene una lista de pardmetros. Los parimetros proporcionan los medios para transfer informa- cidn entre funciones. Los pardmetros de una funcién también son variables locales de dicha funcién. Observacién de ingenieria de software 5.2 Thales programas que contienen muchas funciones, a menudo main se implementa como un grapo de Hamadas a funciones que realizan el grueso del trabajo del programa Existen muchos motivos para “funcionalizar” un programa, El método de divide y vencerds hace que el desarrollo de programas sea mas manejable. Otro motivo es la reutilizaciGn de software: utilizar funciones exis- tentes como bloques de construccién para creat nuevos programas. La reutilizacién de software es un factor de gran importancia en el movimiento de la programacién orientada a objetos, del que usted aprenderé més cuan- {do expliquemos los lenguajes derivados de C, tales como C++, Java y C# (que se promuncia °C sharp"). Por medio de uma buena nomenclatura y una buena definicién de funciones, los programas pueden crearse a partir de funciones estindares que cumplan con tareas especificas, en lugar de hacerlo a través de la personalizacion de ccédigo. Esta técnica se conoce como abstraccién, Utilizamos la abstraccién cada vez que escribimos programas que incluyen funciones de la biblioteca como print, scanf, y pow. Un tercer motivo es el de evita la repeti- cidn de cédigo en un programa, Empacar el cédigo como una funcién permite que el cédigo se ejecute desde distintas ubicaciones de un programa, simplemente lamando a la funci6n. Observacién de ingenieria de software 5.3 {Cada fimcian debe linitarse a realizar una sola tarea bien defini, y el nombre de Ta funcidn debe expresar de ‘manera clara dicka tarea, sto facilita la abstraccién y promucve la reutilizacin de software Observacién de ingenieria de software 5.4 Sl Sasted no puede clegir un nombre concso que exprese Toque hace Ta uncon expose que su niin iteate LF cavardemasiadas tareas Por lo general, es mejor didi dca faci en varias funclones ns poguctias §.5 Definicién de funciones Cada programa que presentamos consiste en una funcién Hamada main que a su vez lama a funciones de la biblioteca estandar para llevar a cabo sus tareas. Ahora explicaremos la manera en que los programadores es- criben sus propias funciones personalizadas. Considere un programa que utiliza una funcién Hamada euadeade para calcular ¢ imprimir el cuadrado de los enteros entre 1 y 10 (figura 5.3) /* Figura 5.3: fi @05_03. Creaci én y uso de una funcién definida por el usuario 4/ include 1 2 3 4 § int cuadrado( int y ); /* prototipo de 1a funcién +/ ‘6 7 a 9 f+ 1a funcién min conienza la ejecucién del programa */ int min() { 10 int xi /* contador */ u 12 veces el ciclo y calcula e imprime el cuadrado de x */ 13 x 10; xt) { 4 sid“, cuadrado( x) ); /* llamda a la funcion */ 18 } /* fin de for */ 16 7 printf¢ “Wi Ds 18 19 return 0; /* indica terninacion exitosa */ Figura §.3 Uso de una funcién definida por el programador. Parte 1 de 2.) 132 Funciones en C Capitulo 5 21} f= fin de min */ 23° /* definicion de la funci6én cuadrado, devuelve el cuadrado del parametro */ 24 int cuadrado( int y) /* y es una copia del argumento para la funcidn +/ 25 ¢ 26 return y * yi /# devuelve el cuadrado de y comp un int +/ 28 } /+ fin de La funcién cuadrado */ 14 9 16 25 36 49 64 81 100 Figura §.3 Uso de una funcién definida por el programador. Parte 2 de 2.) Buena practica de programacién 5.2 La funcién cuadrado se invoca o se Hama en main, por medio de la instruccién prints (linea 14) Printé( “td ", cuadrado( x) ); /* llamada a la funcién */ La funcién euadeado recibe una copia del valor de «cen el parsimetro y (linea 24). Después, cuadrado calcu lay * y (linea 26). El resultado regresa a la funcion printé en main, en donde se invocé, y print desplicga Lresultado, Este proceso se repite diez veces por medio de la instruccidn de repeticién for. La definicion de la funcién cwadzado muestra que ésta espera un pardmetro entero y- La palabra reser- vada int que precede al nombre de la funcisn (linea 24) indica que cuadrado devuelve un resultado entero, La instruceién return que se encuentra dentro de cuadrado pasa el resultado del célculo de vuelta ala lla- ‘mada de ta funcién, La linea 5 int cuadrado( int y ); /* prototipo de 1a funcién */ es un prototipo de funcién. El int dentro del paréntesis informa al compilador que cuadrado espera recibir un valor entero desde la llamada de la funcién, El int a la izquierda del nombre de la funcién cuadrado in- forma al compilador que la funcién cuadeado devuclve un resultado entero a la Hamada de la funcién. EL ‘compilador toma como referencia al prototipo de la funcién para verificar que las llamadas a cuadrado (linea 14) contengan el tipo correcto de retomo, el ntimero correcto de argumentos, los tipos correctos de argumen- tos, y que los argumentos estén en el orden correcto, En la seccién 5.6, explicaremos con detalle los prototipos de las funciones. EL formato de una definicin de funcién es: ‘ipo-valor-retorno nombre funcicn( lista pardmetros ) ‘ definciones instueciones ) El nombre-funcidn es cualquier identificador valido. El tipo-valor-retorno es el tipo de dato del resultado que se devuelve a la llamada de la funcisn, El tipo-valor-retorno vei indica que una funcién no retorna un valor. El compilador asume que un tipo-valor-retorno no especificado devuelve un in. Sin embargo, omitir el tipo de retoro es incorrecto, Juntos, a tipo-valor-retorno, nombre-funcidn. y lista-parémetros, se les conoce conno encabezado de la funcién Error comin de programacién 5.1 ‘Onutiripo-valor-retorno en una definicin de funciin es un error de sitaxis tel prototpo de Ta funcidn expect fica un tipo diferente a ine Capitulo 5 Funciones en 133 Error comin de programacién 5.2 eal (Olvidar devolver un valor desde Ia funesin cuando se supone que se debe retornar alguno, puede provocar erro. LET res inesperades. £1 C estindar establece que el resultado de este cmisn es inden, __.. Error comin de programacién 5.3 eR) esr arlene ci, on np eta es un error de sintaxis Buena practica de programacién 5.3 “Slempre establezca el po de La lista-pardmetros es una lista separada por comas que especifican los parémetros recibidos por la fun- ign cuando ésta es invocada, Sila funcion no recibe valor alguno, lista-pardmetros es void. Se debe indicar cde manera explicita un tipo para cada parémetro, a menos que el pardmetro sea de tipo int. Si no se especifi- aun tipo, de manera predeterminada se asume el tipo int. Error comtin de programacién 5.4 3) “Especiicar ls pardmetros de la faneiGn del mismo tipo como diowbTe x,y. en lugar de hacerlo como cowh Te x, LAE cious ie y; podria provocar errores en sus programas. La declaraciin de parémetros como doube x, en reali- dad hard que ysea un paraémetro de tipo an ya que ine es el tipo predeterminado Error comiin de programacién 5.5 ‘olocar un punto y coma despus del paréntesis derecho que enclerra Ta lista de pardmeteos de la dehnicin de tna Fanci, es un exror de sintaxis. Error comtin de programacién 5.6 DDefini otra vez un pardmetro de funciin como una variable local deniro de Ta fancidn, es un error de siniaais, Buena practica de programacién 5.4 el ip de cada pardmetro en lista de pardmetrs, incluso sel pardmetro es del po predeterminado ine Tnchy Buena practica de programacién 5.5 “Tlungque no es lncorvecto hacerlo, en la definiciin de Ta funcidn no willce el misnio nombre para Tos aagumentos {que se pasan a una funcién y para sus pardmetros correspondientes. Esto ayuda a evitar la ambiguedad - fa ee Be Be as definiciones e instrucciones que se encuentran dentro de las Haves forman el cuerpo de fa funcién. Al cuerpo de la funcién también se le lama bloque. Las variables pueden declararse en cualquier bloque, y los bbloques pueden anidarse, Una funcidn no puede definirse dentro de otra funcién, bajo ninguna circunstancia, Error comin de programacién 5.7 Definir una inci dento de otra, es un error de sintais Buena practica de programacién 5.6 [Blegir nombres signficatvas de funciones y de pardmetros hace que los programas sean mas legibles,y ayuda a vila el uso excesiva de comentarios Observacién de ingenieria de software 5.5 Tha fancidn no debe ser mis grande que una pagina, Mejor ai, una Tuncidn no debe ser mis grande que Ia mi tad de una pagina. Las funciones pequefas promueven la reutilzaciGn de software. Observacién de ingenieria de software 5.6 el Bal {Tos programas deben escribirse como colecciones de funciones poquetias, Esto hace que los programas sean mas féclles de escribir, depurar mantener y modificar [A Ta fnclin que Ue un gran niet de parnetos podria walar omasadas aces. Conidae of vidi Facies ms equa paa eliza tres separadas El encabezad de ani debe cabs ps sola na 134 Funciones en Capitulo 5 Observacién de ingenietia de software 5.8 El prototipo de una fancién, el encabezado de Te Fanci y Tas Mamadas aTatuncion deben concordar en mero tipo, orden de argumentas y pardmetros, yen el tipo del valor de retorn. ‘xisten tres formas de devolver el control de una funcién invocada al punto en el que se invoc6 a la fun- ‘i6n. Sila funcién no devuelve un resultado, el control simplemente regresa cuando se alcanza la lave derecha de terminacién de la funcién, o cuando se ejecuta la instruceién return; Sila funcién no devuelve un resultado, la instruccién, return expresidn; devuelve el valor de expresién ala llamada de la funcién, ‘Nuestro segundo ejemplo utiliza una funcién definida por el programador llamada maximo, para determi- nar y devolver el mas grande de tres enteros (figura 5.4). Los tres enteros se introducen mediante seang (Ii- nea 15). A continuacién, los enteros se pasan a maxcimo (linea 18), la cual determina el entero més grande. Este valor regresa a main mediante la instruccién return de maximo (linea 39). Bl valor de retoro se imprime en Ia instruceién printé (linea 19). fi g05_04. ¢ el mixin de tres enteros */ incl ude 1 2 3 4 S int mximo( int x, int y, int 2): /# prototipo de 1a funcién +/ 6 7 /* 1a funcién min conienza La ejecucién del program +/ 8 nt min() 9 4 10 int sumrol: /+ primer entero #/ nu int numero2: /* segundo entero */ 12 int nunmero3: f+ vercer entero */ 3 4 print{( “Introduzea tres enteros: * ); 18 seanf( “96%d%d", Siunerol, Snurero2, &mumerod ) 16 7 /* qumerol, nunero2 y numero’ son argument os 18 para la llamada a la funcién mxim */ ” printf( "El oaxin es: 9d¥A”, maxinp( nunerol, numero2, numero) )é 20 21 /* indica terninacién exitosa */ 22 /* fin de min */ f* x, ¥, y 2 son paranetros */ 23 24 25° /* Definicién de 1a funcién muxinp +/ 26 27 int maxino( int x, int y, int 2) 28 { 29 int mx = x J+ asum que x es el myor «/ 30 31 if Cy > mx) (/* si y es mayor que mx, asigna y a mux 4/ 32 mx = yi 33 } f+ fin de if */ 34 Figura §.4 Funcién maximo definida por el programador (Parle 1 de 2) Capitulo 5 Funciones en 135 35 if (2 > mx) (/* siz es myor que max, asigna z a max */ 36 mex = zi 37 } f= fin de if +f 38 39 return maxi /* mux es el valor mis grande */ 40 Al} /* fin de la funcién maxim +/ Introduzca tres enteros! 22 85 TI maximo es: 85 Introduzca tres enteros: 85 22 17 EI maximo es: 85 Introduzea tres enteros: 22 17 85 El maxim es: 85 Figura §.4 Funcién maximo definida por el programador, (Parte 2 de 2) 5.6 Prototipos de funciones ‘Una de las caracteristicas ms importantes de C es el prototipo de la funcién, Esta caracterisica, la cual fue ideada por los desarrolladores de C++, fue tomada a préstamo por el comité del estandar de C. El prototipo de una fun- in le indica al compilador el tipo de dato devuelo por la funcién, el nimero de pardmetros que la funcidn es- pera recibir, los tipos de pardmetros, y el orden en el que se esperan dichos parémetros. El compilador utiliza los prototipos de funciones para validar las lamadas a éstas. Las versiones previas de C no realizaban esta cla- se de verificaciones, por lo que eta posible llamar inadecuadamente a ls funciones sin que el compilador de- tectara los errores. Dichas llamadas podian provocar errores fatales en tiempo de ejecucién o errores no fatales que provocaban errores légicos sutiles, pero dificiles de detectar. Los prototipos de las funciones corrigen esta, deficiencia Buena practica de programacién 5.7 [SR] festa props dnd is ncn pare apna spa ads rind pedo lice la directiva de preprocesador #nc.1ucie para obtener los protatipos de funcién correspondientes a las ‘anciones de Ia biblioteca estandas, a partir de Ios encabezados en las bibliotecas apropiadas o para obtener en- cabezados que contengan prototipos de funciones desarrolladas por usted y/o sus compaferos de grupo. El prototipo de la funcién maxzimo de la figura 5.4 (linea 5) es int maximo( int x, int y, int 2); /* prototipo de 1a funcién */ Este prototipo de funcién establece que maximo toma tres argumentos de tipo int, y devuelve un resultado de tipo int. Observe que el prototipo de la funcién es el mismo que la primera linea de la definicin de la fun- Buena practica de programacién 5.8 ‘En ocasiones, para efectos de documentacidn, Ios nombres de pardmetros se ncluyen en Tos prototipos de Tas fan ciones (ast lo preferimos nosotros). El compilador ignora estos nombres. _. Error comiin de programacién 5.8 A ‘vidar el punt y coma al final del prototipo de a Tuncin es un ervor de stan ~ Una llamada a funcién que no coincide con el prototipo de la funcién provoca un error de sintaxis. Tam- bién se genera un etror si el prototipo de la funcién y la definicién de la funcién no concuerdan. Por ejemplo, sien la figura 5.4 el prototipo de la funcion se escribiera void maximo( int x, int y, int 2); 136 Funciones en © Capitulo 5 <1 compilador generaria un error, debido a que el tipo de retorno void del prototipo de la funcién difiere del tipo de retomo int del encabezado de la funcion tra caracteristica importante de los prototipos de funciones es la coercisn de argumentos, es deci, forzar la conversién de argumentos al tipo apropiado. Por ejemplo, la funcién matematica sq de la biblioteca pue- de llamarse con wn argumento entero incluso si el prototipo de la funcidn en math .h especifica un argumen- to double. y funcionaré correctamente. La instruccién peinte( °4.3£\n", sart( 4) ); cevahia de manera correcta sqz't (4), ¢ imprime el valor 2.000. El prototipo de la funcién provoca que el compilador convierta el valor entero 4 al valor double 4..0 antes de que el valor pase a sqrt. En general, los valores de argumentos que no corresponden de manera precisa con los tipos de pardmetros en el prototipo de la funci6n, se convierten al tipo apropiado antes de que se llame a la funcidn, Estas conversiones pueden provocar resultados incorrectos, sino se siguen las reglas de promocién de C. Las reglas de promocién especi- fican la manera en que los tipos de datos pueden convertise a otros tipos sin perder datos. En nuestro ejemplo de sqrt, un int se convierte de manera automatica a un double sin modificar su valor. Sin embargo, un double que se convierte a int trunca la parte fraccionaria del valor double. Convertir tipos de enteros lar- 205 a tipos de enteros cortos (por ejemplo, de Long a short) puede provocar la modificacién de los valores. Las reglas de promocién se aplican de manera automatica a expresiones que contienen valores de dos 0 :nés tipos de datos (también llamadas expresiones mixtas). El tipo de cada valor en una expresiGn mixta se pro- ‘mueve de manera automitica al tipo més “alto” en la expresién (en realidad, se crea una versién temporal de ‘cada valor y se usa para la expresi6n; los valores originales permanecen sin cambios). La figura 55 lista los ti- pos de datos en orden decreciente con las especificaciones de conversion de tipo para print y scané. Por lo general, convertir valores a tipos mas pequefios provoca la generacién de valores incorrectos. Por lo tanto, un valor sélo se puede convertr explicitamente a un tipo més pequefio, asignando el valor a una variable de tipo més pequeiio, 0 mediante un operador de conversién de tipo, Los valores de los argumentos de tna fun- ‘ign se convierten alos tipos de pardmetros en un prototipo de funcidn, como si se asignaran de manera direc ta a variables de dichos tipos. Si invocamos a nuestra funcidn euadrado, la cual utiliza un parémetto entero (figura 5.3), con un argumento de punto flotante, el argumento se converte @ int (un tipo ms pequeiio) y, en general, cuadrado devolverd un valor incorrecto. Por ejemplo, cuadrado( 4.5 ) devuelve 16,n0 20.25. Error comin de programacién 5.9 Convertir un tipo de dato de mayor nivel en la jorargufa a uno de menor nivel, puede modiicar el valor del dato. ‘Si en un programa no se incluye el prototipo de una funcién, el compilador forma su propio prototipo me- diante la primera ocurrencia de la funci6n; ya sea por medio de la definicién de la funcién o de la llamada a és- ta, De manera predeterminada, el compilador asume que la funcion devuelve un int. y no asume cosa alguna acerca de los argumentos. Por lo tanto, si los argumentos que se pasan a la funcién son incortectos, el compi- lador no detectaré los errores ‘specificacion ‘specificaci6n Tipo de dato de conversién en printé de conversién en scant long double sue sue double a me float a a unsigned Jong int flu flu long int aid fad unsigned int eu a int ed ed short thd thd char te ke Figura 8.5 Jorarquia de promocién de los fipos de datos, Capitulo 5 Funciones en 137 _.. Error comin de programacién 5.10 3) ‘vida el protoipo de una funcién provoca un error de sinaxis sien el programa el po del valor de retorno no TE es ine pla deinen de la fancn aparece despre dela lama aa fancon De To contario. olvidar tn pro totpo de fancién puede provocar erores en empo de eecucdn yun resultado inesperado. Observes Ti protoipo defancién que se coloca fuera dela deniion de cualquier fncion se aplicaa todas Ts Tamas a la fincién que apaecen después del proto de fncin en el archi. Un protoip de fancin que se cloca en Ta {anc se aplica silo alas Hamadas que se hacen en dicha func. 5.7 Encabezados Cada biblioteca estindar tiene un encabezado correspondiente que contiene los prototipos de las funciones de dicha biblioteca y las definiciones de los distntostipos de datos y constantes necesarios para dichas funciones. La figura 5.6 lista en orden alfabstico algunos de los encabezados de la biblioteca esténdar que pueden incluir- se en los programas. En el capitulo 13, El preprocesador de C, explicaremos con més detalle el término “ma- ros" que utilizamos varias veces en la figura 5.6, Eneabezado de la biblioteca. ‘stander Explicacién CContiene macros ¢ informacion para agregar diagnéstlcos y ayudar en la ddepuracién de programas ‘Contiene los prototipos de as funciones que evahian ciertas propiedades de los caracteres,prototipos de funciones para convertr letras de miniscula amayiiscula y viceversa Define macros que Som les para reportar condiciones de error. ‘Contiene los limites del sistema con respecto al tamafio de los niimeros de punto flotant, ‘Contiene los limites del sistema con respecto al tamafio de mimeros entero. ‘Contiene prototipos de funciones e informacion adicional que permate modificar un programa para adecuatlo al “local” en el que se elecuta. La idea de “local” permite alsistema de cémputo manipular diferentes convenciones para expresat datos ‘como fechas, horas, montos en moneda y grandes rimeros alzededor del mundo, Contiene los prototipos de las funciones matemticas de la biblioteca CContiene los prototipos de las funciones que permiten evita la amada de funcién usual y la secuencia de retomo, ‘Contiene prototipos de funciones y macros para manipular varias condiciones aque se pudieran presentar durante la ejecucin del programa Define macros para tratar con una lista de argumentos correspondientes a una funcidn, cayos mimeros y tipos son desconocidos Contiene definiciones comunes de ls tipos uilizados por C para realizar elertos cileulos. ‘Contiene los prototipos de las funciones de entrada/salida de la biblioteca estindar,y la informacién que utiizan. CContiene los prototipos de ls funciones para la conversion de mimeros a texto y-de texto a mimeros, asgnacion de memoria, mimeros aleatorios,y ols unciones de utilidad Contin los prototipos de las funciones para el procesamiento de cadenas.