1 / 23

Subprogramas o funciones Definición de funciones. Declaración de la función (prototipo).

CI2125 TEORIA semana 8. Subprogramas o funciones Definición de funciones. Declaración de la función (prototipo). Argumentos de la función, pase por valor Función sin argumentos Función con argumentos, pasa el valor

denim
Download Presentation

Subprogramas o funciones Definición de funciones. Declaración de la función (prototipo).

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CI2125 TEORIA semana 8 • Subprogramas o funciones • Definición de funciones. • Declaración de la función (prototipo). • Argumentos de la función, pase por valor • Función sin argumentos • Función con argumentos, pasa el valor • Funciones que retornan un valor, con argumentos • Ámbito de las variables: globales, locales. • Función main, y sus argumentos argc, argv

  2. FUNCIONES: Motivación Para resolver problemas complejos y/o de gran tamaño se debe utilizar el concepto de Reducción de Problemas. El problema se descompone en subproblemas, los cuales a su vez se descomponen en otros subproblemas, ... Hasta que el problema original queda reducido a actividades básicas. La solución de estas tareas básicas, permite, aplicando razonamiento hacia atrás, la solución del problema final En C, la solución de un problema se expresa por medio de un programa, la solución de un subproblema, por medio de una función.

  3. FUNCIONES en lenguaje C Un programa en C esta constituido por un programa principal ( main ) y un conjunto de funciones. El programa principal consta de pocas líneas, las cuales son generalmente llamadas a funciones. La llamada a una función indica al procesador que debe continuar con el procesamiento de la función, una vez que esta concluye, el control regresa al punto en donde fue llamada en el programa principal. C permite que una función pueda llamar a otras funciones. Permite el concepto de “Recursividad”, una función que se llama a si misma.

  4. Definición / Declaracion de Funciones /* programa.c calculo del area … */ #include <stdio.h> /* Declaración de la función, prototipo */ float calculo_area( float b, float h); void main() { … area= calculo_area(base,altura); … } /* Definicion de la funcion */ float calculo_area( float b, float h) { return b*h; } Comentarios Archivos cabeceras Declaración función Puede estar en archivo.h Cuerpo main Definición función Puede estar en otro archivo.c

  5. Definición de Funciones Una función se define usando el siguiente prototipo: tipo nombre_función( tipo1 arg1, tipo2 arg2,…, tipon argn) { /* declaracion de variables locales a la funcion */ /* cuerpo de la función */ return valor_mismo_tipo; } Las funciones se comunican con el cuerpo principal, o con otras funciones a través de parámetros/argumentos, por Valor, por Referencia o por medio de variables globales (menos usadas) El prototipo de la función debe declararse antes del cuerpo principal. tipo nombre_función( tipo1 arg1, tipo2 arg2,…, tipon argn);

  6. Definición de Funciones nombre_funcion: no se pueden usar mas que letras, números y el símbolo '_'. el nombre de la función debe empezar por una letra. El nombre de la función se usa para llamarla dentro del programa. tipo: Cuando una función se ejecuta y termina debe devolver un valor. Este valor puede ser cualquiera de los tipos de variables que hemos visto o un tipo de dato definido por nosotros. El valor que devuelve la función suele ser el resultado de las operaciones que se realizan en la función, o si han tenido éxito o no. También podemos usar el tipo void cuando no se devuelve ningún valor. Definición de variables: Dentro de la función podemos definir variables que sólo tendrán validez dentro de la propia función. Cuerpo de la función: Aquí es donde va el código de la función. return: La sentencia return se usa para devolver un valor en el nombre de la función del mismo tipo declarado arriba. El dato que se pone después de return es el dato que se devuelve. Puede ser una constante o una variable. argi: argumentos: Estos son variables que se pasan como datos a una función. Deben ir separados por una coma. Cada variable debe ir con su tipo de variable.

  7. Argumentos de la función, pase por valor Función sin argumentos: #include <stdio.h> void hola_mundo( void ); /* lleva punto y coma aquí */ void main() { hola_mundo(); /* Llamamos a la función */ } void hola_mundo( void ) /* No se debe poner punto y coma aquí */ { printf(“\n”); printf( “Hola Mundo\n" ); return; /* No hace falta devolver ningún valor, ni siquiera poner return */ }

  8. Argumentos de la función, pase por valor Función con argumentos, pasa el valor: #include <stdio.h> void compara( int a, int b ); int main() { int num1, num2; num1 = 2, num3=5; compara( num1, num2 ); /* Llamamos a la función con sus dos arg’s */ } void compara( int a, int b ) /* argumentos a y b a la función */ { if ( a>b ) printf( "%i es mayor que %i\n" , a, b ); else printf( "%i es mayor o igual que %i\n", b, a ); }

  9. Argumentos de la función, pase por valor Funciones que retornan un valor, con argumentos #include <stdio.h> int compara( int a, int b ); /* prototipo, retorna un valor entero */ int main() { int num1=2, num2=5, resultado; resultado = compara( num1, num2 ); /* guarda el valor que devuelve la función en resultado */ printf( "El mayor de los dos es %i\n", resultado ); } int compara( int a, int b ) /* argumentos a y b a la función */ { int mayor; /* Esta función define su propia variable*/ if ( a>b ) mayor = a; else mayor = b; return mayor; }

  10. Argumentos de la función, pase por valor Función Inútil !!, argumentos solo pasan su valor !! Una función en C no puede alterar las variables pasadas como argumentos. #include <stdio.h> void incrementa ( int variable ); main() { int x = 33; incrementa (x); /* x no resulta afectada, sigue valiendo 33 */ printf ( "la variable x vale ahora %d\n", x ); } /* función inútil */ void incrementa ( int variable ) { variable ++; } Variable local x x 33 Variable local variable variable 33 variable 34

  11. Ámbitos de variables: Globales - Locales Según el lugar donde son declaradas puede haber dos tipos de variables. Globales: Las variables permanecen activas durante todo el programa. Se crean al iniciarse éste y se destruyen de la memoria al finalizar. Pueden ser utilizadas en cualquier función. Locales: Las variables son creadas cuando el programa llega a la función en la que están definidas. Al finalizar la función desaparecen de la memoria. Si dos variables, una global y una local, tienen el mismo nombre, la local prevalecerá sobre la global dentro de la función en que ha sido declarada. Dos variables locales pueden tener el mismo nombre siempre que estén declaradas en funciones diferentes.

  12. Ámbitos de variables: Globales - Locales #include <stdio.h> int variable; void incrementa ( void ); main() { int x = 33; variable = x; incrementa (); /* x no resulta afectada, sigue valiendo 33 */ printf ( "la variable vale ahora %d\n", variable ); } /* función void, que cambia variable Global*/ void incrementa ( void ) { variable ++; } Variable GLOBAL variable variable Variable local x x 33 Variable GLOBAL variable variable 33 Variable GLOBAL variable variable 34

  13. Ámbitos de variables: Globales - Locales #include <stdio.h> int variable; void incrementa ( void ); main() { int x = 33; variable = x; incrementa (); /* x no resulta afectada, sigue valiendo 33 */ printf ( "la variable vale ahora %d\n", variable ); } /* función void, que cambia variable Global*/ void incrementa ( void ) { int variable; /* variable local */ variable ++; } Variable GLOBAL variable variable Variable local x x 33 Variable GLOBAL variable variable 33 Variable LOCAL variable variable Valor ?

  14. PASAJE DE ARGUMENTOS POR VALOR Cuando se pasa una variable a una función (paso por valor) no se puede cambiar el valor de esa variable en la función Realizar una función que recibe dos argumentos y retornar como resultado los valores invertidos de las dos variables. void permuta(int x, int y) { int temp; temp = x; x = y; y = temp; } El efecto de esta función no es el deseado, ya que las variables son pasadas por valor Variables locales x, y, temp temp Valor x x Valor y y Valor temp

  15. PASAJE DE ARGUMENTOS POR VALOR Uso de la función permuta en main … Las variables var1 y var2 no cambian a pesar de que permuta las usa, solo pasa el valor de las mismas, y no su referencia o dirección #include <stdio.h> void permuta(int x, int y) void main() { int var1=1, var2=2; printf(“ valor de var1= %d y var2= %d, var1, var2); permuta(var1,var2); printf(“ valor de var1= %d y var2= %d, var1, var2); }

  16. PASAJE DE ARGUMENTOS POR REFERENCIA El nombre del arreglo es un apuntador constante a la dirección de memoria del primer elemento del arreglo arreglo arreglo[0] arreglo[1] . . . arreglo[N]

  17. PASAJE DE ARGUMENTOS POR REFERENCIA Volvamos a ver el ejemplo de permutar dos variables en una función, usando un arreglo para almacenar los valores de las variables a permutar, y como pase por referencia ANTES #include <stdio.h> void PermutaArray( int x[] ); void main() { int arreglo[] = { 1, 2 }; printf(“Antes: arreglo={%d,%d}\n”, arreglo[0], arreglo[1] ); PermutaArray(arreglo[]); printf(“Despues: arreglo={%d,%d}\n”, arreglo[0], arreglo[1] ); } arreglo 1 2 DESPUES arreglo 2 1

  18. PASAJE DE ARGUMENTOS POR REFERENCIA Volvamos a ver el ejemplo de permutar dos variables en una función, usando un arreglo para almacenar los valores de las variables a permutar, pase por referencia void PermutaArray( int x[] ) { int aux; aux = x[0]; x[0] = x[1]; x[1] = aux; } x 1 2

  19. FUNCIONES RECURSIVAS Una función recursiva es una función que se llama a si misma. Esto es un concepto complejo. Aquí veremos solo algunos ejemplos sencillos. El problema que trata de resolver una función recursiva, se descompone en el caso mas simple, o Caso Base., en cuyo caso retorna un valor. Para los casos complejos, se divide el problema en una parte que la función sabe resolver y en otra parte parecida a si misma, por lo que realiza una llamada a si misma, pero con un valor menos complejo, hasta llegar al caso base. Llegado a este punto, la función retorna un valor a la copia anterior de la función, y así sucesivamente, esta otra retorna otro valor a la anterior llamada, hasta llegar a la primera llamada que retorna un valor donde fue llamada inicialmente (main).

  20. FUNCIONES RECURSIVAS Ejemplo: Factorial de un numero n >=0, n! n! = n . ( n-1)!, donde 0!= 1 y 1!=1 son el caso base En forma iterativa: factorial = 1; for (i= numero; i >=1; i-- ) factorial = factorial * i; En forma Recursiva: llamando a la función factorial( numero ) double factorial ( int numero ) { if ( numero < = 1 ) return 1; else return ( numero * factorial( numero-1) ) ; }

  21. FUNCIONES RECURSIVAS 5! 5 * 4! 4 * 3! 3 * 2! 2 * 1! 1 Veamos que pasa con cada llamada recursiva: 120 5 * 24 4 * 6 3 * 2 2 * 1 1 Cuando llega a Caso Base, empieza el retorno de valores en cada llamadas de la función Secuencia de llamadas recursivas

  22. Función “main” La función main también acepta argumentos. Y retorna valor int o void Sin embargo sólo se le pueden pasar dos argumentos. intmain( int argc, char *argv[] ) argc (argument count). Es de tipo int e indica el número de argumentos que se le han pasado al programa. argv (argument values) Es un array de strings. En el se almacenan los parámetros. Normalmente, el primer elemento (argv[0]) es el nombre del programa con su ruta. El segundo (argv[1]) es el primer parámetro, el tercero (argv[2]) el segundo parámetro y así hasta el final.

  23. Función “main” #include <stdio.h> int main( int argc, char *argv[]) { int i; for( i=0 ; i<argc ; i++ ) printf( "Argumento %d: %s\n", i, argv[i] ); return 1; } Si salvamos este programa con el nombre “argumentos” y ejecutamos como: c:\programas> argumentos hola amigos La salida será: Argumento 0: c:\programas\argumentos.exe Argumento 1: hola Argumento 2: amigos

More Related