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 el 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 funcion, Louis Henri Sullivan E pluribus unum. (Ono compuesto por muchos) Virgilio Oh! volvi6 a llamar ayer, ofreciéndome volver. Williams Shakespeare Ricardo IE Lidémame Ismael Herman Melville Moby Dick Cuando me Hames asi, sonrie (Owen Wister 128 Funciones en C 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 8.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 prevenis errores » Buenas précticas de programacié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 més manejables que el programa original, Esta técnica se denomina divide y venceras. En este capitulo describimos las caracteristicas del lenguaje C que facilitan el disefio, la 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 lo general, las programas en C se escriben combinando nuevas funciones que escribe el programador con funciones “preempacadas” disponibles en la biblioteca estndar 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 caracteres, entrada/salida, y muchas otras operaciones iiiles. 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 Conozca la rea coleceiin de fanciones de a biblioteca extdndar de C Observacién de Ingenieria de software 5.1 Bite “reinventar la rueda”. Cuando sea posible, uilice las lanciones do fa iblioteca estindar de C, on lugar de escribir eras fanciones. Esto puede reducir el tempo de desarrollo de un programa, Tip de portabilidad 5.1 Dilizar fnciones de la bilioteca estindar de 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é, seané 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 podirian 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, as 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 funcién invocada necesita para llevar a cabo su tarea. Una analogia comtin para esto es la forma jerdrquica de administracin. Un jefe (la fancidn que hace la Hamada 0 a llamada a funcidn) le pide a un empleado (la funcin invocada) que realice una tarea y le reporte cuando és- ta haya terminado (figura 5.1). Por ejemplo, una funcién que debe desplegar informacin en la pantalla lama ala funcion trabajadora peinté para realizar la tarea; después, print despliega la informacién y la reporta (6 la devuelve) a la funcién que hace la llamada cuando se lev6 a cabo la tarea. [.a funcién jefe no sabe cémo realiza su tarea la funcidn trabajadora, La funcion 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 jerarquica. 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 matemiéticos co- runes, Aqui utilizamos varias funciones mateméticas 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 funcion y por el paréntesis derecho. Por ejemplo, un programador que quiere calcular ¢ 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 niimero 900..0 es el argumento de la fun- cidn sqrt. La instruccién anterior imprimiré 30.00, La funcién sqrt toma un argumento de tipo double yy devuelve un resultado de tipo doubLe. Todas las funciones matemaé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: trabajadora| [trabajadoraz| [trabajadore3| fecabajadoraé| [trabajadoras| Figura §.1 Rolacian jorérquica entre funciones je y funclones habajadoras. 130 Funciones en Capitulo 5 Tip para prevenir errores 5.1 Cuando uilice las Tunciones matemticas de Ta biblioteca, nclaya el encabezado math por medio de la drectiva de preprocesador #izelucto 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 xy y 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 Funeién Deseripeién Ejomplo sart( x) Ia raz cuadrada de x sqrt ( 900.0 ) 530.0 sart( 9.0) 3.0 exp( x) unctén exponencial e* exp( 1.0 ) e52.716282 exp( 2.0 ) «5 7.389056 log( x) logaritmo natural de x (base «) log( 2.718282 ) 1.0 log( 7.389056 ) es 2.0 logio ( x) logaritmo de x (base 10) 1ogi0( 1.0 } 50.0 Logi0( 10.0) es1.0 1ogi0( 100.0 ) 2.0 fabs( x ) valor absoluto de x fabs( 5.0 )es5.0 fabs( 0.0) es0.0 fabs( 5.0 ) ¢s5.0 ceil( 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 ) s-10.0 Pow( x, y) xcelevada ala potencia y (#) pow( 2, 7) «126.0 Pow( 9, 5) «3.0 fod ( x, ¥ ) residuo de.ycomo un némero mod 13,657, 2.333 ) es1.992 de punto flotante sin( x) seno trigonométrico de x sin( 0.0 )es0.0 (een radianes) cos( x) ccoseno tigono (xen radianes) rico de x c08( 0.0 )es 1.0 tan( x) tangentetrigonométrica de x tan( 0.0 ) 60.0 (een radianes) Figura 6.2 Funciones mateméticas comunes de la biblioteca. Capitulo 5 Funciones en 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 Tiles 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 reutilizacién 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 pronuncia °C sharp"). Por medio de una 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 através de la personalizacion de 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, scang, y pow. Un tercer motivo es el de evita la repeti- idn 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 llamando 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, Esto facilita la abstraccién y promueve la reutilizacin de software Observacién de ingenieria de software 5.4 Sl Siasted no puede clegir un nombre concso que exprese Toque hace Ta uncon expose que su nin Iteate Le scavardomasiadas tareas Por lo general, es mejor didi dca faci en varias funclones ns poquctas §.5 Definicién de funciones Cada programa que presentamos consiste en una funcién Hamada main que a su vez llama 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 +/ include 1 2 3 4 8 int cuadrado( int y ); /* prototipo de 1a funcién #/ ‘6 7 a 9 f+ 1a funcién min conienza la ejecucin del programa */ int min() { 10 int xi /* contador */ u 12 veces el ciclo y calcula e imprime el cuadrado de x */ 13 x 10; xe) ¢ 4 sid“, cuadrado( x) ); /* llamda a la funcion */ 15 } /* 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 do 2.) 182 Funciones en ¢ Capitulo 5 21} /* 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 funcion 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 1 resultado, Este proceso se repite diez veces por medio de la instruccién 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 instruccié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 cuadzado 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 niimero 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 ) ‘ definiciones instueciones ) El nombre-funcidn es cualquier identificador valido. El tipo-valor-retorno es el tipo de dato del resultado que se devuelve ala 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, omitr el tipo de retoro es incorrecto, Juntos, a tipo-valor-retorno, nombre-funcién, y lista-parémetros, se les conoce como encabezada de la funcién Error comin de programacién 5.1 ‘Omutiripo-valor-retorno en una definicin de funclGn es un ervor de sitaxis te prototpo de Ta funcidn especk fica un tipo diferente a ine Capitulo 5 Funciones en 133 Error comin de programacién 5.2 3) (OWvidar devolver un valor desde Ia funesin cuando se supone que se debe retornar alguno, puede provocar erro. LET res iesperades. £1 C estindar establece que el resultado de esta cmisn es inden, __... Error comin de programacién 5.3 BR) estrus cin, on po eta es un error de sintanis 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 de manera explicita un tipo para cada parémetto, 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 ciowbTe x,y. en lugar de hacerlo como cowh Te x LOE coud ie y, podria provocar errores en sus programas. La declaraciin de parémetros como doub.1e x; en reali- dad hard que sea un paraémetro de tipo a: 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 dehnician de ta Fanci, es un exror de sintaxis. Error comtin de programacién 5.6 Define otra vez un pardmetro de funciia como wna variable local deniro de Ta fancidn, es un error de sintaais, Buena practica de programacién 5.4 el ip de cada pardmetro en lista de pardetts. incluso si el pardmetro es del po predeterminad ine Tnchy Buena practica de programacién 5.5 ‘langue no es lncorrecto hacerlo, en la definiciin de Ia funcidn no willce el mismo nombre para Tos aagumentos {que se pasan a una funcidn y para sus pardmetros correspondientes. Esto ayuda a evitar la ambiguedad - a 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 llama 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 fncin dento de otra, un error de sintais Buena practica de programacién 5.6 [Hlegir 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 mds 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 facies de escribir, depurar mantener y modificar A Ta fnclin que Ue un gran niet de parnetos podria walar emasadas aces. Conidae a vidi Facies ms equa paa eliza tres separadas El encabezad de ancl debe cabs pos sola na

También podría gustarte