Fundamentos de Informática 1 2 Introducción Un programa en C consta de una o más funciones. { Declaración La función main es la primera función que se ejecuta y que llama a las otras funciones directa o indirectamente. Una función es una “caja negra” que realiza ciertas acciones de una forma independiente, devolviendo si es necesario ciertos valores de salida a partir de unos valores de entrada. { { Las funciones pueden ser programadas por el usuario o utilizar las que ya están programadas y agrupadas en librerías. Ejemplo: funciones scanf y printf de la librería stdio. Declaración o prototipo de la función (¿cómo se usa?): { tipo nombre_de_funcion ( decl_list_arg ); tipo: declara el tipo del valor que devuelve la función (void, si no devuelve ningún valor). nombre_de_funcion: identificador de la función. decl_list_arg: lista de declaraciones de parámetros formales (que incluyen el tipo y el nombre de los parámetros). Representan los valores que deben ser pasados a la función. Ejemplos: double potencia( double base, int exponente ); void escribe_importe( double importe ); double lee_importe(); Similar al concepto matemático de función. Ejemplos: y = f(x) ; var1 = sqrt(var2) ; Esta independencia permite la reusabilidad de las funciones en otros puntos del programa e incluso en otros programas. { 3 4 Definición o implementación Mediante la implementación indicamos qué hace la función { Llamada tipo nombre_de_funcion ( decl_list_arg ){ declaraciones_de_variables_locales sentencias ... Cuerpo de la función return expresion; } Mediante la llamada se ejecuta la función (se ejecuta el código que aparece en la implementación) { nombre_de_funcion ( lista_parametros_reales ) { Lista de parámetros reales: contiene los valores que se le pasan a la función separados por comas. Si la función no tiene parámetros formales, entonces en la llamada no aparece ningún valor entre los paréntesis. { Sentencia return { { { { { Puede aparecer en cualquier parte del cuerpo (normalmente, al final) Cuando se ejecuta la sentencia return se termina la ejecución de la función En las funciones que devuelven valores, indica qué valor se devuelve En las funciones de tipo void la sentencia return aparece sin la expresión Ejemplos: return 4.5; return importe*1.13 + total; Sólo es correcto para return ; funciones de tipo void Las funciones se ejecutan cada vez que se ejecuta una llamada en el código del programa Ejemplos: resultado = potencia( 2.3 * suma, 5 ); gasto = lee_importe(); escribe_importe( gasto ); return potencia(2,3) + potencia(2,exponente); Dpto. de ATC, Universidad de Sevilla - Página 1 de 5 Fundamentos de Informática 5 6 Variables locales y parámetros formales { El ámbito de una variable es la porción de código donde la variable está disponible (se puede acceder a ella) { { { Cuando una variable está disponible en una porción de código, diremos que es visible o conocida. { Estudiaremos dos ámbitos: { { Variables locales o automáticas { Global Local a las funciones Se declaran dentro de la función (al principio del cuerpo) Sólo son visibles dentro del cuerpo de la función Se crean automáticamente cuando comienza la ejecución de la función Se destruyen automáticamente cuando se termina la ejecución de la función Deben ser inicializadas dentro de la función Parámetros Formales { { Sólo son visibles dentro de la función Se inicializan automáticamente con los valores de los parámetros reales (en la llamada a la función). 7 Ejemplo 1a 8 Ejemplo 1b double potencia( double, int ); Variable local de void main() { la función main int contador; for (contador=1; contador<10; contador++) printf( “%lf ”, potencia( 1.0/contador, contador ) ); } double potencia( double base, int exponente ) { Parámetros de la función potencia int contador; double resultado = 1; Variables locales de if (exponente < 0) { la función potencia base = 1 / base; exponente = -exponente; } for (contador=0; contador<exponente; contador++) resultado = resultado * base; return resultado; } double potencia( double, int ); La variable contador de la función main sólo es visible en la zona sombreada void main() { int contador; for (contador=1; contador<10; contador++) printf( “%lf ”, potencia( 1.0/contador, contador ) ); } double potencia( double base, int exponente ) { Tenemos dos variables int contador; contador diferentes. double resultado = 1; if (exponente < 0) { base = 1 / base; exponente = -exponente; } for (contador=0; contador<exponente; contador++) resultado = resultado * base; return resultado; } Dpto. de ATC, Universidad de Sevilla - Página 2 de 5 Fundamentos de Informática 9 10 Variables globales Ejemplo 1c double potencia( double, int ); Los parámetros se inicializan en la llamada void main() { a la función int contador; for (contador=1; contador<10; contador++) printf( “%lf ”, potencia( 1.0/contador, contador ) ); } double potencia( double base, int exponente ) { int contador; Los parámetros y las variables double resultado = 1; locales de la función potencia sólo if (exponente < 0) { son visibles en la zona sombreada. base = 1 / base; exponente = -exponente; } for (contador=0; contador<exponente; contador++) resultado = resultado * base; Utilizamos los parámetros igual que return resultado; las variables locales } Variables globales { { { Se declaran fuera de las funciones Son visibles en todo el código que sigue a su declaración Existen durante toda la ejecución del programa 11 Ejemplo 1a 12 Ejemplo 1b double potencia( double, int ); void ejemplo(); double potencia( double, int ); void ejemplo(); int contador = 3; int exponente = 0; void main() { printf( “%d\n”, contador ); printf( “%d\n”, sumador ); } int contador = 3; int exponente = 0; void main() { printf( “%d\n”, contador ); printf( “%d\n”, sumador ); } ERROR: La variable sumador no es visible Las variables globales contador y exponente son visibles en la zona sombreada Las variables locales y los parámetros ocultan a las globales con su mismo nombre int sumador; int sumador; double potencia( double base, int exponente ) { int contador = 0; … } double potencia( double base, int exponente ) { int contador = 0; … En esta zona no son visibles las } void ejemplo() { contador++; sumador = sumador + contador; } void ejemplo() { contador++; sumador = sumador + contador; } La variable global sumador es visible en la zona sombreada Dpto. de ATC, Universidad de Sevilla - Página 3 de 5 variables globales contador y exponente, sino la variable local contador y el parámetro exponente. Fundamentos de Informática 13 14 Ejemplo 2 double potencia( double, int ); void ejemplo(); int contador = 3; void main() { printf( “%d\n”, contador ); printf( “%lf\n”, potencia(2,3) ); printf( “%d\n”, contador ); ejemplo(); printf( “%d\n”, contador ); } 3 8.000000 3 5 void ejemplo() { contador = contador + 2; } EDIFICIO: CUESTIONES GENERALES PLANTA DE UN PISO DETALLE DE UNA HABITACIÓN double potencia( double base, int exponente ) { int contador = 0; … } 15 Funciones 16 Ejemplo 1a MENU PRINCIPAL -----------------Calculadora.... c Conversiones... v Terminar....... t ------------------total: 3432 Dividir un problema en fragmentos más pequeños: más fáciles de resolver, de implementar y de depurar Ventajas: { { { Reusabilidad del código Facilita el trabajo en grupo Facilita el mantenimiento del código: podemos cambiar el código de una función sin modificar el resto del programa. Programa principal mostrar_menu leer_opcion Dpto. de ATC, Universidad de Sevilla - Página 4 de 5 calculadora conversiones Fundamentos de Informática 17 Ejemplo 1b Ejemplo 1c Cada módulo se implementa con las siguientes funciones: { { { { { 18 main: programa principal char mostrar_menu( double valor ); char leer_opcion(); double calculadora( double valor ); void conversiones( double valor ); char mostrar_menu( double valor ); char leer_opcion(); double calculadora( double valor ); void conversiones( double valor ); void main() { double total = 0; char opcion; do { opcion = mostrar_menu( total ); if (opcion == ‘c’) total = calculadora( total ); else if (opcion == ‘v’) conversiones( total ); } while ( opcion != ‘t’ ); } char mostrar_menu( double total ) { … leer_opcion() … } Dpto. de ATC, Universidad de Sevilla - Página 5 de 5