4

El problema es este.

Se ingresan los valores de a y c, y se obtienen los resultados de la formula general. si el resultado no es real, se muestra mensaje de error, mi programa fue este.

#include <iostream>
#include <math.h>

using namespace std;
    float A, B, C, F1, F2;
    int main ()
{

cout << "Ingrese A: ";
  cin >> A;
  cout << "Ingrese B: ";
  cin >> B;
  cout << "Ingrese C: ";
  cin >> C;

  F1=(-B + sqrt((B*B)-(4*A*C)))/(2*A);
  F2=(-B - sqrt((B*B)-(4*A*C)))/(2*A);

  cout<< "El valor de F1 es: " << F1;
  cout<< "\nEl valor de F2 es: " << F2;

 return 0;
}

si el resultado no es real, dirá un mensaje con nan, pero yo requiero mandar un mensaje que diga error.

Ya trate declarando nan pero aun así no lo reconoce y sigue mandando el mismo error de nan.

Riaven
  • 3,379
  • 5
  • 14
  • 31

3 Answers3

6

En matemáticas, las soluciones de una ecuación general de segundo grado de la forma a*x^2 + b*x + c = 0 se obtienen de la fórmula general obtenida por Bhaskara: x_1,2 = (-b +- sqrt(b^2-4*a*c))/(2*a), siendo el argumento de la raíz cuadrada el llamado discriminante.

El valor que tome el discriminante, generalmente denotado con la letra griega delta mayúscula (Δ), determina qué tipo de raíces tendrá la ecuación:

*Si Δ>0: las raíces serán reales y distintas.

*Si Δ=0: las raíces serán reales e iguales.

*Si Δ<0 las raíces serán complejas y conjugadas.

En tu caso, basta con corroborar si Δ<0. Si es así, entonces imprimimos el mensaje de error; de lo contrario, mostramos el cálculo completo.

Esto lo podemos lograr de la forma:

#include<iostream>
#include<math.h>

int main()
{
    float A,B,C,F1,F2,discriminante;

    std::cout << "Ingrese A: ";
    std::cin >> A;

    std::cout << "Ingrese B: ";
    std::cin >> B;

    std::cout << "Ingrese C: ";
    std::cin >> C;

    discriminante = pow(B,2) - 4*A*C;

    if(discriminante<0) std::cout << "ERROR";
    else
    {
        F1 = (-B + sqrt(discriminante))/(2*A);
        F2 = (-B - sqrt(discriminante))/(2*A);

        std::cout << "El valor de F1 es: " << F1 << std::endl
                  << "El valor de F2 es: " << F2;
    }

    return EXIT_SUCCESS;
}

¡Espero haber sido de ayuda! Un saludo.

akmsw
  • 520
  • 3
  • 14
4

Si estás programando en no deberías usar cabeceras de si no la versión adaptada a C++. Así que debes substituir la cabecera <math.h> (de C) por la cabecera <cmath>. Lee este hilo para saber más del tema.

Usando la cabecera correcta, puedes hacer uso del objeto std::complex en la cabecera homónima (<complex>); este objeto almacena números complejos y ofrece todas las funciones para trabajar con ellos.

Por lo tanto, si usas números complejos en tu código:

float A, B, C;
cout << "Ingrese A: ";
cin >> A;
cout << "Ingrese B: ";
cin >> B;
cout << "Ingrese C: ";
cin >> C;

auto F1=(-B + sqrt( complex((B*B)-(4*A*C))) )/(2*A);
//                  ^^^^^^^ <--- Número complejo
auto F2=(-B - sqrt( complex((B*B)-(4*A*C))) )/(2*A);
//                  ^^^^^^^ <--- Número complejo

cout<< "El valor de F1 es: " << F1;
cout<< "\nEl valor de F2 es: " << F2;

No obtendrás nunca nan como resultado. Para x2 - 2x -8 las dos soluciones son -2 y 4 y obtienes la siguiente salida:

El valor de F1 es: (4,0)
El valor de F2 es: (-2,-0)

Para 2x2 – 2x + 5 las dos soluciones son imaginarias y obtienes la siguiente salida:

El valor de F1 es: (0.5,1.5)
El valor de F2 es: (0.5,-1.5)

Por lo tanto, para comprobar si el resultado es real, tan sólo debes verificar que no tenga parte imaginaria:

void mostrar(const std::complex<float> &resultado)
{
    if (resultado.imag() != .0f)
        std::cout << "Error, no es un numero real";
    else
        std::cout << resultado.real();
}

Puedes ver el código completo funcionando en Try it online!.

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

Necesitas incluir un condicional para validar el valor del discriminante, es decir la expresión afectada por la raíz cuadrada, si este es menor de cero, mandar un mensaje de que las raíces no son reales y terminar el programa, y si este es mayor o igual a cero continuar con las demás operaciones, algo así:

#include <iostream>
#include <cmath>//*

using namespace std;
float A, B, C, F1, F2;
int main()
{

    cout << "Ingrese A: ";
    cin >> A;
    cout << "Ingrese B: ";
    cin >> B;
    cout << "Ingrese C: ";
    cin >> C;

    //guardando la discriminante en F2 (momentaneamente)
    F2 = (B*B) - (4 * A*C);
    //validando el valor de F2
    if (F2 < 0) {
        cout << "Las raicez no son reales" << endl;
        exit(-1);
    }

    F1 = (-B + sqrt(F2)) / (2 * A);
    F2 = (-B - sqrt(F2)) / (2 * A);

    cout << "El valor de F1 es: " << F1;
    cout << "\nEl valor de F2 es: " << F2;

    return 0;
}
4lrdyD
  • 492
  • 4
  • 10