"¡Se ha pasao usted con mi bambina! ¡Es usted un torpedo del año cuatro!" - Chuiquito de la Calzada
Funciones
Por fin. Uno de los capítulos más bonitos que existen en programación. Mira que me emociono y toda la pesca... Bueno, al tema.
Una función en programación es, en una definición informal, como básicamente ha sido este cursillo, un cacho de código que sirve para realizar una determinada función (nunca mejor dicho) sobre 0 o más valores y devuelve 0 o más valores. En realidad ya habéis estado usando funciones durante todo el curso sin daros cuenta, sólo que estas funciones que habéis usado estaban ya hechas. El ejemplo más claro es la función printf(), o también scanf(). main() sin ir más lejos es una función. Ahora aprenderemos a crear nuevas funciones y usarlas en nuestro código. Como es habitual, vamos a ver un ejemplo de una función muy sencilla, que no recibe ni devuelve ningún valor:
Código: Seleccionar todo
#include <stdio.h>
// La función imprime_nombre
void imprime_nombre(void)
{
char* nombre = "m0skit0";
printf("%s\n", nombre);
}
int main(int argc, char* argv[])
{
// Llamo a la función imprime_nombre
imprime_nombre();
return 0;
}
Como podéis ver, la función imprime_nombre es muy parecida en forma a main(). Esto es porque ambas son funciones. También podemos observar que imprime_nombre no devuelve ningún valor (el void antes del nombre), ni recibe ningún valor (el void entre paréntesis después del nombre). Tened en cuenta que independientemente del número de funciones que tengamos, main() siempre es la primera en ejecutarse al arrancar nuestro programa. A esto se le llama punto de entrada. Por tanto el punto de entrada en C es la función main()
Veamos ahora otro ejemplo con una función que recibe un valor, pero no devuelve nada:
Código: Seleccionar todo
#include <stdio.h>
// La función imprime_nombre
// Recibe un sólo valor de tipo char*, la variable nombre
void imprime_nombre(char* nombre)
{
printf("%s\n", nombre);
}
int main(int argc, char* argv[])
{
// Llamo a la función imprime_nombre
imprime_nombre("m0skit0");
return 0;
}
Bien, ahora veréis que entre los paréntesis de la función ya no va void, sino char* nombre. Esto indica que la función necesita que se le indique un valor de tipo char* para que pueda operar correctamente, como printf() por ejemplo. Esto es obligatorio, es decir, que si yo llamo a la función usando por ejemplo imprime_nombre(2);, el compilador me dará un error, porque estoy asignando a la variable nombre de tipo char* un int (2), y esto vimos que no puede ser.
También cabe destacar que dentro de la función imprime_nombre() se usa el identificador nombre como si fuera una variable normal.
Veamos ahora una función que recibe valores y devuelve uno (en C las funciones sólo pueden devolver un valor, a menos que usemos algunos trucos, que veremos más adelante):
Código: Seleccionar todo
#include <stdio.h>
// La función suma
// Recibe 2 valores, devuelve la suma de ambos.
int suma(int sumando1, int sumando2)
{
int total;
total = sumando1 + sumando2;
return total;
}
int main(int argc, char* argv[])
{
int a, b, resultado;
printf("Introduzca el primer sumando: ");
scanf("%d", &a);
printf("\nIntroduzca el segundo sumando: ");
scanf("%d", &b);
// Aquí llamo a la función y almaceno el valor de vuelta en la variable "resultado"
resultado = suma(a, b);
printf("\nEl resultado de la suma es %d\n", resultado);
return 0;
}
Nos fijamos que ahora es una nueva función que he llamado suma(). Esta vez recibe 2 valores, ambos de tipo entero (int). Insistir en el hecho de que no podemos declarar la función así: int suma(int sumando1, sumando2). Para cada parámetro hay que indicar explícitamente el tipo.
También resulta interesante fijarse que en las funciones (al igual que en main()) podemos declarar sus propias variables locales. Hablaremos sobre este tema (la localidad y visibilidad de variables) en el siguiente capítulo.
Ahora veréis que existe una nueva orden, return. Hasta ahora la habíamos usado para finalizar main(). Esta orden hace que el valor especificado tras ella sea devuelto como valor de vuelta de la función. Como veréis, la función suma() devuelve un entero (int), de ahí que sea declarada int suma() (al igual que declaramos variables ). Si nos fijamos en main(), llamamos a la función usando la línea resultado = suma(a, b);, es decir, asignamos a nuestra variable resultado el valor devuelto por la función suma(). También podríamos haber hecho directamente:
Código: Seleccionar todo
printf("\nEl resultado de la suma es %d\n", suma(a,b));
y ahorrarnos la variable resultado, por ejemplo. Una función que devuelve un valor es considerada una expresión, y como tal puede ir en cualquier lugar donde pueda ir una expresión
Las funciones en realidad no añaden nada al código. Sin embargo, son unas herramientas muy útiles para organizar y reutilizar buena parte de nuestro código. Siempre deben usarse, ya que clarifican el código y nuestra mente al mismo tiempo.
¿Cuándo hacer una función? Generalmente, debemos crear y usar una función para cada subtarea suficientemente compleja dentro de nuestro programa. Cualquier subtarea cuyo procedimiento sea idéntico y se realice más de una vez en la lógica, es una seria candidata a función.
¿Cuándo no hacer una función? Cuando la función vaya a ser muy pequeña, con escaso número de órdenes, no merece la pena complicar el código añadiendo una función donde en realidad habría nada más que una o dos líneas de código. Los ejemplos de funciones que he dado anteriormente son claros ejemplos de funciones que no son necesarias.
No sobra tampoco recalcar que las funciones deben tener un nombre acorde a la tarea que realizan (al igual que ocurre con las variables). Generalmente suelen llevar verbos en infinitivo o en imperativo.
Ahora como no puede ser de otra manera, ¡a jugar!
- Escribir una función que devuelva el factorial de un número.
- Escribir una función que devuelva si un número es primo o no.
- Escribir una función que devuelva la suma de todos los elementos de un vector de enteros.
- Reescribir el reto 4 del capítulo anterior usando funciones donde se considere necesario.
Lo más difícil generalmente de las funciones es saber qué subtarea asignarle y sobre todo qué parámetros va a necesitar para funcionar correctamente. No dudéis en probar diferentes parámetros
Weno saludos y ¡hasta la próxima!
<< Anterior Siguiente >>