Introducción • Estructuración del programa en partes más pequeñas y sencillas Modularización Propósito único Identificable Reusable • Mayor claridad: programación, depuración, etc. • Construcción de librerías a medida Definición de una función. Encabezado tipo_valor_retorno nombre_función (argumentos) { definición de variables; Lista de cuerpo de la función; declaraciones de } variables, precedidas por su tipo separadas por coma Declaración de las funciones tipo_valor_retorno nombre_función (argumentos); Prototipo de una función Donde: Include Definiciones de constantes Definiciones de variables globales Prototipos de funciones Función principal (main) Debe coincidir con el encabezado de la función Llamada nombre_función (argumentos); La llamada se ubica dentro de la función principal en el lugar en donde quiero que se ejecute, incorporando como argumentos las variables a enviar a la función sin especificar su tipo. Recordar que debe haber una congruencia de cantidad y tipo de datos entre lo que se envía y recibe la función (encabezado). Si la función devuelve algún valor, la llamada debería aparecer dentro de una expresión. Al enviar una variable a una función, se envía una COPIA de la misma. Uso de una función Una función se invoca proporcionando valores a los argumentos de la llamada. –Los argumentos se pasan siempre por valor. –El valor se devuelve por medio de return(). –Los procedimientos son funciones de tipo void. –El control del número y tipo de argumentos es mínimo. –Las funciones en C admiten recursividad. –No pueden devolverse tablas y solo un dato o nada. Vida de las variables • Variables locales: son declaradas dentro de una función y solo son válidas dentro de ellas. • Variables globales: son declaradas antes de las funciones y se pueden usar en todas las funciones. Mantienen los valores que se les asignan en las funciones. Es mejor hacer uso de variables locales para evitar efectos secundarios o laterales. Función sin parámetros # include <stdio.h> # include <conio.h> # include <stdlib.h> void pantalla ( void); int main () { printf(“ función principal”); pantalla ( ); } PROTOTIPO LLAMADA void pantalla (void ) DEFINICIÓN { system (“cls”); printf (“La pantalla esta limpia\n”); } Función con parámetros por valor # include <stdio.h> # include <conio.h> void compara ( int c, int d); int main ( ) { int a,b; printf (“Ingrese dos números”); scanf (“ %d %d”, & a, & b); compara (a,b); } void compara (int c, int d) { int mayor; if ( c>d) mayor = c; else mayor = d; printf (“ El mayor es %d”,mayor); } PROTOTIPO LLAMADA DEFINICIÓN Función con parámetros que retorna un valor. # include <stdio.h> # include <conio.h> float producto ( float a, float b); int main ( ) { float c,d,p; printf (“Ingrese dos números”); scanf (“ %f %f”, & c, & d); p=producto (c,d); printf(“\n El producto es %4.2f”,p); } float producto (float a, float b) { float k; k=a*b return k; } PROTOTIPO LLAMADA DEFINICIÓN Paso de parámetros: referencia (I) • ¿Devolver más de un valor? • ¿Modificar los parámetros reales? • Operador de dirección ( & ) : obtiene la dirección en memoria de una variable • Operador de indirección o puntero (*) : obtiene el dato contenido en una dirección de memoria Paso de parámetros: referencia (II) #include <stdio. h> void swap( int *x, int *y) { int aux; /* Se asigna a aux el valor referenciado por x */ aux = *x; /* Se asigna el valor referenciado por y al valor referenciado por x */ *x = *y; /* El valor referenciado por y pasa a ser el valor de aux */ *y = aux; } Int main() { int a, b; scanf( "% d %d", &a, &b ); swap( &a, &b ); printf( "Los nuevos valores son a=% d y b=% d\ n", a, b ); } Paso de parámetros: resumen • Paso por valor Declaración tipo nombre_ función (tipo1 param1, ... ) Llamada nombre_ función (variable1, ... ) • Paso por referencia Declaración tipo nombre_ función (tipo1 *param1, ... ) Llamada nombre_ función (& variable1, ... ) Recursividad • • Una función se llama a si misma de forma repetida hasta que se cumpla alguna condición. Ejemplo: el factorial de un numero: • Función que calcula el factorial de forma recursiva: long int factorial(int n) { if (n <= 1) return(1); else return(n * factorial(n-1)); } Errores de programación • • • • • • • • • • Omitir tipo-valor-retorno en una definición de función es un error de sintaxis si el prototipo de la función especifica un tipo diferente a int. Olvidar devolver un valor desde la función cuando se supone que se debe retornar alguno. Devolver un valor cuando la función es de tipo void, es un error de sintaxis. Especificar los parámetros de la función del mismo tipo como double x,y, en lugar de hacerlo como double x, double y. En el primer caso y será tomado como int por defecto. Colocar un punto y coma después del paréntesis derecho que encierra la lista de parámetros de la definición de una función. Definir otra vez un parámetro de función como variable local dentro de la función, es un error de sintaxis. Definir una función dentro de otra función es un error de sintaxis. Olvidar el punto y coma al final del prototipo de la función. Olvidar el prototipo de una función provoca un error de sintaxis si en el programa el tipo del valor de retorno no es int y la definición de la función aparece después de la llamada a la función. Escribir incorrectamente una función recursiva de manera que no se converja en un valor. Provocará una recursividad infinita y agotará la memoria.