Sacado del tema 7 “Funciones” (pgs 35-42) de José María Bea.
Una función es un trozo de programa que separamos del resto para poder reutilizarlo en distintos momentos. Por ejemplo, un código que calcule la media de muchos números se puede necesitar a menudo, así que es mejor separarlo y llamarlo cuando nos haga falta. La sintaxis para declarar una función desde dentro del programa principal (main) es:
tipo_dato_a_devolver nombre_funcion ([argumentos_entrada]);
Ejemplo de declaración:
float area(base, altura);
Ejemplo de llamada (desde dentro de main, por ejemplo):
area(base, altura);
Las funciones se “llaman” (se usan) donde y cuando a ti te hace falta.
Fíjate que las dos órdenes anteriores llevan punto y coma. Luego, fuera del programa principal, declaramos el código de la función:
tipo_a_devolver nombre_función ([argumentos])
{
variables_locales;
cuerpo_funcion;
[return valor;] // dato que se devuelve al programa PRINCIPAL
}
La sentencia ‘’return’’ devuelve un parámetro al punto donde se llamó la función.
Ejemplo sin variables de entrada y salida:
#include <stdio.h> void funcionuno(); // Declaro funciones... void funciondos(); // como si fueran variables int main() { funcionuno(); // Llamo a una función funciondos(); // Cuando acabe con la primera... } // se llamará a la segunda void funcionuno() {// Ahora viene lo que hace la funcionuno cuando se le llama printf("Mi primera función\n"); } void funciondos() {// Ahora viene lo que hace la funciondos cuando se le llama printf("Mi segunda función\n"); }
Debes tener muy en cuenta la diferencia entre variables locales (disponibles sólo en la función actual) y variables globales (disponibles en todas las funciones). Las variables globales se declaran bajo el ”include”, fuera de cualquier función. Las variables locales se declaran dentro de una función (la main o cualquier otra que tú hagas) y son sólo valen para esa función.
Ten cuidado porque a veces hay variables locales que se llaman igual en distintas funciones, pero no son la misma variable. Ejemplo: el “int i = 0” que suele ir dentro del bucle “for”.
Ejemplo 10 para hacer: Coge el ejemplo anterior y haz que los dos printf() muestren una variable (la misma para los dos). Prueba a declararla donde el #include, en main(), en la funcionuno(), en la funciondos(). Sólo donde el include será global, en los otros casos será local a cada una de las tres funciones.
Aquí va un programa con funciones con entradas y salidas. Es muy sencillo. Pruébalo en el compilador porque es muy fácil. A cada función se le hace las siguientes operaciones:
#include <stdio.h> int menu(); // Declaro funciones int suma(int, int); // Entran dos operandos, sale uno int resta(int, int); int operandouno = 0; // Variables GLOBALES int operandodos = 0; int main() { printf("Introduce primer operando: "); scanf("%i" ,&operandouno); printf("Introduce segundo operando: "); scanf("%i" ,&operandodos); int opcion = 0; opcion = menu(); // Llamo a la función. if (opcion == 1) { printf("%i",suma(operandouno, operandodos)); } if (opcion == 2) { printf("%i",resta(operandouno, operandodos)); } if (opcion != 1 && opcion != 2) printf("Opción no válida."); } int menu() { int resultado=0; printf("Programa para hacer operaciones con los números %i y %i.", operandouno, operandodos); printf("\nPulsa \"1\" para sumar los operandos o bien \"2\" para restarlos: "); // Las barras son por culpa de las comillas scanf("%i",&resultado); return resultado; // Dato tipo "int" que se devuelve al main } int suma(int sumandouno, int sumandodos) // Operandos de entrada { //operandouno pasa a ser sumandouno; operandodos pasa a sumandodos int resultado = sumandouno + sumandodos; // Variables LOCALES return resultado; // Operando de salida que se devuelve al main } int resta(int minuendo, int sustraendo) { //operandouno pasa a ser minuendo; operandodos pasa a sustraendo int resultado = minuendo - sustraendo; // Variables LOCALES return resultado; // Operando de salida que se devuelve al main }
Fíjate que resultado es una variable local que se usa independientemente en las funciones menu(), suma() y resta(). En cada función es una variable distinta aunque se llame igual.
En cambio operandouno y operandodos son variables globales que entran como locales (“sumandouno” y “sumandodos” o bien “minuendo” y “sustraendo”.
Ejemplo para hacer: Modifica el ejemplo anterior para que si el usuario escoge una opción no válida, el programa se vuelva a repetir. Añade funciones para que calcule multiplicaciones y divisiones.
Ahora vamos con otro ejemplo con variables de entrada y salida. Este es más complejo pero está bien estructurado. Tenemos unas variables locales a la función main() (base, altura), que al pasar a la función arearectangulo se convierten en locales (b, h)
#include <stdio.h> float arearectangulo(float, float); // Declaro funciones como si fueran variables int main() { float base = 4; // Variable local (sólo en main) float altura = 5; // Variable local (sólo en main) printf("%f", arearectangulo(base, altura)); // Llamo a la función y escribo resultado } float arearectangulo(float b, float h) // Aquí describo la función { // Lleva dos variables locales: b, h float area = b * h; return area; }
Haz los ejercicios del 1 y 2 de la página 40 de los apuntes de José María Bea.
Vamos a suponer tú tienes una foto, y que el marco tiene que ser más grande que la foto (o igual de grande). Esta es la lista de marcos disponibles:
Vas a hacer un programa que calcule cuál es el marco más pequeño posible para tu foto. Lo vamos a dividir en tres tareas que me tendrás que entregar independientemente a mi correo electrónico:

Nombra los archivos: entregafuncionestunombre1.c, entregafuncionestunombre2.c, entregafuncionestunombre3.c
El más difícil es el segundo porque no está totalmente definido en el dibujo. Se puede hacer con varios tipos de bucles.