Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Soulklax en 5 Noviembre 2016, 20:25 pm



Título: Corrección de ejercicio
Publicado por: Soulklax en 5 Noviembre 2016, 20:25 pm
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
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    int b,a,c,disc;
  8.    int raiz;
  9.    cout <<"Introduce un valor para b: ";
  10.    cin >> b;
  11.    cout <<"Introduce un valor para a: ";
  12.    cin >>a;
  13.    cout<<"Introduce un valor para c: ";
  14.    cin >>c;
  15.    if(a==0&& b==0){
  16.     cout <<"Absurdo"<<endl;
  17.     return 0;}
  18.    else if(a==0){
  19.        cout<<"No es una ecuacion de segundo grado"<<endl;
  20.        return 0;}
  21.    disc=(b*b)-(4*a*c);
  22.    if (disc<0){
  23.        disc=-1*disc;
  24.        raiz=sqrt(disc);
  25.        cout<<"x1="<<raiz<<" x2="<<"-"<<raiz<<"i"<<endl;
  26.        return 0;
  27.    }
  28.    else
  29.        raiz=sqrt(disc);
  30.        cout<<"x1= "<<raiz<<" x2= "<<"-"<<raiz;
  31. }
  32.  
Muchas gracias por vuestro tiempo.
saludos.


Título: Re: Corrección de ejercicio
Publicado por: 4dr14n31t0r en 5 Noviembre 2016, 21:41 pm
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)


Título: Re: Corrección de ejercicio
Publicado por: Soulklax en 6 Noviembre 2016, 06:19 am
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😃


Título: Re: Corrección de ejercicio
Publicado por: 4dr14n31t0r en 6 Noviembre 2016, 10:57 am
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;


Título: Re: Corrección de ejercicio
Publicado por: Soulklax en 6 Noviembre 2016, 12:34 pm
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?:/


Título: Re: Corrección de ejercicio
Publicado por: 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


Título: Re: Corrección de ejercicio
Publicado por: ivancea96 en 6 Noviembre 2016, 16:15 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.


Título: Re: Corrección de ejercicio
Publicado por: Soulklax en 6 Noviembre 2016, 16:36 pm
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


Título: Re: Corrección de ejercicio
Publicado por: ivancea96 en 6 Noviembre 2016, 20:11 pm
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.


Título: Re: Corrección de ejercicio
Publicado por: Soulklax en 7 Noviembre 2016, 18:14 pm
vale muchísimas gracias! ;D