2
#include <iostream>
using namespace std;
int sumapares = 0;
int sumaimpares = 0;
int main()
{
    for(int numero = 50; numero<=60; numero +2)
    {
        sumapares = sumapares + numero;
    }

    for(int numero = 51; numero<60; numero +2)
    {
        sumaimpares = sumaimpares + numero; 
    }

    cout<<"la suma de los numeros pares es : " << sumapares << endl;
    cout<<"la suma de los numeros impares es : " << sumaimpares << endl;

    system("pause");

    return 0;
}
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
Jesu
  • 173
  • 10

2 Answers2

8

A mi me compila perfectamente.

Problema.

Se queda en un bucle infinito porque los for no hacen avanzar la variable de control numero

Propuesta.

Cambia la instrucción de avance del bucle for por numero += 2:

for(int numero = 50; numero<=60; numero +=2)

...

for(int numero = 51; numero<60; numero +=2)

Posible mejora.

Puedes hacerlo todo en un solo bucle:

for (int numero = 50; numero <=60; ++numero)
{
    (numero % 2 ? sumaimpares : sumapares) += numero;
}

El truco usado en el código anterior es la combinación del operador ternario (?:) con el operador de incremento-asignación (+=) y la conversión implícita de entero a booleano.

El operador ternario (?:) evalúa una expresión y devuelve lo que haya tras el interrogante (?) en caso de que la expresión sea verdadera o lo que haya tras los dos puntos (:) en caso de que sea falsa, lo que no suele saberse es que el operador ternario funciona tanto como valor izquierdo como valor derecho (LValue y RValue1).

En el ejemplo anterior lo usamos de valor izquierdo, dicho valor será sumaimpares si la expresión numero % 2 es verdadera y sumapares en caso de ser falsa. Pero el tipo de numero % 2 es entero ¿Cómo se evalúa como si fuese booleano?

Todo valor numérico se convierte implícitamente a booleano siguiendo la lógica:

  • Falso si es cero.
  • Verdadero si no es cero.

Así pues, la expresión numero % 2 devuelve 1 si el valor no es divisible por 2 (el residuo de dividir un número impar por dos es uno) y 0 si el valor es divisible por 2. Dicho de otra manera: La expresión numero % 2 evaluada como booleana es true si el número es impar y false si el número es par.

Por lo tanto, la expresión (numero % 2 ? sumaimpares : sumapares) será sumaimpares para cada numero impar y sumapares para cada numero par, a una u otra variable se le aplica la operación de incremento-asignación con la variable numero como valor derecho. A grandes rasgos el código sería equivalente a:

for (int numero = 50; numero <=60; ++numero)
{
    int *a_quien_sumo = nullptr;
    if ((numero % 2) != 0)
    {
        a_quien_sumo = &sumaimpares;
    }
    else
    {
        a_quien_sumo = &sumapares;
    }
    (*a_quien_sumo) = (*a_quien_sumo) + numero;
}

A tener en cuenta.

En general, no se aconseja usar using namespace std;, consulta esta pregunta para conocer el por qué.

Por otro lado, el uso de std::endl puede derivar en problemas de rendimiento porque vacía el búfer; aunque en un programa tan sencillo como el tuyo no supondrá ningún problema. Consulta esta pregunta para tener más detalles.


1Puedes consultar más sobre LValue y RValue en esta pregunta.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
6

En las líneas

for(int numero = 51; numero<60; numero +2)

No estas incrementando la variable numero, por lo que queda en un bucle infinito, cambialas a ambas por:

for(int numero = 51; numero<60; numero+=2)

Saludos!

Genarito
  • 2,493
  • 17
  • 43