miércoles, 16 de mayo de 2018

Funciones I: Declaración y Definición





Hola estimados cursantes, hemos llegado a uno de los capítulos más relevantes de este curso y de la programación en general: Funciones. Hasta los momentos se han desarrollados programas que tratan de cumplir con un objetivo o propósito; sin embargo sólo con las herramientas ofrecidas es muy poco probable que se creen aplicaciones complejas óptimas, entendiéndose como óptimo que sean eficiente: usar la menor cantidad de recursos para lograr el objetivo; y eficaz: que la meta se logre en el menor tiempo posible.

Que esto no suene desalentador porque como les he mostrado sí hemos creado programas funcionales, pero ahora vamos a tratar de optimizarlos un poco más. ¿Cómo lograremos esto? Aplicando los conceptos de funciones.

Supongamos que tenemos un programa con 1.000 líneas de código y detectamos dentro de ese código que hay un bloque de instrucciones que se repite en variadas ocasiones en distintas partes del programa. También observamos que si logramos separar ese bloque de instrucciones y lo centralizamos en una zona del programa podemos reducir la cantidad de código del mismo en 800 líneas. ¿Cómo podríamos hacer eso? Pues, la respuesta es con Funciones.

Una función es una estructura que permite agrupar unas instrucciones de nuestro programa la cual ha de estar disponible para ser ejecutado cada vez que es solicitado y que, comúnmente, retorna un valor. Normalmente la lógica que envuelve este segmento código se repite durante todo programa y para evitar su repetición se separa en una función. Veamos cómo trabaja.

Toda función pasa por dos procesos: La declaración y su definición. En la declaración indicamos que tipo de datos ha de retornar y si recibe algún valor como referencia. En la definición se colocan las instrucción que se ejecutarán al ser llamada la función.

La sintaxis para la declaración es:

[tipo de dato] nombre_función ();

y la sintaxis para su definición: 

[tipo de dato] nombre_función (){
   instruccion_1;
   ...
   return [valor, variable];
}

Veamos un ejemplo: 

#include <stdlib.h>
#include <iostream>
using namespace std;

float suma (){

    float valor,num1,num2;
    cout << "Introduzca el numero 1 ";
    cin >> num1;
    cout << "Introduzca el numero 2 ";
    cin >> num2;
    valor = num1 + num2;
    return valor;
}

int main (){
    float resultado;
    resultado = suma ();
    cout << "El resultado es " << resultado;

   return 0;
} 


Analicemos lo siguiente:
  • Se declara y se define la función suma() antes del main(), esto es requerido debido que dentro del main() llamo a la función suma() y si no la he declarado antes dará un error debido que no la encuentra. Recuerden que las instrucciones se ejecutan de forma lineal, entonces no se puede llamar a una función que se desconoce. Por eso se declara y más adelante se hace el llamado. 
  • Se aprovecha la oportunidad para definirla (indicar que instrucciones se ejecutarán). Lo común es que se declare antes del main() y se defina después del main() tal como se verá en el próximo ejemplo. 
  • En la función suma() se declaran las variables num1, num2 y valor. Estas variables son locales de esa función, es decir, solo almacenarán datos y podrá ser manipuladas únicamente desde la función que las declaró, en este caso suma(). Además notemos que la función retorna lo que almacena la variable valor
  • Posteriormente, dentro del main() se declara una variable resultado que recibirá el valor que retornará la función suma(), la cual se llama. No siempre es necesario capturar algún valor de retorno de la función; a veces sólo es requerido que se ejecute algunas instrucciones y ya. 
  • La forma de llamar una función es colocando su nombre, los paréntesis y si recibe parámetros se debe colocar; este no es el caso: Más adelante haremos ejemplos con funciones que reciben parámetros.
Para culminar este capítulo hagamos un ejercicio: Hacer un programa que obtenga los números pares de un rango valores para lo cual se solicita al usuario el inicio y fin de ese rango; mostrando en pantalla los números pares con un mensaje indicando "Este número es par"; la muestra del mensaje se debe hacer mediante una llamada a una función.
#include <stdlib.h>
#include <iostream>
using namespace std;

int mensaje();

int main (){
    int num_min, num_max;
    cout << "Indique el numero minimo del rango ";
    cin >> num_min;
    cout << "Indique el numero maximo del rango ";
    cin >> num_max;

    for (int i = num_min; i <= num_max; i++){
        if ( i % 2 == 0){
            cout << i << " - ";
            mensaje();
            cout << endl;
        }
    }

   return 0;
} 

int mensaje (){
    cout << "Este numero es par";
    return 0;
}


Veamos este ejemplo:
  • A diferencia del primer ejercicio acá de declara la función antes del main() y se define después de él. En la práctica es muy común hacerlo de esta forma. Aunque de ambas maneras es correcto.
  • Se solicita al usuario que indique el valor mínimo y máximo del rango y se recorre cada uno de esos valores con un for inicializando la variables i con num_min hasta que sea mayor a num_max.
  • Con if evaluamos i % 2 == 0, esta operación es una división, pero el resultado obtenido es el residuo de la división. Me explico, al dividir 5 entre 2 obtenemos como resultado 2 con residuo = 1; esto ocurre con todos los números impares; por el contrario con los números pares el residuo siempre será 0. Razón por lo cual comparo el residuo de la operación con 0, si es igual muestro el número con su mensaje. Esta es una técnica para saber si un número es par o impar.
  • Para mostrar el mensaje notemos que primero imprimimos el número, luego llamamos la función mensaje el cual muestra el texto "Este número es par" y posteriormente bajo una línea para darle una buena apariencia. 

Espero que con estos dos ejemplos hayan comprendido el funcionamiento de una función. En el próximo capítulo ahondaremos en ello ya que ahora es que se le puede sacar provecho a las funciones.

0 comentarios:

Publicar un comentario