F U N C I O N E S Lenguajes de programación LPSI EUI UPM • • • • • Subprograma Cero o más parámetros de entrada Devuelve uno o ningún valor No se pueden anidar Las variables declaradas dentro de una función son locales a ella • Todos los parámetros son por “copia” • Pueden utilizar vbles globales definidas con anterioridad Lenguajes de programación LPSI EUI UPM • Definición tipo nombre (lista de parámetros) { cuerpo } Lista de parámetros: tipo1 param1, tipo2 param2, … • prototipo: tipo nombre (lista de tipos de los parámetros); • return (valor) devuelve el resultado de la función Lenguajes de programación LPSI EUI UPM unsigned long factorial (unsigned n) { unsigned long fact = 1; for ( ; 1 < n; n--) fact *= n; return (fact); } main () { printf (“El factorial de 25 es %l\n”, factorial(25)); } Lenguajes de programación LPSI EUI UPM unsigned mcd (unsigned a, unsigned b) { while (a != b) ? a -=b: b -= a; if a(a>>bb) a -= b; else b -= a; return (a); } Lenguajes de programación LPSI EUI UPM main () { int i = 8, j = 0, k = 20; float x = 0.0, y; a = 45; } int funcion (char c) { short a, b, d = 0; float x = 0.0; i++; k--; local x = 100.4; } ¡error! Lenguajes de programación LPSI EUI UPM int f (char c) { ………. } char g (int i) { …. c = h (i); ………. } ¡error! int h (int k) { ……… g (47); } Lenguajes de programación LPSI EUI UPM int f (char); char g (int); int h (int); int f (char c) { ………. } char g (int i) { …. c = h (i); ………. } int h (int k) { ……… g (47); } Lenguajes de programación LPSI EUI UPM • tipo “void” – tipo de la función: no devuelve ningún valor – parámetro: sin parámetros void rara (void) { printf (“\n¡¿Qué hago yo aquí?!”); } void f (unsigned n) { for (; n; n--) printf (“\n%i”, n); } Lenguajes de programación LPSI EUI UPM RECURSIVIDAD void sep_digi (unsigned n) { if (n <10) printf (“%i ”, n); else { sep_digi (n / 10); printf (“%i “, n % 10); } } Lenguajes de programación LPSI EUI UPM PARÁMETROS POR VALOR void intercambio (int i, int j) { int aux = i; i = j; j = aux; } main () { int a = 5, b = 8; printf (“\na = %d b = %d”, a, b); intercambio (a, b); printf (“\na = %d b = %d”, a, b); } a=5 b=8 a=5 b=8 Lenguajes de programación LPSI EUI UPM PARÁMETROS POR REFERENCIA void intercambio (int *i, int *j) { int aux = *i; *i = *j; *j = aux; } main () { int a = 5, b = 8; printf (“\na = %d b = %d”, a, b); intercambio (&a, &b); printf (“\na = %d b = %d”, a, b); } a=5 b=8 a=8 b=5 Lenguajes de programación LPSI EUI UPM void intercambio (int **i, int **j) { int *aux = *i; *i = *j; *j = aux; } main () { int a = 5, b = 8, *p1 = &a, *p2 = &b; printf (“\na = %d b = %d”, *p1, *p2); intercambio (&p1, &p2); printf (“\na = %d b = %d”, *p1, *p2); } a=5 b=8 a=8 b=5 Lenguajes de programación LPSI EUI UPM TIPOS DE VARIABLES int total = 0; int fun (int n) { char c = ‘ ‘; static int suma = 0; suma += total; total++; c++; return (suma) } GLOBAL LOCAL O AUTO STATIC main () REGISTRO { register int i; for (i = 0; i < 20; i++) printf (“\nVan acumulados %d”, fun (total); } Lenguajes de programación LPSI EUI UPM PUNTEROS A FUNCIÓN • Declaración tipo (*pf) (lista tipos parám.) int (*p_int) (void); char* (*p_cad) (char, char, int); • Asignación pf = nombre de la función p_int = funcion_x; • Invocación de una función i = (*p_int) (); printf (“%s”, (*p_cad) (‘a’, ‘z’, 88)); Lenguajes de programación LPSI EUI UPM int escribir (int x) { printf (“%d\n”, x); } main () { int (*pf) (int); pf = escribir; (*pf) (6); } Lenguajes de programación LPSI EUI UPM EJERCICIOS ¿Qué significan las siguientes declaraciones? char *fp () float (*pf) (void) Lenguajes de programación LPSI EUI UPM float **fpp (char, int) short (*fpf (void)) (double); Lenguajes de programación LPSI EUI UPM double * (* pfp) (int, short) char (*(* pfpf) (int *)) (char *) Lenguajes de programación LPSI EUI UPM int (*pf [8]) (char, char) (void (*) (int, int, void (*p [4][5]) (void))) * (*pf) (int) Lenguajes de programación LPSI EUI UPM Escribir una función que recibiendo como parámetro un nº entero positivo lo devuelva invertido Lenguajes de programación LPSI EUI UPM • Escribir una función que recibiendo como parámetro un nº entero, positivo o negativo, lo devuelva invertido. • Escribir una función que recibiendo como parámetros una matriz cuadrada de enteros y un entero positivo mayor que 2 indicando su tamaño, devuelva cierto si es triangular superior y falso en caso contrario. Lenguajes de programación LPSI EUI UPM