Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: huchoko en 21 Octubre 2018, 00:20 am



Título: [C++]Numero ilimitado de argumentos en funciones.
Publicado por: huchoko en 21 Octubre 2018, 00:20 am
Buenas, tengo este código:
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int sum(int num1, int num2);
  6.  
  7. int sum(int num1, int num2)
  8. {
  9. return num1 + num2;
  10. }
  11.  
  12. int main()
  13. {
  14. int i = sum(5, 4, 6, 7, 8); // <= como le haria para eso?
  15.  
  16. cout << i << endl;
  17. }
  18.  
Pero me gustaría poder pasarle multiples números (argumentos) a la función sum().
Como podría hacer esto?
Saludos  :)


Título: Re: [C++]Numero ilimitado de argumentos en funciones.
Publicado por: Beginner Web en 21 Octubre 2018, 01:24 am
Me mataste no se,  seguro has programado en otro lenguaje y podias hacerlo y quisiera saber como lo hacias  :silbar:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int sum(int num1, int num2, int num3, int num4, int num5)
  6. {
  7. return num1+num2+num3+num4+num5;
  8. }
  9.  
  10. int main()
  11. {
  12. cout<<"Suma: "<<sum(5, 4, 6, 7, 8)<<endl;
  13. }


Título: Re: [C++]Numero ilimitado de argumentos en funciones.
Publicado por: huchoko en 21 Octubre 2018, 01:44 am
Gracias, pero no es así, me refiero a que el numero de argumentos puede ser infinito.
Te dare un ejemplo en Python:
Código
  1. def add(*args): #Sumar (add)
  2.    total = 0
  3.    for value in args:
  4.        total = total + value
  5.        print(total)
  6.  
  7. print(add(5,3,5,29))
  8. # salida 42
  9. print(add(73,32,32,2))
  10. # salida 139
  11.  


Título: Re: [C++]Numero ilimitado de argumentos en funciones.
Publicado por: Beginner Web en 21 Octubre 2018, 02:01 am
Ahora recuerdo que usaba eso con los switchs de esta forma:
Código
  1. switch(opcion){
  2. case 1 ... 100: sumar(1,2,3,4,5);break;
  3. default: cout<<"Opcion incorrecta"<<endl;
  4. }

Entonces lo que pides es algo asi
Código
  1. ##include <iostream>
  2. #include <stdarg.h>
  3.  
  4. using namespace std;
  5.  
  6. void sum(int n, ...)
  7. {
  8. int i, suma=0;
  9. int val;
  10. va_list vl;
  11.   va_start(vl,n);
  12.   for(i=0;i<n;i++){
  13.   val=va_arg(vl,int);
  14. suma+=val;
  15. }
  16. va_end(vl);
  17. cout<<"Suma: "<<suma<<endl;
  18. }
  19.  
  20. int main()
  21. {
  22. sum(4, 4, 6, 7, 8);//El primer argumento indica cuantos argumentos se sumaran a partir del segundo
  23. }
  24.  


Título: Re: [C++]Numero ilimitado de argumentos en funciones.
Publicado por: huchoko en 21 Octubre 2018, 02:11 am
Gracias, funciona pero si cambio los numeros que se le pasan a sum(), se queda pegado mostrando 30, sin importar que numero le pongas.
... y depurando esto es lo que le pasa a la variable suma que esta en el for:
5
10
15
20
25
30.
No tiene sentido sinceramente que eso pase?


Título: Re: [C++]Numero ilimitado de argumentos en funciones.
Publicado por: Dresden en 21 Octubre 2018, 02:17 am
En este caso, el primer número indica la cantidad de elementos de la lista. Compila con el estándar C++ 98 en adelante:

Código
  1. #include <iostream>
  2. #include <cstdarg>
  3.  
  4. int sumar(int, ...);
  5.  
  6. int main()
  7. {
  8.    std::cout << sumar(5, 5, 4, 6, 7, 8) << '\n';
  9.    return 0;
  10. }
  11.  
  12. int sumar(int nNumeros, ...)
  13. {
  14.    va_list numeros;
  15.    va_start(numeros, nNumeros);
  16.  
  17.    int suma = 0;
  18.    for (int i = 0; i < nNumeros; ++i)
  19.    {
  20.        suma += va_arg(numeros, int);
  21.    }
  22.  
  23.    va_end(numeros);
  24.    return suma;
  25. }

Estos compilan con el estándar C++ 11 o superior:

Código
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. int sumar(const std::vector<int> &);
  5.  
  6. int main()
  7. {
  8.    int suma = sumar({ 5, 4, 6, 7, 8 });
  9.    std::cout << suma << '\n';
  10.  
  11.    return 0;
  12. }
  13.  
  14. int sumar(const std::vector<int> &numeros)
  15. {
  16.    int suma = 0;
  17.  
  18.    for (const int &num : numeros)
  19.    {
  20.        suma += num;
  21.    }
  22.    return suma;
  23. }

Código
  1. #include <iostream>
  2.  
  3. template <typename T>
  4. T sumar(T inicio)
  5. {
  6.    return inicio;
  7. }
  8.  
  9. template <typename T, typename... Nums>
  10. T sumar(T inicio, Nums... nums)
  11. {
  12.    return inicio + sumar(nums...);
  13. }
  14.  
  15. int main()
  16. {
  17.    const int suma = sumar(5, 4, 6, 7, 8);
  18.    std::cout << suma << '\n';
  19.    return 0;
  20. }


Título: Re: [C++]Numero ilimitado de argumentos en funciones.
Publicado por: huchoko en 21 Octubre 2018, 02:27 am
Muchas gracias, va a la perfección.
Saludos  :)


Título: Re: [C++]Numero ilimitado de argumentos en funciones.
Publicado por: CalgaryCorpus en 21 Octubre 2018, 18:30 pm
Para complementar la respuesta dada previamente, si tienes un vector de enteros v, una manera de sumarlos es esta:

Código
  1. suma = accumulate(v.begin(), v.end(), 0)

Tienes que agregar

Código
  1. #include <numeric>