Una función es un conjunto de declaraciones, definiciones, expresiones y sentencias que realizan una tarea específica.
El formato general de una función en C es
especificador_de_tipo nombre_de_función( lista_de_parámetros )
{variables locales}
código de la función
El especificador_de_tipo indica el tipo del valor que la función
devolverá mediante el uso de return
. El valor puede ser de cualquier
tipo válido. Si no se específica un valor, entonces la computadora asume por
defecto que la función devolverá un resultado entero. No se tienen siempre
que incluir parámetros en una función. la lista de parámetros puede
estar vacía.
Las funciones terminan y regresan automáticamente al
procedimiento que las llamó cuando se encuentra la última llave }
, o
bien, se puede forzar el regreso antes usando la sentencia
return
. Ademas del uso señalado la función return
se usa
para devolver un valor.
Se examina a continuación un ejemplo que encuentra el promedio de dos enteros:
float encontprom(int num1, int num2) { float promedio; promedio = (num1 + num2) / 2.0; return(promedio); } main() { int a=7, b=10; float resultado; resultado = encontprom(a, b); printf("Promedio=%f\n",resultado); }
Las funciones void
dan una forma de emular, lo que en otros lenguajes
se conocen como procedimientos (por ejemplo, en PASCAL). Se usan cuando no
requiere regresar un valor. Se muestra un ejemplo que imprime los cuadrados de ciertos números.
void cuadrados() { int contador; for( contador=1; contador<10; contador++) printf("%d\n",contador*contador); } main() { cuadrados(); }
En la función cuadrados no esta definido ningún parámetro, y por otra parte tampoco se emplea la sentencia return
para regresar de la función.
Cuando se usan un arreglo como un argumento a la función, se pasa sólo la dirección del arreglo y no la copia del arreglo entero. Para fines prácticos podemos considerar el nombre del arreglo sin ningún índice como la dirección del arreglo.
Considerar el siguiente ejemplo en donde se pasa un arreglo a la función imp_rev
, observar que no es necesario especificar la dimensión del arreglo cuando es un parámetro de la función.
void imp_rev(char s[]) { int t; for( t=strlen(s)-1; t>=0; t--) printf("%c",s[t]); } main() { char nombre[]="Facultad"; imp_rev(nombre); }
Observar que en la función imp_rev
se usa la función strlen
para calcular la longitud de la cadena sin incluir el terminador nulo. Por otra parte, la función imp_rev
no usa la sentencia return
ni para terminar de usar la función, ni para regresar algún valor.
Se muestra otro ejemplo,
float enconprom(int tam, float lista[]) { int i; float suma = 0.0; for ( i=0; i<tam; i++) suma += lista[i]; return(suma/tam); } main() { float numeros[]={2.3, 8.0, 15.0, 20.2, 44.01, -3.0, -2.9}; printf("El promedio de la lista es %f\n", enconprom(7,numeros) ); }
Para el caso de que se tenga que pasar un arreglo con más de una dimensión, no se indica la primera dimensión pero, el resto de las dimensiones deben señalarse. Se muestra a continuación un ejemplo:
void imprtabla(int tamx,int tamy, float tabla[][5]) { int x,y; for ( x=0; x<tamx; x++ ) { for ( y=0; y<tamy; y++ ) printf("t[%d][%d]=%f",x,y,tabla[x][y]); printf("\n"); } }
Antes de usar una función C debe tener conocimiento acerca del tipo de dato que regresará y el tipo de los parámetros que la función espera.
El estándar ANSI de C introdujó una nueva (mejor) forma de hacer lo anterior respecto a las versiones previas de C.
La importancia de usar prototipos de funciones es la siguiente:
Lo anterior es hecho, dependiendo del alcance de la función. Básicamente si una función ha sido definida antes de que sea usada (o llamada), entonces se puede usar la función sin problemas.
Si no es así, entonces la función se debe declarar. La declaración simplemente maneja el tipo de dato que la función regresa y el tipo de par^o'ametros usados por la función.
Es una práctica usual y conveniente escribir el prototipo de todas las funciones al principio del programa, sin embargo esto no es estrictamente necesario.
Para declarar un prototipo de una función se indicará el tipo de dato que regresará la función, el nombre de la función y entre paréntesis la lista del tipo de los parámetros de acuerdo al orden que aparecen en la definición de la función. Por ejemplo:
int longcad(char []);
Lo anterior declara una función llamada longcad
que regresa un valor entero y acepta una cadena como parámetro.
char cadena[] = "El gato negro"; n = reemplaza( cadena );deberá devolver:
cadena convertida "El_gato_negro" n = 2
gets
y calcule la longitud de
la línea (NO usar la función strlen
).