[Multi]C++ Las funciones

Hoy es un dia grande, vamos a empezar a crear bloques de codigo.(y porfin los efectos de la fiesta empiezan a remitir... [carcajad] )

En los comienzos de los lenguajes de programacion, se usaba la programacion lineal. Esto es: se identificaba cada linea del programa con una numeracion, el programa se ejecutaba de arriba a abajo y se podian hacer saltos identificando el numero de linea a la que se queria hacer el salto.A la hora de implementar funciones a un programa esto era una putada pues habia que retocar todos los saltos que tuvieramos pues los numeros que referenciabamos podian haber cambiado. Debido a esto y otros problemas se creo un nuevo tipo de diseño de programacion: la programacion estructurada. Esto nos permite poner identificadores a bloques de codigo y quitar su dependencia de la ejecucion. Osea que es como estar trabajando en algo y tener una mochila con las diferentes cosas que vamos a necesitar y solo usar aquellas que necesitemos en cada momento particular (para los programadores mas avanzados: ya se que este ejemplo se parece mas a la P.O.O. pero no me sale uno mejor).

Funciones
Como he puesto mas arriba son bloques de codigo encapsulados por {}. Puede devolver valores , asi que pudieran ser como supervariables, pues pueden devolver diferentes valores dependiendo de lo que haya ocurrido dentro de su bloque de codigo. Tambien aceptan parametros. Un parametro es una variable que le damos a la funcion para poder trabajar. pueden tener de 0 a n parametros pudiendo ser estos de cualquier tipo (vease apartado las variables). La respuesta de una funcion tambien puede ser de cualquier tipo, la diferencia con los parametros es que solo devuelve uno o ninguno(void) (como aun no hemos visto los structs ni las clases esto es cierto).

Sintaxis:
tipoDevuelto nombreFuncion (tipoParam nombreParam,........){
......
}

Prototipo:
Un ejemplo: si yo ahora os preguntase cuanto dinero os van a costar los libros de estudios del año que viene, no sabriais decirme pues aun no sabeis que libros llevareis, pero si os hubieran dado un papel con los libros usados en los diferentes cursos ahora podriais decirme cuanto os van a costar. Pues en C++ hay que decirle al programa que van a llevar las funciones antes de empezar a usarlas. Existen dos formas, declarar totalmente antes de la llamada o usar prototipos.
Un prototipo es una linea de codigo que especifica los valores tomados y devueltos de una funcion. Aqui esta la pega de C++. Si nosotros hacemos una llamada a una funcion antes de ser definida nos dara un error el programa.
Sintaxis
tipoDevuelto nombreFuncion (tipoParam nombreParam,........);

Fijaos como no lleva las {} y esto es porque aqui lo unico que se hace es preparar la memoria para los datos recibidos y el dato devuelto, asi aun cuando no sepamos que hace esa funcion ya podremos invocar valores y meterlos en la memoria.

Valores por defecto
A la hora de definir una funcion podemos especificar valores por defecto para los parametros. De esta manera podemos crear funciones de mas facil uso, pues la podemos invocar sin valores y el propio programa se los dara o incluso ir especificando valores. Si bien esto ahora no es de mucha utilidad cuando lleguemos a las clases esto sera un gran recurso para asegurarnos que todo toma valores logicos, pero el mal uso o abuso de esto puede llevar a errores de dificil interpretacion . Dentro de un programa puede haber dos tipos de errores, de sintaxis y logicos. Los primeros son faciles de averiguar porque el 90% nos los chivara el compilador, sin embargo un error logico supone malfuncionamientos y datos devueltos erroneos asi que ¡¡Revisad bien la logica!!. Para corregir este tipo de errores lo que se suele hacer es antes de empezar la codificacion de un programa , se plasman estas partes peliagudas en papel (organigramas, diagramas, pseudocodigo...).
Sintaxis
tipoDevuelto nombreFuncion (tipoParam nombreParam = valorPorDefecto,........){}

Parametros
Un parametro es un valor que se manda con la llamada a la funcion.

LLamadas
Nosotros podremos hacer llamadas a las funciones dentro de otras , pero no definir funciones dentro de funciones. Un ejemplo de llamada seria
nombreFuncion(variable o valor,.....);

Como tambien pueden devolver datos tambien se pueden llamar asi
tipo a;
a = funcion(valor,...);

Y entonces en a se alamcenara el valor devuelto por la funcion.

Return
Se escribe en minusculas y lo que hace es terminar la funcion y devolver un valor.

return 1;
return 'n';
return "lo que me de la gana";
return variable;

Bueno basta ya de teoria, esto es solo un primer camino pues aun quedan muchas cosas en el tintero que despues se ampliara con una nueva leccion.El ejemplo es tan facil como inutil pero al menos os enseña el uso de ellas.

#include <stdio.h>
    #include <conio.h>

    //Empezamos con los prototipos
    int suma(int a,int b);
    int resta(int a, int b);
    int multiplicacion(int a,int b);
    float division(float a, float b);

    void main(){ //Como veis main es una funcion que devuelve void osea nada y que tampoco recibe ningun parametro (esto cambiara mas adelante)
        int a,b;
        printf_s ("Por favor introduzca el valor a:");
        scanf_s ("%d",&a);
        printf_s("Por favor introduzca el valor b:");
        scanf_s("%d",&b);
        printf_s("\nEl valor de su suma es:%d",suma(a,b));
        printf_s("\nEl valor de su resta es:%d",resta(a,b));
        printf_s("\nEl valor de su producto es:%d",multiplicacion(a,b));
        printf_s("\nEl valor de su division es:%f",division((float)a,(float)b));
        getch(); //Espera a que pulsemos una tecla, por esta funcion hay que hacer #include <conio.h>
    }
    int suma(int a, int b){
        return a+b;
    }
    int resta(int a, int b){
        return a-b;
    }
    int multiplicacion(int a, int b){
        return a*b; //Cuidado con los valores de a y b pues si son muy grandes produciremos un desbordamiento
    }
    float division(float a, float b){
        return a/b;
    }
ta muy bien, kizas muy para principiantes... podrías explicar un poco el uso de funciones recursivas en el proximo tuto y cosas así en realidad solo le he hechado un vistazo por encima porque me lo se todo... :) tb te aconsejaría que explicases el tiempo de vida de variables etc... y los valores por defecto de funciones


//prototipo

int suma ( int v1, int v2=0){
    return v1+v2
}

//dos llamadas
int i1=2,i2=3,ires;
ires=suma(i1);(devolvería i1)
ires=suma(i1,i2); (devolvería la suma )



por cierto esto no me acuerdo si se podía hacer con funciones normales o solo con funciones de objeto, creo que se puede con las dos aun así si alguien le hecha un vistazo que diga si está bien...
Muchas gracias por el tuto me vendrá muy bien :)
2 respuestas