#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;
}
- 44,474
- 6
- 44
- 82
- 173
- 10
-
3[tag:javascript], [tag:css]? – lois6b Apr 05 '17 at 14:39
-
@lois6b quizá usa un compilador online jajaja – UselesssCat Apr 05 '17 at 14:40
-
como así? arie. No entiendo lo que dices. – Jesu Apr 05 '17 at 14:41
-
Era una broma en referencia a las etiquetas Javascript y css, ninguno tiene nada que ver con C++. Por otro lado, Puedes agregar el error que te da al compilar? – UselesssCat Apr 05 '17 at 14:42
2 Answers
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.
- 44,474
- 6
- 44
- 82
-
-
-
@ArieCwHat efectivamente funciona. Puedes comprobarlo en tu compilador. El operador ternario no devuelve valores si no expresiones así que devuelve una u otra variable (no su contenido). En el ejemplo *equivalente* (que no igual) uso punteros, no referencias. – PaperBirdMaster Apr 12 '17 at 06:22
-
@ArieCwHat revisa tu código, porque [**funciona perfectamente**](https://wandbox.org/permlink/wk4CINbWbSVvRyWz). – PaperBirdMaster Apr 12 '17 at 13:56
-
-
@ArieCwHat ahora que lo comentas es cierto... lo siento :( se me da **muy mal** revisar código *encasquetado* en comentarios y se me pasó por alto lo que mencionas. – PaperBirdMaster Apr 12 '17 at 14:12
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!
- 2,493
- 17
- 43