[C++]Numero ilimitado de argumentos en funciones.

Iniciado por huchoko, 21 Octubre 2018, 00:20 AM

0 Miembros y 1 Visitante están viendo este tema.

huchoko

Buenas, tengo este código:
Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

int sum(int num1, int num2);

int sum(int num1, int num2)
{
return num1 + num2;
}

int main()
{
int i = sum(5, 4, 6, 7, 8); // <= como le haria para eso?

cout << i << endl;
}

Pero me gustaría poder pasarle multiples números (argumentos) a la función sum().
Como podría hacer esto?
Saludos  :)

Beginner Web

Me mataste no se,  seguro has programado en otro lenguaje y podias hacerlo y quisiera saber como lo hacias  :silbar:

Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

int sum(int num1, int num2, int num3, int num4, int num5)
{
return num1+num2+num3+num4+num5;
}

int main()
{
cout<<"Suma: "<<sum(5, 4, 6, 7, 8)<<endl;
}
7w7

huchoko

Gracias, pero no es así, me refiero a que el numero de argumentos puede ser infinito.
Te dare un ejemplo en Python:
Código (python) [Seleccionar]

def add(*args): #Sumar (add)
    total = 0
    for value in args:
        total = total + value
        print(total)

print(add(5,3,5,29))
# salida 42
print(add(73,32,32,2))
# salida 139

Beginner Web

#3
Ahora recuerdo que usaba eso con los switchs de esta forma:
Código (cpp) [Seleccionar]
switch(opcion){
case 1 ... 100: sumar(1,2,3,4,5);break;
default: cout<<"Opcion incorrecta"<<endl;
}


Entonces lo que pides es algo asi
Código (cpp) [Seleccionar]
##include <iostream>
#include <stdarg.h>

using namespace std;

void sum(int n, ...)
{
int i, suma=0;
int val;
va_list vl;
  va_start(vl,n);
  for(i=0;i<n;i++){
  val=va_arg(vl,int);
suma+=val;
}
va_end(vl);
cout<<"Suma: "<<suma<<endl;
}

int main()
{
sum(4, 4, 6, 7, 8);//El primer argumento indica cuantos argumentos se sumaran a partir del segundo
}
7w7

huchoko

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?

Dresden

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 (cpp) [Seleccionar]
#include <iostream>
#include <cstdarg>

int sumar(int, ...);

int main()
{
    std::cout << sumar(5, 5, 4, 6, 7, 8) << '\n';
    return 0;
}

int sumar(int nNumeros, ...)
{
    va_list numeros;
    va_start(numeros, nNumeros);

    int suma = 0;
    for (int i = 0; i < nNumeros; ++i)
    {
        suma += va_arg(numeros, int);
    }

    va_end(numeros);
    return suma;
}


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

Código (cpp) [Seleccionar]
#include <iostream>
#include <vector>

int sumar(const std::vector<int> &);

int main()
{
    int suma = sumar({ 5, 4, 6, 7, 8 });
    std::cout << suma << '\n';

    return 0;
}

int sumar(const std::vector<int> &numeros)
{
    int suma = 0;

    for (const int &num : numeros)
    {
        suma += num;
    }
    return suma;
}


Código (cpp) [Seleccionar]
#include <iostream>

template <typename T>
T sumar(T inicio)
{
    return inicio;
}

template <typename T, typename... Nums>
T sumar(T inicio, Nums... nums)
{
    return inicio + sumar(nums...);
}

int main()
{
    const int suma = sumar(5, 4, 6, 7, 8);
    std::cout << suma << '\n';
    return 0;
}
PROGRAMMER
noun. [pro-gram-mer]
Someone who solves a problem
you didn't know you had, in a way
that you don't understand.

See also wizard, magician.

huchoko

Muchas gracias, va a la perfección.
Saludos  :)

CalgaryCorpus

Para complementar la respuesta dada previamente, si tienes un vector de enteros v, una manera de sumarlos es esta:

Código (cpp) [Seleccionar]
suma = accumulate(v.begin(), v.end(), 0)

Tienes que agregar

Código (cpp) [Seleccionar]
#include <numeric>
Aqui mi perfil en LinkedIn, invitame un cafe aqui