elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Funciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Funciones  (Leído 3,973 veces)
FKT

Desconectado Desconectado

Mensajes: 221



Ver Perfil
Funciones
« en: 23 Agosto 2015, 17:14 pm »

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.


En línea

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


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Funciones
« Respuesta #1 en: 23 Agosto 2015, 17:31 pm »

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)

Código
  1. #include <stdio.h>
  2.  
  3. int multiplicarPorDos(int argumento);
  4.  
  5. int main(int argc, char **argv)
  6. {
  7.     int valorDevuelto;
  8.  
  9.     valorDevuelto = multiplicarPorDos(4);
  10.  
  11.     printf("%d", valorDevuelto);
  12.  
  13.     return 0;
  14. }
  15.  
  16. int multiplicarPorDos(int argumento)
  17. {
  18.    return argumento * 2;
  19. }

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).


« Última modificación: 23 Agosto 2015, 17:34 pm por avesudra » En línea

Regístrate en
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Funciones
« Respuesta #2 en: 23 Agosto 2015, 17:33 pm »

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
  1. 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
  1. int ejecutar (){
  2. int a = 1;
  3. return a;
  4. Esto_nunca_pasara();
  5. }
En línea

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

Desconectado Desconectado

Mensajes: 221



Ver Perfil
Re: Funciones
« Respuesta #3 en: 23 Agosto 2015, 18:41 pm »

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¿?
En línea

Solo hay 10 tipos de personas, las que saben binario y las que no.
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Funciones
« Respuesta #4 en: 23 Agosto 2015, 18:59 pm »

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

Código
  1. int suma(int sumando1, int sumando2){
  2.  int resultado = sumando1 + sumndo2;
  3.  return resultado;
  4. }

En línea

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

Desconectado Desconectado

Mensajes: 221



Ver Perfil
Re: Funciones
« Respuesta #5 en: 23 Agosto 2015, 19:37 pm »

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

      
Código
  1.  
  2. int main(r1, r2)
  3.  
  4.    int resultado = r1 + r2;
  5.  
  6.    return resultado;
  7. }
  8.  
  9.  
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í?
En línea

Solo hay 10 tipos de personas, las que saben binario y las que no.
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Funciones
« Respuesta #6 en: 23 Agosto 2015, 19:44 pm »

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
  1. 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

Código:
programa.exe

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

si ejecutas
Código:
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)
« Última modificación: 23 Agosto 2015, 19:45 pm por engel lex » En línea

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


Desconectado Desconectado

Mensajes: 2.515


Ver Perfil WWW
Re: Funciones
« Respuesta #7 en: 23 Agosto 2015, 19:49 pm »

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
  1. // vocal o consonante
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. bool vocal(char n){
  6.    if (n == 65 || n == 97 || n == 69 || n == 101 || n == 73 || n == 105 || n == 79 || n == 111
  7.     || n == 85 || n == 117){
  8.     return true;
  9.     } else {return false;
  10.     }
  11. }
  12.  
  13. int main () {
  14.    char c;
  15.    int n;
  16.    cout << "Introduce un caracter ";
  17.    cin >> c;
  18.    n = int(c);
  19.    cout << "El caracter es :";
  20.    if (vocal (c)){
  21.        cout << " vocal";
  22.    }else {
  23.    cout << " consonante";}
  24. }

Código
  1. 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
  1. 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.
« Última modificación: 23 Agosto 2015, 19:50 pm por Orubatosu » En línea

"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998
FKT

Desconectado Desconectado

Mensajes: 221



Ver Perfil
Re: Funciones
« Respuesta #8 en: 23 Agosto 2015, 20:40 pm »

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:
          
Código
  1. 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.
« Última modificación: 23 Agosto 2015, 20:47 pm por FKT » En línea

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


Desconectado Desconectado

Mensajes: 2.515


Ver Perfil WWW
Re: Funciones
« Respuesta #9 en: 23 Agosto 2015, 21:47 pm »

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
  1. 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
En línea

"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PHP y funciones tcp/ip « 1 2 »
PHP
nacho2003 11 7,392 Último mensaje 21 Septiembre 2006, 00:07 am
por deya
Funciones en php
PHP
Lambda 2 2,500 Último mensaje 14 Octubre 2006, 17:00 pm
por Thaorius
funciones y FOR
PHP
pepelon 4 2,221 Último mensaje 9 Diciembre 2006, 02:49 am
por pepelon
[C] Problema con Struct en funciones que llaman a otras funciones
Programación C/C++
‭lipman 9 23,524 Último mensaje 19 Mayo 2011, 23:39 pm
por Littlehorse
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines