0

Tengo un problema con un código al implementar una sentencia else if en c++. Lo que pasa es que no evalua correctamente las condiciones que le impongo. Al darle un valor a r=0.26 debería imprimir 'b' pero en su lugar imprime 'c' y no se que esta pasando. Agradezco mucho si alguien me puede ayudar ya que hasta ahora estoy aprendiendo. Gracias.

#include <stdio.h>
#include <iostream>

int main()
{
    double r=0.26;
    if(r<0.25){
        std::cout<<"a";
    }
    else if(0.25<r<0.5){
        std::cout<<"b";
    }
    else if (0.5<r<0.75){
        std::cout<<"c";
    }
    

    return 0;
}

3 Answers3

5

Esta condición:

0.25<r<0.5

No se evalúa como estás pensando, sino de la siguiente manera:

  • Se evalúa 0.25<r. Esta operación devolverá dos posibles valores: 1 (true) y 0 (false). En tu caso, r=0.26, luego devolverá 1.
  • Se evalúa 1<0.5. El 1 sale del punto anterior. En este caso la operación es falsa, luego la condición no se cumple
  • Entonces se evaluará el tercer condicional: 0.5<r<0.75. Volvemos a repetir el proceso: 0.5<0.26 == 0 y 0<0.75 == 1. Por eso se está ejecutando la tercera condición en vez de la segunda

Para concatenar comparaciones debes usar los operadores OR || y AND && de la siguiente manera:

if (0.25 < r && r < 0.5)

En cualquier caso, nota que estás usando if else, es decir, esta estructura de control ejecuta únicamente uno de los dos códigos (el que esté en el if o el que esté en el else, pero nunca ambos a la vez). Es decir, no hace falta evaluar varias veces lo mismo.

Si en el if ya has comprobado que r<0.25, es totalmente innecesario hacer esta evaluación nuevamente en los else. El código te queda más limpio, legible y seguro:

if (r<0.5)
{
  // ...
}
else if (r<0.5)  // damos por hecho que r>=0.25
{
  // ...
}
else if (r<0.75) // damos por hecho que r>=0.5
{
  // ...
}

Por otro lado, date cuenta que estás usando tipos decimales. Hay que tener especial cuidado al comparar números con decimales ya que su representación no es exacta. Para más información te sugiero revisar esta otra pregunta: ¿Por qué mis programas no pueden hacer cálculos aritméticos correctamente?

eferion
  • 49,291
  • 5
  • 30
  • 72
1
#include <stdio.h>
#include <iostream>

int main()
{
    double r=0.26;
    if(r<0.25){
        std::cout<<"a";
    }
    else if(0.25<r && r<0.5){
        std::cout<<"b";
    }
    else if (0.5<r && r<0.75){
        std::cout<<"c";
    }

    return 0;
}

Tu error esta en la condición (0.25<r<0.5) debes usar un and && (0.25<r<0.5) !== (0.25<r && r<0.5)

Iankos
  • 163
  • 7
0

Se trata de un problema conceptual. Cuando estamos programando, concretamente, en sentencias de control como puede ser un if y con bloques else if son exclusivos. Esto quiere decir que si ha llegado al else if, el if de arriba no se ha cumplido por lo que no hace falta comprobarlo de nuevo en el else if.

Te dejo por aquí abajo el código bien estructurado y funcional:

#include <stdio.h>
#include <iostream>

int main()
{
    double r = 0.26;
    
    if ( r < 0.25 ) {
        std::cout<<"a";
    }
    else if ( r < 0.5 ) {
        std::cout<<"b";
    }
    else if ( r < 0.75 ) {
        std::cout<<"c";
    }
    

    return 0;
}

Debes programar acorde a tus necesidades y evitar la repetición de código innecesaria ya que eso solo lleva a más carga computacional. Ahora no se nota, pero con un programa complejo y muy grande, estos pequeños detalles marcan la diferencia.

  • 1
    Tu solucion esta equivocada si el valor de r fuera 0.25 entraria en el b y en el caso propuesto es mayor o mayor o igual. – Iankos Feb 04 '21 at 21:53
  • Es la solución que yo he entendido de acuerdo a como ha planteado el problema. Tampoco especifica que salida concreta quiere. – titianvalero Feb 04 '21 at 21:55
  • 1
    @Iankos tu respuesta da los mismos resultados que esta otra, si esta respuesta está mal, la tuya también – eferion Feb 05 '21 at 07:55