Corrección de ejercicio

Iniciado por Soulklax, 5 Noviembre 2016, 20:25 PM

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

Soulklax

Quisiera que alguien me diga si este ejercicio esta bien os lo pongo:
P4-2: Calcular las raíces de una ecuación de segundo grado ax^2+bx+c=0 con coeficientes
enteros
Las raíces vienen determinadas por la ecuación:
(la expresión de una ecuación de segundo grado)
La función sqrt() de la librería matemática extrae la raíz cuadrada de un número positivo. Para
poder usarla añade la cabecera #include <cmath> al fichero fuente.
Para extraer la raíz de un número negativo debes cambiarlo previamente de signo (multiplicarlo por (-
1)) y tener en cuenta a partir de ese momento la naturaleza imaginaria del resultado.
El programa considerará todos los casos particulares: que a sea 0 (la ecuación no es de 2º grado y
así evitamos dividir por 0), que a y b sean 0 (absurdo), que el discriminante sea 0 (raíz doble real), etc.
Donde sea necesario debes usar static_cast<double>(variable)para obtener los resultados
correctos y evitar así obtener la división entera en lugar de la correcta en coma flotante.
Código (cpp) [Seleccionar]

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int b,a,c,disc;
    int raiz;
    cout <<"Introduce un valor para b: ";
    cin >> b;
    cout <<"Introduce un valor para a: ";
    cin >>a;
    cout<<"Introduce un valor para c: ";
    cin >>c;
    if(a==0&& b==0){
     cout <<"Absurdo"<<endl;
     return 0;}
    else if(a==0){
        cout<<"No es una ecuacion de segundo grado"<<endl;
        return 0;}
    disc=(b*b)-(4*a*c);
    if (disc<0){
        disc=-1*disc;
        raiz=sqrt(disc);
        cout<<"x1="<<raiz<<" x2="<<"-"<<raiz<<"i"<<endl;
        return 0;
    }
    else
        raiz=sqrt(disc);
        cout<<"x1= "<<raiz<<" x2= "<<"-"<<raiz;
}

Muchas gracias por vuestro tiempo.
saludos.

4dr14n31t0r

En primer lugar, el absurdo de a = 0 y b = 0 no es tan absurdo cuando c = 0.
En segundo lugar, es una tonteria comprobar dos veces seguidas a == 0. En vez de eso, anida un if dentro de otro. Al if externo le metes en la condicion a == 0, y en el if interno b == 0. No se si me entiendes. Ademas, ya podias resolver la ecuacion para a == 0 en vez de limitarte a decir que no es de segundo grado, ¿no?.
Tampoco entiendo porque pides meter los valores primero b, luego a y c. ¿No seria mas logico meter primero a, luego b, luego c? :-\ (aunque eso no afecta al funcionamiento del programa).
Por ultimo, no has aplicado bien la formula. Dices que la solucion de la x es la raiz del discriminante, es decir x = sqrt(b*b - 4*a*c); pero eso no es cierto. x = (-b +- sqrt(b*b - 4*a*c))/(2*a)

Soulklax

Es lo que pone en el enunciado  del ejercicio lo de las variantes a=0 y B =0; lo de el if dentro de otro if lo modificaré; y como en el enunciado pide calula las raíces de una ecuación de segundo grado hice x= a el valor de la raiz de segundo grado directamente ; osea que tengo que (despues de calcular la raiz  utilizar la expresión de la ecuación de segundo grado x = -b... para calcular el resultado final?
Muchas gracias por la ayuda igual😃

4dr14n31t0r

Creo que el problema esta en que entendiste mal la parte de calcular las raices de un polinomio. Calcular las raices de un polinomio significa calcular los valores de X para los cuales se cumple la igualdad
a*x*x + b*x + c = 0.
Si por ejemplo a = 1, b = -3 y c = 2, las raices de
x*x - 3*x + 2 = 0
seran
x=1
y
x=2,
ya que
1*1 - 3*1 + 2 = 0
y
1*2 - 3*2 + 2 = 0;

Soulklax

Vale vale solo me quedaría modificar eso la X; y entonces para que se utilicaria el static_cast ese que pone en el enunciado?:/

Soulklax

Ahora que lo pienso si pongo a=2, B=-3 y c=1
Las raíces según el programa son :x1=4, y x2=2
Y no es eso

ivancea96

Cita de: Soulklax en  6 Noviembre 2016, 14:50 PM
Ahora que lo pienso si pongo a=2, B=-3 y c=1
Las raíces según el programa son :x1=4, y x2=2
Y no es eso
A mi me da los valores correctos, 1 y -1. Asegúrate de que escribiste el valor en cada coeficiente (b, a, c). Yo de ti lo reordenaba, no es muy intuitivo ese orden.

Como detalle, el else del final lo puedes quitar. No está haciendo nada.

Soulklax

Vale gracias ahora lo reordenó porque vamos!
Y respecto a lo segundo el último else es para cuando el discriminante es positivo es decir sin numeros complejos al realizar su raíz

ivancea96

Sobra porque:
- En primer lugar, ese else no tiene llaves, así que la segunda sentencia se ejecutará siempre.
- En segundo lugar, tienes un return dentro del if, así que el else saltara siempre que no salte el if.

Lo mejor sería ponerle llaves al else.

Soulklax