5
Programación en C/Uso de funciones 1 Funciones Como vimos anteriormente C tiene como bloque bási- co la función main() , también hemos visto la sentencia printf() que es otra función, y de igual forma hay mu- chas más funciones predefinidas, pero nosotros mismos también podemos definir nuestras propias funciones. De hecho, es fundamental hacerlo. Podemos definir una función cualquiera de la misma ma- nera en que definimos la función main(). Basta con poner su tipo, su nombre, sus argumentos entre paréntesis y lue- go, entre llaves, su código: /* Inclusión de archivos */ #include <stdio.h> void holamundo(void) /* Función donde se ejecuta la ló- gica del programa */ { printf(“Hola Mundo\n”); /* imprime la cadena */ return; /* sale de la función */ } int main(void) /* Función principal del programa */ { holamundo(); /* llamada a la función holamundo */ return 0; /* sale del programa con código 0 (correcto) */ } Este código es en todo equivalente al “Hola Mundo” ori- ginal, sólo que nos muestra cómo escribir y cómo utilizar una función. Y además nos muestra un principio de buena programación: meter las sentencias que “hacen el traba- jo” en otras funciones específicas para sacarlas de main(), dejando en ésta tan sólo un guión general de lo que hace el programa, no las órdenes específicas. De esta mane- ra se facilita la comprensión del programa, y por tanto el futuro trabajo de modificarlo. 1.1 La sentencia return La sentencia return puede utilizarse dentro de una función para terminar su ejecución. En el ejemplo anterior, la función holamundo fue decla- rada con valor de retorno de tipo void (es decir, valor de retorno nulo). En ese caso, la sentencia return no lleva ningún parámetro adicional, ya que la función no debe devolver ningún valor a la función que la llama. En cambio, la función main tiene un valor de retorno de tipo int, por lo que return debe ir seguido de un valor en- tero (0 en el ejemplo). El valor 0 se utiliza para indicar que el programa ha llegado a un punto en el que todo se ha desarrollado correctamente y se utiliza cualquier otro valor para indicar que ha habido algún tipo de error. La instrucción return no es una función, se trata de una sentencia que lo que hace es retornar como valor de la función el valor que se le proporciona como argumento. 1.2 Argumentos Las funciones también pueden recibir argumentos o pará- metros, para modificar su comportamiento. Por ejemplo, la definición de una función para sumar dos números sería de la siguiente manera: 1.3 Declaración y definición En el ejemplo anterior podemos notar que la función su- mar figura en el código antes que main. ¿Qué pasaría si las escribiéramos en distinto orden? #include <stdio.h> int main(void) { int suma = su- mar(5, 3); /* ERROR, sumar no ha sido declarada aún */ printf(“La suma es: %d ", suma); return 0; } int sumar(int numero1, int numero2) { return numero1 + numero2; } En este caso el programa es erróneo y no compila, ya que en la línea donde se llama a la función sumar, el compi- lador aún no conoce ninguna función con ese nombre, y cuáles son sus argumentos y valor de retorno. Una posible solución es declarar el prototipo de la fun- ción al principio, para informar al compilador que existe, y luego definir el cuerpo de la misma en cualquier lugar del programa: #include <stdio.h> /* Declaración */ int sumar(int numero1, int numero2); int main(void) { int suma = sumar(5, 3); printf(“La suma es: %d ", suma); return 0; } /* Definición */ int sumar(int numero1, int numero2) { return numero1 + numero2; } 1.4 Paso de Parámetros Las funciones pueden recibir datos como lo hemos obser- vado, pero existen dos formas de enviar los datos hacia una función por valor y por referencia, las cuales mo- difican en diferente forma el comportamiento de el pro- grama. 1

Programación en C-Uso de funciones

Embed Size (px)

DESCRIPTION

Uso de Funciones, lenguaje C

Citation preview

  • Programacin en C/Uso de funciones

    1 Funciones

    Como vimos anteriormente C tiene como bloque bsi-co la funcin main() , tambin hemos visto la sentenciaprintf() que es otra funcin, y de igual forma hay mu-chas ms funciones predefinidas, pero nosotros mismostambin podemos definir nuestras propias funciones. Dehecho, es fundamental hacerlo.Podemos definir una funcin cualquiera de la misma ma-nera en que definimos la funcin main(). Basta con ponersu tipo, su nombre, sus argumentos entre parntesis y lue-go, entre llaves, su cdigo:/* Inclusin de archivos */ #include voidholamundo(void) /* Funcin donde se ejecuta la l-gica del programa */ { printf(Hola Mundo\n); /*imprime la cadena */ return; /* sale de la funcin */} int main(void) /* Funcin principal del programa */{ holamundo(); /* llamada a la funcin holamundo */return 0; /* sale del programa con cdigo 0 (correcto) */ }

    Este cdigo es en todo equivalente al Hola Mundo ori-ginal, slo que nos muestra cmo escribir y cmo utilizaruna funcin. Y adems nos muestra un principio de buenaprogramacin: meter las sentencias que hacen el traba-jo en otras funciones especficas para sacarlas de main(),dejando en sta tan slo un guin general de lo que haceel programa, no las rdenes especficas. De esta mane-ra se facilita la comprensin del programa, y por tanto elfuturo trabajo de modificarlo.

    1.1 La sentencia return

    La sentencia return puede utilizarse dentro de una funcinpara terminar su ejecucin.En el ejemplo anterior, la funcin holamundo fue decla-rada con valor de retorno de tipo void (es decir, valor deretorno nulo). En ese caso, la sentencia return no llevaningn parmetro adicional, ya que la funcin no debedevolver ningn valor a la funcin que la llama.En cambio, la funcin main tiene un valor de retorno detipo int, por lo que return debe ir seguido de un valor en-tero (0 en el ejemplo). El valor 0 se utiliza para indicarque el programa ha llegado a un punto en el que todo seha desarrollado correctamente y se utiliza cualquier otrovalor para indicar que ha habido algn tipo de error.La instruccin return no es una funcin, se trata de unasentencia que lo que hace es retornar como valor de la

    funcin el valor que se le proporciona como argumento.

    1.2 Argumentos

    Las funciones tambin pueden recibir argumentos o par-metros, para modificar su comportamiento. Por ejemplo,la definicin de una funcin para sumar dos nmeros serade la siguiente manera:

    1.3 Declaracin y definicin

    En el ejemplo anterior podemos notar que la funcin su-mar figura en el cdigo antes que main. Qu pasara silas escribiramos en distinto orden?#include int main(void) { int suma = su-mar(5, 3); /* ERROR, sumar no ha sido declarada an*/ printf(La suma es: %d ", suma); return 0; } intsumar(int numero1, int numero2) { return numero1 +numero2; }

    En este caso el programa es errneo y no compila, ya queen la lnea donde se llama a la funcin sumar, el compi-lador an no conoce ninguna funcin con ese nombre, ycules son sus argumentos y valor de retorno.Una posible solucin es declarar el prototipo de la fun-cin al principio, para informar al compilador que existe,y luego definir el cuerpo de la misma en cualquier lugardel programa:#include /* Declaracin */ int sumar(intnumero1, int numero2); int main(void) { int suma =sumar(5, 3); printf(La suma es: %d ", suma); return 0;} /* Definicin */ int sumar(int numero1, int numero2){ return numero1 + numero2; }

    1.4 Paso de Parmetros

    Las funciones pueden recibir datos como lo hemos obser-vado, pero existen dos formas de enviar los datos haciauna funcin por valor y por referencia, las cuales mo-difican en diferente forma el comportamiento de el pro-grama.

    1

    https://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Primer_programa_en_C#Diseccionando_el_%2522Hola_Mundo%2522

  • 2 2 FUNCIONES RECURSIVAS

    1.4.1 Por Valor

    El paso por valor enva una copia de los parmetros ala funcin por lo tanto los cambios que se hagan en ellano son tomados en cuenta dentro de la funcin main().Ejemplo:/* * por_valor.c * * Julio Csar Brizuela 2009 * * para el wikilibroProgramacin en C * bajo licencia FDL, adaptadodel Dominio Pblico */ #include void su-mar_valor(int numero); /* prototipo de la funcin */int main(void) { int numero = 57; /* definimos numerocon valor de 57*/ sumar_valor(numero); /* enviamosnumero a la funcin */ printf(Valor de numero dentrode main() es: %d\n, numero); /* podemos notar queel valor de numero se modifica * slo dentro de lafuncin sumar_valor pero en la principal * nmero siguevaliendo 57 */ return 0; } void sumar_valor(int numero){ numero++; /* le sumamos 1 al numero */ /* el valor denmero recibido se aumenta en 1 * y se modifica dentrode la funcin sumar_valor() */ printf(Valor de numerodentro sumar_valor() es: %d\n, numero); return; }

    1.4.2 Por Referencia

    El paso por referencia se hace utilizando apuntadores. Seenva la direccin de memoria de la variable, por lo tantolos cambios que haga la funcin si afectan el valor de lavariable. Ejemplo:/* * por_referencia.c * * Julio Csar Brizuela 2009 * * para el wikilibroProgramacin en C * bajo licencia FDL, adaptadodel Dominio Pblico */ #include void su-mar_referencia(int *numero); /* prototipo de la funcin*/ int main(void) { int numero = 57; /* definimosnumero con valor de 57*/ sumar_referencia(&numero);/* enviamos numero a la funcin */ printf("\nValor denumero dentro de main() es: %d ", numero); /* podemosnotar que el valor de numero se modifica * y que ahoradentro de main() tambin se ha modificado * aunque lafuncin no haya retornado ningn valor. */ return 0; }void sumar_referencia(int *numero) { *numero += 1; /*le sumamos 1 al numero */ /* el valor de numero recibidose aumenta en 1 * y se modifica dentro de la funcin */printf("\nValor de numero dentro sumar_referencia() es:%d, *numero); return; }

    1.5 Variables Locales y Globales

    Adems de pasar valores a una funcin, tambin se pue-den declarar tipos de datos dentro de las funciones, estostipos de datos declarados dentro de una funcin solo sonaccesibles dentro de esta misma funcin y se les conocencomo variables locales, as pues podemos definir los mis-

    mos nombres de variables en diferentes funciones, ya queestas variables solo son accesibles dentro de esas funcio-nes. Ejemplo:/* * locales.c * * Julio Csar Brizuela 2009 * * para el wikilibroProgramacin en C * bajo licencia FDL, adaptado delDominio Pblico */ #include void funcion1(){ int dato = 53; /* definimos dato en 53*/ char num1 ='a'; /* num1 vale a */ /* imprimimos */ printf(Funcion1,dato=%d, num1=%c\n, dato, num1); return; } voidfuncion2() { int dato = 25; /* definimos dato en 25*/char num2 = 'z'; /* num2 vale z*/ /* imprimimos */printf(Funcion2, dato=%d, num2=%c\n, dato, num2);return; } int main(void) { funcion1(); /* llamamos afuncion1() */ funcion2(); /* llamamos a funcion2() */return 0; }

    En este caso la variable dato, esta definida dentro de ca-da una de las funciones y son totalmente distinta una deotra y no se puede utilizar fuera de esta, as pues num2no puede ser utilizada por la funcion1() y num1 tampocopuede ser utilizada por funcion2().Existen pues variables que se definen fuera de la funcinprincipal main() y fuera de cualquier otra funcin creadapor nosotros, estas variables se les conoce con el nombrede Variables Globales ya que se pueden utilizar dentro demain() y dentro de cualquier funcin creada por nosotros.Ejemplo:/* * global.c * * Julio Csar Brizuela 2009 * * para el wikilibro Programa-cin en C * bajo licencia FDL, adaptado del DominioPblico */ #include int variable_global = 99;/* inicializamos la variable global */ void funcion(); intmain(void) { /* imprimimos el valor*/ printf(main(),acceso a variable_global %d\n, variable_global); /*llamamos a la funcin */ funcion(); return 0; } voidfuncion() { /* imprimimos el valor*/ printf(funcion(),acceso a variable_global %d\n, variable_global); return;}

    2 Funciones Recursivas

    La recursividad (recursin) es la propiedad por la cual unafuncin se llama a s misma directa o indirectamente.La recursin indirecta implica utilizar ms de una fun-cin.Se puede considerar la recursividad como una alternativaa la iteracin. La recursin permite especificar solucionesnaturales, sencillas, que seran, en caso contrario, difci-les de resolver. Toda funcin recursiva debe contemplarun caso base o condicin de salida, para terminar, o larecursividad no podr terminar nunca.Una funcin recursiva podra definirse as:

  • 2.1 Recursividad indirecta o recursin mutua 3

    funcion_recursiva( /* parmetros recibidos por la fun-cin */ ) { /* Cdigo */ funcion_recursiva( ); /* llamadaa la funcin misma */ /* Cdigo */ }

    Uno de los ejemplos ms representativos en la recursivi-dad es el factorial de un numero ( n! ):

    n! =n

    k=1

    k n N

    la definicin de recursividad del factorial es:

    n! =

    {1 Si n = 0n(n 1)! Si n > 0

    n N.

    En esta definicin, n = 0, es nuestro caso base, que le dafin a la recursividad.Entonces nuestro programa que calcula el factorial es:/* *factorial.c * * Julio Csar Brizuela 2009 * * para el wikilibroProgramacin en C * bajo licencia FDL, adaptado delDominio Pblico */ #include long factorial(intn) { if (n == 0) /* caso base */ return 1; /* como 0! = 1,se retorna 1*/ else return n * factorial (n - 1); /* llamadaa esta misma funcin */ } int main(void) { /* en estecaso se llama a la funcin y se imprime directamente*/printf("%ld ", factorial(5)); return 0; }

    Tambin existen otros tipos de funciones recursivas comolo es el producto de dos nmeros. El producto de a b,donde a y b son nmeros enteros positivos seria:Solucin iterativa:

    a b =a+ a+ + a

    b veces=

    bi=1 a

    Solucin recursiva:

    a b =

    {0 Si b = 0a+ a (b 1) Si b > 0

    As pues 7 3 es:

    73 = 7+72 = 7+7+71 = 7+7+7+0 = 21

    Podemos ver que la multiplicacin de dos nmeros a, b sepuede transformar en otro problema ms pequeo multi-plicar a por (b-1), el caso base se produce cuando b = 0y el producto es 0. Ejemplo:/* * producto.c * * Julio Csar Brizuela 2009 * * para el wikilibroProgramacin en C * bajo licencia FDL, adaptado delDominio Pblico */ #include int producto(inta, int b) { if (b == 0) /* caso base */ return 0; /* comob = 0, se retorna 0*/ else return a + producto (a, b -

    1); /* llamada a esta misma funcin */ } int main(void){ /* en este caso se llama a la funcin y se imprimedirectamente*/ printf("%i ", producto( 7, 3)); return 0; }

    2.1 Recursividad indirecta o recursinmutua

    Esta se produce cuando una funcin llama a otra, que estaa su vez terminar llamando de nuevo a la primera fun-cin. El siguiente programa visualiza el alfabeto utilizan-do recursin indirecta o mutua:/* * elalfabeto.c * * Julio Csar Brizuela 2009 * * para el wikilibroProgramacin en C * bajo licencia FDL, adaptadodel Dominio Pblico */ #include void fun-cionA(char c); /* se declara el prototipo de la funcinpara que el llamado */ void funcionB(char c); /* a lamisma en la funcin no sea implcita */ int main(void){ funcionA('z'); /* llamado a funcionA */ return 0; }void funcionA(char c) { if (c > 'a') /* caso base mientrasc no sea menor que A */ funcionB(c); /* llamado a lafuncionB */ printf("%c ", c); /* imprimimos el valorde c */ *la variable es un parametro no utilizado paraeste proceso } void funcionB(char c) { funcionA(--c); /*llamado a la funcionA decrementando el valor de 'z' */ }

    2.2 Recursin versus Iteracin

    Tanto la iteracin como la recursin se basan en estructu-ra de control: la iteracin utiliza una estructura repetitivay la recursin una estructura de seleccin. La iteracinutiliza explcitamente una estructura repetitiva mientrasque la recursin consigue la repeticin mediante llamadasrepetitivas a funciones.La iteracin termina si la condicin del bucle no se cum-ple, mientras que la recursin termina cuando se reconoceun caso base.La recursin puede presentar desventajas ante la iteracinya que se invoca repetidas veces al mecanismo de llamadade funciones y se necesita un tiempo mayor para realizarcada llamada.La razn por la cual se puede elegir u optar por usar re-cursividad es que existen muchos problemas complejosque poseen naturaleza recursiva y, en consecuencia, sonmas fciles de implementar.

    2.2.1 Ejemplo Iterativo

    /* * iterativo.c * * Julio Csar Brizuela 2009 * * para el wikilibroProgramacin en C * bajo licencia FDL, adaptado delDominio Pblico */ #include long factorial(int

  • 4 2 FUNCIONES RECURSIVAS

    numero); int main(int argc, char** argv) { int contador= 0; /* calcula el factorial de 0 a 10 */ for ( contador =0; contador

  • 5

    3 Text and image sources, contributors, and licenses

    3.1 Text Programacin en C/Uso de funciones Fuente: http://es.wikibooks.org/wiki/Programaci%C3%B3n%20en%20C/Uso%20de%

    20funciones?oldid=243557 Colaboradores: Gargo, Muro de Aguas, Morza, MarcoAurelio, Rrmsjp, Luckas Blade, Zerohours, Maxy,Fgrvpro, Dessaya, Alan, LlamaAl, Matiia y Annimos: 22

    3.2 Images

    3.3 Content license Creative Commons Attribution-Share Alike 3.0

    http://es.wikibooks.org/wiki/Programaci%25C3%25B3n%2520en%2520C/Uso%2520de%2520funciones?oldid=243557http://es.wikibooks.org/wiki/Programaci%25C3%25B3n%2520en%2520C/Uso%2520de%2520funciones?oldid=243557http://creativecommons.org/licenses/by-sa/3.0/

    FuncionesLa sentencia returnArgumentosDeclaracin y definicinPaso de ParmetrosPor ValorPor Referencia

    Variables Locales y Globales

    Funciones RecursivasRecursividad indirecta o recursin mutuaRecursin versus IteracinEjemplo IterativoEjemplo Recursivo

    Text and image sources, contributors, and licensesTextImagesContent license