Concepto de una Función

Una función es un conjunto de instrucciones independientes cuyo objetivo es el de minimizar la complejidad de un problema, descomponiéndolo en subproblemas más fáciles de resolver. Una función debe realizar una tarea específica si le damos a una función más de una puede que no estemos analizando del todo el problema.

Como resultado del conjunto de instrucciones de una función, se han tenido que realizar operaciones y talvez modificación de los datos que la función tenía a disposición, generalmente este resultado se devuelve en forma de valor.

Estábamos familiarizados con el uso de la función principal void main(), que siempre debe de estar en cualquier programa, pero resulta que podemos crear las funciones que nos parezcan necesarias para resolver de un manera más sencilla el problema que estemos tratando.

¿Cuándo utilizar funciones?

Para saber que tareas tenemos que tratarlas como funciones se darán unas pautas a continuación, pero las experiencia en programación será la pauta más exacta.

-          Cuando veamos que secciones o bloques de código se repiten varias veces podemos llevar esta tarea a una función, lo que nos ahora esfuerzo y evita líneas de código repetidas.

-          Cuando necesitemos realizar una operación sobre algún tipo de dato y producto de ello necesitemos un valor de respuesta. Como por ejemplo calcular el cuadrado de un número entero.

Definición de funciones

Una función tiene la siguiente sintaxis:

<tipo> nombreF (parámetros)
{
           cuerpo
         return <expresión>
}

<tipo>           Es el tipo de Dato que devuelve la función. Si se coloca main la función no devuelve ningún valor.

nombreF      Es el nombre que le damos a nuestra función puede ser el que queramos menos la palabras reservadas del lenguaje.

Parámetros  Es un conjunto de variables, las cuales se escriben con su tipo de dato y su nombre, separadas por comas, que vienen a constituir los argumentos de la función.

Cuerpo        Es todo lo que se encuentra entre las llaves {} y contiene un conjunto de sentencias.

return          Esta sentencia se usa si el tipo de dato de retorno no es void. Return devuelve una expresión. Se pueden colocar varios returns a lo largo de un programa y cuando la función encuentra a cualquiera termina.

Ejemplo 11.1

En el siguiente ejemplo se definirá una función para que calcule el área de un triángulo    

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:

#include <iostream.h>
int areaTriangulo( int base, int altura)
{
int area;
area = base * altura / 2;
return area;
}

void main()
{
int baseT = 3, alturaT = 4;
cout<<"El area del triángolo es: "<<areaTriangulo(baseT,alturaT);
}

En la línea 3 podemos ver que el tipo de dato que devolverá la función es un entero (int) que el nombre de la función es areaTriangulo y tienen dos parámetros de tipo entero base y altura.

El cuerpo de la función comprende todas las líneas de código desde la línea 4 hasta la línea 8.

Cuerpo de una función

El cuerpo de una función contiene todas las instrucciones que le permiten realizar su tarea, podemos definir variables cuyo ámbito o vida tendrá duración sólo en el cuerpo de la función (variables locales).

También se puede hacer llamada a otras funciones o declarar tipos de datos definidos por el usuario, en síntesis se puede trabajar en el cuerpo de una función con todas las ventajas que el lenguaje nos ofrece pero orientado a la resolución de un problema específico.

Valor de retorno

Una función después de haber realizado operaciones con los datos que se le proporciona debe de devolver algo, ya sea en forma de un valor o sino haber efectuado alguna modificación con los datos o sino mostrar algo por pantalla.

El valor que devuelve la función se fija con la instrucción return, cuando la función encuentra esa palabra acaba e inmediatamente devuelve el valor que se indica. En el ejemplo 11.1 en la línea 7 se devuelve el valor que contiene la variable area.

Existen funciones que no devuelven ningún valor, estas llevan como tipo de dato de retorno void, pero no significan que no hacen nada, pueden realizar cálculos o simplemente mostrar algo por pantalla.

Ejemplo 11.2

1:
2:
3:
4:
5:
6:

7:

8:

9:

10:

11:

#include <iostream.h>

void mostrar(char nombre[])

{

cout<<nombre;

}

void main()

{

mostrar(“UMSS”);

}

Ámbito de la variables

Variables locales

Todas la variables que se crean dentro de el cuerpo de una función tienen ámbito o vida sólo en el cuerpo mismo de la función, estas variables son llamadas locales. Esto quiere decir que podemos utilizar estas variables sólo en la función pues al terminar esta las variables se destruyen. En el ejemplo 11.1 en la línea 5 se define la variable area, esta variable tiene ámbito sólo en el cuerpo de la función, no podríamos acceder a esta variable desde la función principal o cualquier otra parte del programa.

Variables globales

Las variables globales son definidas fuera de cualquier función, están definidas de un manera parecida a las librerías, de estas forma estas variables tienen un alcance global a todo el programa, esto quiere decir que pueden ser accedidas de cualquier parte del programa, es decir, de cualquier función. Más información

Llamada o Invocación a una función

Una vez escrita la función, podemos utilizarla escribiendo su nombre y luego dándole los parámetros correspondientes:

Sintaxis

         NombreFuncion( parámetros )

En el ejemplo 11.1 en la línea 13 se llama a la función areaTriangulo para que el valor de retorno se muestre directamente por pantalla. En el ejemplo 11.2 se llama a la función mostrar en la línea 10.

El valor que nos retorna una función podemos utilizarlo directamente o sino almacenarlo en alguna variable eso dependerá de nuestros requerimientos o simplemente de nuestra preferencia.

¿Cómo trabaja una función?

Una función es un conjunto de sentencias independientes que se ejecutan cada vez que se llama o invoca a una función. Cada vez que se encuentra una llamada a una función el control del programa se pasa a la función, es decir, la ejecuta y cuando esta acaba entonces el control vuelve a la sección del programa desde donde se hizo la llamada.

En cuanto a los parámetros, en el caso que utilicemos variables, no se debe de pensar de que existe alguna relación entre las variables que se pasan y las que están definidas como parámetros en la función, a menos que las referenciemos. En el ejemplo 11.1 cuando se hace la llamada a la función areaTriangulo se utiliza dos variables baseT y alturaT, estas dos variables nada tienen que ver con las variables que se definieron como parámetros de la función en la línea 13 base y altura, lo que ocurre es que baseT es correspondiente a base al igual que alturaT y altura.

Lo que es importante es que las variables que se pasen sean del mismo tipo que de los parámetros definidos en la función.

Los parámetros de una función

Una función puede tener de 0 a n parámetros y lo más común es que utilice los valores que guardan los parámetros para realizar operación y luego devolver un resultado, este el caso del ejemplo 11.1 en el que la función areaTriangulo tiene dos parámetros enteros base y altura, estas variables contienen los valores a partir de los cuales se calculará el área del triángulo. Debemos tener en cuenta que los parámetros son variables locales, sólo las podemos utilizar dentro de la función.

Paso de parámetros por valor

Esto significa que cuando hacemos la llamada a la función como parámetros le damos valores, si es que colocamos variables como parámetros la función solo toma los valores. En el ejemplo 11.1 en la línea 13 se llama a la función areaTriangulo así:

areaTriangulo(baseT,alturaT)

Cuando el paso de parámetros es por valor viene a ser como si sólo los valores de las variables baseT y alturaT se pasarán como parámetros a la función así:

areaTriangulo(3,4)

En conclusión lo más importante de esto es que después de que se ejecute la función las variables que se le han pasado no sufren ningún cambio.

En el ejemplo 11.1 después de la línea 13, cuando se ha hecho la llamada a la función las variables baseT y alturaT  no habrán cambiado en nada.

Pasa de parámetros por Referencia

En este caso existe un forma de las variables después de haberlas pasado como parámetros en una función sufran cambios, producto de las operaciones que se realizan dentro de la función, para mostrar como funciona esta parte se resolverá el mismo problema que en el ejemplo 11.1 utilizando paso de parámetros por referencia.

Ejemplo11.3

1:
2:
3:
4:
5:
6:

7:

8:

9:

10:

11:

12:

13:

#include <iostream.h>

void areaTriangulo( int &base, int altura)

{

base= base * altura / 2;

}

void main()

{

int baseT = 3, alturaT = 4;

areaTriangulo(baseT,alturaT);

cout<<"El area del triángolo es: "<<baseT;

}

Para que los cambios de un parámetro se reflejen se debe de utilizar el operador de referencia &, en el ejemplo anterior en la línea 3 en la definición de la función se utiliza el operador & que va delante de la variable base, esto quiere decir que lodos los cambios que se hagan sobre esta variable en la función, tendrán efecto en la variable que se utilice al hacer la llamada, baseT en el anterior ejemplo. En la línea 11, se llama a la función:

areaTriangulo(baseT,alturaT);

En este caso la variable baseT es la correspondiente a la variable base de la función areaTriangulo todos los cambios que se realicen en la variable base afectarán a la variable baseT.

Después de la línea 11 la variable baseT habrá cambiado conteniendo el área del triángulo.

¿Por qué ocurre esto?. Porque ya no se pasan simplemente valores sino de pasa un dirección de memoria.

Ejemplo 11.4

Escribir una función que calcule los primeros 10 números primos.

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:

20:
21:
22:
23:

#include <iostream.h>
int esPrimo( int nro)
{
    for(int i=2; i<= nro/2 ; i++)
        if (nro % i == 0)
            return 0;
    return 1;
}

void main()
{
    int nroPrimo = 0, contador = 1;
    while( nroPrimo < 10)
        {
        if (esPrimo(contador))
            {
            nroPrimo++;
            cout<<"El "<<nroPrimo<<"º número primo es: "<<contador<<endl;
            }
        contador++;
        }
}