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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  funcion como argumento a otra funcion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: funcion como argumento a otra funcion  (Leído 5,148 veces)
Dark Invader

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
funcion como argumento a otra funcion
« en: 29 Junio 2011, 00:15 am »

Hola a todos,

Tenía una duda sobre este codigo:
Código
  1. #include <stdio.h>
  2. double inversos(int k);
  3. double cuadrados(int k);
  4. double funcsuma(int n,double (*f)(int k));
  5.  
  6. int main(){
  7. printf("Suma de cinco inversos: %.3f \n",funcsuma(5,inversos));
  8. printf("Suma de tres cuadrados: %.3f \n",funcsuma(3,cuadrados));
  9. }
  10. double funcsuma(int n,double(*f)(int k)){
  11. double s= 0;
  12. int i;
  13. for (i=1;i<=n;i++)
  14. s+=f(i);
  15. return s;
  16. }
  17. double inversos(int k){
  18. return 1.0/k;}
  19. double cuadrados(int k){
  20. return (double) k* k;
  21. }

Resulta que no tengo ni idea de que realiza funcsuma(osea,lo de dentro del codigo si,lo que no entiendo es como luego se puede unir a las otras dos funciones) y porque luego se pone:

Código
  1. printf("Suma de cinco inversos: %.3f \n",funcsuma(5,inversos));
  2. printf("Suma de tres cuadrados: %.3f \n",funcsuma(3,cuadrados));

Si alguien me lo pudiera explicar me haría un gran favor.

Gracias por adelantado.

Un saludo


« Última modificación: 29 Junio 2011, 00:22 am por Dark Invader » En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: funcion como argumento a otra funcion
« Respuesta #1 en: 29 Junio 2011, 01:56 am »

Esta usando un puntero a función.

Código
  1. #include <stdio.h>
  2. double inversos(int k);
  3. double cuadrados(int k);
  4. double funcsuma(int n,double (*f)(int k)); //f es un puntero a funcion
  5.  
  6. int main(){
  7. printf("Suma de cinco inversos: %.3f \n",funcsuma(5,inversos)); //Pasa la direccion de inversos
  8. printf("Suma de tres cuadrados: %.3f \n",funcsuma(3,cuadrados)); //Pasa la direccion de cuadrados
  9. }
  10. double funcsuma(int n,double(*f)(int k)){ //f recibe la dirección de la función
  11. double s= 0;
  12. int i;
  13. for (i=1;i<=n;i++)
  14. s+=f(i); //Llamada a la función correspondiente pasandole el valor de i
  15. return s;
  16. }
  17. double inversos(int k){
  18. return 1.0/k;}
  19. double cuadrados(int k){
  20. return (double) k* k;
  21. }
  22.  

En este caso el valor de retorno y los parámetros son exactamente los mismos por lo que es sencillo hacer una especie de puntero a función "genérico".
Busca sobre punteros a función.

Saludos!


En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: funcion como argumento a otra funcion
« Respuesta #2 en: 29 Junio 2011, 02:17 am »

Si se te complica entender un poco, personalmente me gusta más manejar las cosas así, aunque basicamente es la misma, pero bueno, me ayuda a entender.

Código
  1. #include <stdio.h>
  2. double inversos (int k);
  3. double cuadrados (int k);
  4. double funcsuma (int n, double (*f) (int k)); //f es un puntero a funcion
  5.  
  6. int main ()
  7. {
  8.    double (*pf)(int, double (*)(int)) = &funcsuma;
  9.    printf ("Suma de cinco inversos: %.3f \n", pf(5, inversos)); //Pasa la direccion de inversos
  10.    printf ("Suma de tres cuadrados: %.3f \n", pf(3, cuadrados)); //Pasa la direccion de cuadrados
  11.    return 0;
  12. }
  13.  
  14. double funcsuma (int n, double (*f) (int k))
  15. { //f recibe la dirección de la función
  16.  double s = 0;
  17.  int i;
  18.  for (i = 1; i <= n; i++)
  19.    s += f (i); //Llamada a la función correspondiente pasandole el valor de i
  20.  return s;
  21. }
  22.  
  23. double inversos (int k)
  24. {
  25.  return 1.0 / k;
  26. }
  27.  
  28. double cuadrados (int k)
  29. {
  30.  return (double) k *k;
  31. }
  32.  
« Última modificación: 29 Junio 2011, 02:26 am por Leo Gutiérrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Dark Invader

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: funcion como argumento a otra funcion
« Respuesta #3 en: 29 Junio 2011, 10:19 am »

Gracias a ambos por contestar,he estado buscando y buscando y nada,que no me entra,he encontrado un ejemplo en este mismo foro:

Código
  1. int (*punt) (int,int);
  2.  
  3.  int suma(int a , int b){
  4.     return a+b;
  5.  }
  6.  
  7.  int resta(int a , int b){
  8.     return a-b;
  9.  }
  10.  
  11.  *punt=suma;
  12.   punt(2,3);
  13.  
  14.  *punt=resta;
  15.   punt(5,1);
  16.  

Este lo entiendo bien pero el que puse....Se me hace un poco complicado y eso que he buscado,incluso por youtube para ver si habia algun tutorial pero sin resultados...

Mis dudas principalmente son estas:

Dentro de la funcion double funcsuma (int n, double (*f) (int k))

No se que pinta ahi el f(i),deduzco que f es el puntero pero no se...

Y luego esto:
Código
  1. printf ("Suma de cinco inversos: %.3f \n", pf(5, inversos)); //Pasa la direccion de inversos
  2.    printf ("Suma de tres cuadrados: %.3f \n", pf(3, cuadrados)); //Pasa la direccion de cuadrados

Aunque Leo me ha pasado otro pero sigo sin entenderlo...

Código
  1.    printf ("Suma de cinco inversos: %.3f \n", pf(5, inversos)); //Pasa la direccion de inversos
  2.    printf ("Suma de tres cuadrados: %.3f \n", pf(3, cuadrados)); //Pasa la direccion de cuadrados

Gracias a ambos.

Un saludo
En línea

leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: funcion como argumento a otra funcion
« Respuesta #4 en: 29 Junio 2011, 18:48 pm »

Te dejo el código que use comentado para que se entienda un poco mejor:

Código
  1. #include <stdio.h>
  2. double inversos (int k);
  3. double cuadrados (int k);
  4. double funcsuma (int n, double (*f)(int k));
  5. /* f es un puntero a función que acepta como argumento un int y que devuelve un double */
  6. /* Es la manera correcta de describir ese parámetro en la función funcsuma */
  7.  
  8. int main(void)
  9. {
  10.    double (*pf)(int, double (*)(int)) = &funcsuma;
  11.  
  12.    /* pf es un puntero a función */
  13.    /* pf acepta como argumentos :
  14.  
  15.     {
  16.         un int
  17.         un puntero a función que acepta un int y que devuelve un double
  18.     }
  19.  
  20.     Al puntero a función pf le asignamos la dirección de memoria de la función funcsuma
  21.     De ahí que usemos el operador &, aunque se puede omitir.
  22.  
  23.     */
  24.  
  25.    /* Invocamos a la función funcsuma a través del puntero que acabamos de declarar que apunta hacia ella */
  26.    /* Como puedes ver, utilizamos los mismos argumentos que la función necesita
  27.          int     double (*)(int)
  28.     pf(   5,         &inversos )
  29.  
  30.     Pasamos por referencia la función inversos
  31.  
  32.     */
  33.  
  34.    printf ("Suma de cinco inversos: %.3f \n", pf(5, &inversos)); //Pasa la direccion de inversos
  35.  
  36.    printf ("Suma de tres cuadrados: %.3f \n", pf(3, &cuadrados)); //Pasa la direccion de cuadrados
  37.    return 0;
  38. }
  39.  
  40. double funcsuma (int n, double (*f) (int k))
  41. { //f recibe la dirección de la función
  42.  double s = 0;
  43.  int i;
  44.  for (i = 1; i <= n; i++)
  45.    s += f (i); //Llamada a la función correspondiente pasandole el valor de i
  46.  
  47.    /*
  48.  
  49.     s += f(i);
  50.  
  51.     Se llama a la función correspondiente, según hallamos invocado.
  52.     pf(5, &inversos) -> s += inversos(i);
  53.     pf(3, &cuadrados) -> s += cuadrados(i)
  54.  
  55.     */
  56.  
  57.  
  58.  return s;
  59. }
  60.  
  61. double inversos (int k)
  62. {
  63.  return 1.0 / k;
  64. }
  65.  
  66. double cuadrados (int k)
  67. {
  68.  return (double) k *k;
  69. }
  70.  
En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
Dark Invader

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: funcion como argumento a otra funcion
« Respuesta #5 en: 29 Junio 2011, 20:52 pm »

Osea,que inversos es un puntero a una funcion que acepta un int y devuelve un double¿no?

Y pf guarda la direccion de memoria de funcsuma¿no?

La verdad es que me esta costando aprenderlo,el otro ejemplo que puse que vi por el foro no era tan complicado  >:(

Un saludo y gracias
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines