Funciones

Iniciado por FKT, 23 Agosto 2015, 17:14 PM

0 Miembros y 2 Visitantes están viendo este tema.

FKT

Hola, quiero hacer un programa con funciones, se más o menos como funcionan pero necesito saber que significa el retorno y como funciona.
Siempre he tenido la necesidad de saber como funciona algo pero desde la raíz.
Si alguien puede explicarme como funciona para que sirve y algunos detalles más.

(Hize un tema referido a los retornos pero no me quedo claro, y me vuelve ha surgir la misma duda)

Gracias.
Solo hay 10 tipos de personas, las que saben binario y las que no.

avesudra

#1
El valor de retorno es lo que te devuelve la función.

Imagina que has programado la función multiplicarPorDos y que recibe un parámetro. El valor de retorno es la respuesta que esa función da a los datos que se le proporcionan.

Ejemplos:

multiplicarPorDos(2) ----------> Valor de retorno: 4
multiplicarPorDos(5) ----------> Valor de retorno: 10
multiplicarPorDos(7) ----------> Valor de retorno: 14

¿Cómo funciona? Pues así de sencillo(este programa imprime el valor devuelto por la función multiplicarPorDos)


#include <stdio.h>

int multiplicarPorDos(int argumento);

int main(int argc, char **argv)
{
    int valorDevuelto;

    valorDevuelto = multiplicarPorDos(4);

    printf("%d", valorDevuelto);

    return 0;
}

int multiplicarPorDos(int argumento)
{
   return argumento * 2;
}


Las funciones son algoritmos generalmente pequeños, que resuelven problemas concretos a partir de unos datos proporcionados. Las soluciones se pueden dar a través del valor de retorno o a través de parámetros (como punteros).
Regístrate en

engel lex

Las funciones puedes separarlas como

Tipo Nombre(parametros){//aqui inicia
 Acciones
 Retorno //si no es void
}//aqui cierra

El tipo, es el tipo de valor que retornará, void, implica que no retorna nada

el nombre no debe contener espacios, caracteres especiales y no debe iniciar en número

Los parámetros son las variables que se le pasarán, el nombre es como se representarán dentro de la función y si tipo debe coincidir con el original

Las funciones tienen un "alcance" al que se le llama "scope" esto representa que verán y que no, al estar aparte del main, normalmente desconocen cualquier referencia a toda variable declarada allí

Por ultimo el retorno, es simplemente un valor que devolverán, si la función es asignada a una variable ejemplo

Código (cpp) [Seleccionar]
int variable = funcion_algo();

La variable contendrá lo que sea que la funcion retorne

Algo importante de recordar, el retorno es el fin de la función, si se hace la función termina

Código (cpp) [Seleccionar]
int ejecutar (){
int a = 1;
return a;
Esto_nunca_pasara();
}
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

FKT

Entiendo, entonces de momento lo único que no he entendido de lo que me habéis explicado es:
Lo que se pone entre "(Aquí)", los parámetros, son las variables que se podrán utilizar en main¿?
Solo hay 10 tipos de personas, las que saben binario y las que no.

engel lex

los parámetros que van entre paréntesis son los valores que recibirá la función

Código (cpp) [Seleccionar]
int suma(int sumando1, int sumando2){
  int resultado = sumando1 + sumndo2;
  return resultado;
}


El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

FKT

Vale... Y porque en la función principal no se pone?

     

int main(r1, r2)

   int resultado = r1 + r2;

   return resultado;
}


Y otra cosa, para que necesitamos que los programas retornen un valor que no sea 0¿?
Eso indica que el problema ha finalizado con errores no es así?
Solo hay 10 tipos de personas, las que saben binario y las que no.

engel lex

#6
ahh sobre main!

el main tiene 2 parámetros predispuestos por el compilador, puedes usarlos o no...


cuando el programa se compila, a main se le pasan 2 valores

Código (cpp) [Seleccionar]
int argc, char **argv

el primero es un entero que indica la cantidad de argumentos pasados por consola (siempre será por lo menos 1 ya que el primero es el programa en si mismo) el segundo es un array que contiene uno o más char array con los argumentos (como dije el primero será el programa)

ejemplo en consola escribes

programa.exe

el ejecutará tu programa y argc será 1 y argv[0] será "programa.exe"

si ejecutas
programa.exe parametro1 parametro2

el ejecutará tu programa y argc será 3, argv[0] será "programa.exe", argv[1] será "parametro1" y argv[2] será "parametro2"

por eso solo se usan esos valores...

el return de main tiende a ser siempre 0, en este casi para la consola "0" significa todo bien...

siem embargo puedes hacer un programa suma.exe que retorne un valor diferente a 0, esto sería para que otro programa llamara a "suma.exe" y su valor de ejecución sería el que quieras... (sería similar a tu ejemplo, solo que los numeros a sumar sería argv[1] y argv[2])

muchas veces algo diferente de 0 tambien significa error (y el numero es el numero de error)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Orubatosu

#7
Piensa en la función como en un bloque de código separado, que no tiene ninguna conexión con el principal (es mas sencillo así)

Consideralo un programa autónomo y separado, al que le suministras una serie de datos (los parámetros) y te devuelve un resultado (el retorno)

Los parámetros son variables que están en el programa principal, que puedes pasar para que maneje como una copia o directamente (eso quizás no has llegado a verlo). Por ahora imagina que solo le envías una copia de esos valores

Es decir, la función es un programa separado, con sus propias variables y constantes si las necesitara, que están completamente aislada del programa principal. De hecho, desde la función las variables del programa principal son invisibles, y las que uses en la función no existen fuera de la misma.

Cuando tienes el resultado deseado, devuelves el control al programa, y lo devuelves en forma de un resultado. Ese resultado es el que pones como "retorno"

Lo bueno es que no tiene que ser uno solo, puedes programar mas de un retorno dependiendo de lo que quieras.

Solo tienes que ser cuidado de que el tipo de función y el resultado tienen el mismo tipo (entero, coma flotante, caracter, booleano, etc).

Mira, un ejemplo cutre y pedreste

Código (cpp) [Seleccionar]
// vocal o consonante
#include <iostream>
using namespace std;

bool vocal(char n){
   if (n == 65 || n == 97 || n == 69 || n == 101 || n == 73 || n == 105 || n == 79 || n == 111
    || n == 85 || n == 117){
    return true;
    } else {return false;
    }
}

int main () {
   char c;
   int n;
   cout << "Introduce un caracter ";
   cin >> c;
   n = int(c);
   cout << "El caracter es :";
   if (vocal (c)){
       cout << " vocal";
   }else {
   cout << " consonante";}
}


Código (cpp) [Seleccionar]
bool vocal(char n)

Bool es el típo de resultado que devuelve la función. "vocal" es el nombre de la función, y entre paréntesis está "char n". Eso quiere decir que la función recibe un parámetro desde el programa principal, que es de tipo caracter, y que dentro de la función llamaremos "n"

Luego, en el programa hacemos esto:

Código (cpp) [Seleccionar]
if (vocal (c))

Tenemos un "if", y como condición tenemos la función (podemos hacerlo porque la función devuelve un booleano). "c" es el nombre de la variable que usamos en el programa principal.

No hay mas misterio. Desde el programa cogemos un caracter "c" y en la función usamos "n", porque al ser programas distintos a efectos prácticos el nombre de la variable es irrelevante.

Al margen de esto, es posible que una función manipule los parámetros, pero eso lo verás mas adelante

De hecho, es posible, y se hace en otros lenguajes que esas funciones estén incluso en ficheros separados. Piensa siempre en las funciones como en otro programa, que accidentalmente está en la misma "hoja" que el principal, pero que no se relaciona con el mismo mas que a través de parámetros y retorno.
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

FKT

#8
Para: egel lex.

No, lo estabas explicando bien jeje estaba hablando de las funciones que no son de int main(), lo que estaba preguntando es porque si en una funcion que no es main() no se declaran las variables en los parametros también?, aparte de que me has aclarado algunas dudas, has echo que me surgan otras como por ejemplo que es un array y que significan los "**" de argv?, es lo mismo si pones los parametros o no en una función main()?

Para: Orubatosu.

Cuando dices que me devuelve un resultado (el retorno) es para que en tu función principal puedas llamar a tu subprograma?
Y si por ejemplo fuera un subprograma con void, para que sirve si no puedes llamarlo en main() ya que su retorno es 0?
             
Citar

Solo tienes que ser cuidado de que el tipo de función y el resultado tienen el mismo tipo (entero, coma flotante, caracter, booleano, etc).


O no lo entiendo o lo has escrito mal, te refieres a que no puedo tener dos funciones que se llamen "int funcion" o que no puedo hacer dos funciones con el mismo tipo de dato?

Ahora leyendo tu ejemplo lo he entendido pero he seguido y al final me has liado jeje.
Aver como has dicho es un programa "paralelo", pues que pinta el:
         n = int(c)

si "C" es un caracter.

Y lo que no entiendo es lo que conecta los dos programas es solo el retorno o el parametro también?

(Uso C y no C++) así que me cuesta un poco mas entenderlo.
Solo hay 10 tipos de personas, las que saben binario y las que no.

Orubatosu

Bueno, C++ y C son muy muy parecidos, lo que vale en C vale en C++ en principio.

A ver, una función void puede funcionar perfectamente, por ejemplo en casos donde la función trabaja directamente con valores del programa principal. Eso es lo que se llama "pasar valores por referencia" (de momento no te preocupes por eso) y que entre otras utilidades tiene la de ahorrar memoria. Eso es así, porque al pasar un valor como argumento a la función, lo que haces es crear una copia de esa variable, usarla en la función y destruirla al finalizar esa función.

Esto es irrelevante cuando lo que pasas como argumento es un entero, o un caracter. En cambio si pasas (por ejemplo) un vector de 1000 elementos la cosa cambia mucho (un vector es un contenedor, una clase de C++). Bueno, ese no es el tema.

Puedes tener las funciones que quieras, pero siempre hay que asegurarse de que el valor que devuelves sea del mismo tipo que la función.

Es decir, si tu función empieza así:

int nombredefunción(int a, int b)

El valor que devuelves en return debe de ser de tipo entero. No de otro, en ese caso probablemente ni siquiera compile.

Mi ejemplo usa  boolean porque es un caso donde creo se ilustra mejor como trabajan las funciones. Si en mi ejemplo hago un "return x" donde "x" es un entero, daría fallo.

El "n = int(c)" convierte a entero el valor ascii del caracter introducido por CIN. Eso es C++, no se si en C funciona igual lo de la conversión de tipos (en Java es igual)

El retorno de la función, es un valor "true" o "false". Un "If" requiere entre los parentesis una expresión booleana, por ejemplo:

"If (a < b)...."

El contenido de los parentesis debe de ser una expresión de ese tipo, o por ejemplo:

"If (true) "...

En este caso, el if se cumple siempre

por lo tanto

Código (cpp) [Seleccionar]
if (vocal (c))

Quiere decir: "Si el retorno de la función "vocal" con el parámetro "c" es true"

Espero que haya quedado claro, si no pregunta
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998