48 - Funciones

Volver al curso



Sacado del tema 7 “Funciones” (pgs 35-42) de José María Bea.


Definición

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.

Funciones con datos de entrada y de salida

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:

  1. Declaración. Debes indicar su nombre y los tipos de datos de entrada y de salida.
  2. Llamada(s). Llamar a una función es hacer que se ejecute su contenido. Puedes llamar una función (ejecutarla) una vez o un millón de veces. Cada vez que lo hagas debes meter las variables de entrada.
  3. Exposición de su contenido. Abajo de todo, fuera de la función main. Haces los cálculos e indicas la variable de salida en la sentencia return.
#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;
}

Ejercicios

Haz los ejercicios del 1 y 2 de la página 40 de los apuntes de José María Bea.

Ejercicio para entregar

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.