Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DickGumshoe en 7 Noviembre 2011, 15:51 pm



Título: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: DickGumshoe en 7 Noviembre 2011, 15:51 pm
¡Hola!

Estaba haciendo un programa, el cual me calcula las soluciones de las ecuaciones de segundo grado. Mi código es el siguiente:



Código
  1. //Este programa calcula la solucion de una ecuacion de segundo grado introduciendo los coeficientes
  2.  
  3.  
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<math.h>
  7.  
  8. int main (void){
  9.    float a,b,c,x1,x2,x,z;
  10.  
  11.    printf("\n Introduce el primer coeficiente");
  12.    scanf("%f",&a);
  13.  
  14.  
  15.    printf("\n Introduce el segundo coeficiente");
  16.    scanf("%f",&b);
  17.  
  18.  
  19.    printf("\n Introduce el tercer coeficiente");
  20.    scanf("%f",&c);
  21.  
  22.    if(a!=0){
  23.      if(b*b-4*a*c>=0){
  24.        x1=(-b+pow(b*b-4*a*c,0.5))/(2*a);
  25.        x2=(-b-pow(b*b-4*a*c,0.5))/(2*a);
  26.        printf("\n Las dos soluciones son %f y %f", x1,x2);
  27.      }
  28.        else{
  29.          if(b*b-4*a*c<0){
  30.            printf("\n No tiene solucion real");
  31.          }
  32.            else{
  33.              if(b*b-4*a*c==0){
  34.              z=-b/(2*a);                
  35.              printf("\n La solucion es %f",z);
  36.              }    
  37.            }
  38.  
  39.        }
  40.     }
  41.  
  42.     if(a==0){
  43.       if(b!=0){
  44.         x=(-c)/b;  
  45.         printf("\n La solucion es %f", x);
  46.       }
  47.        else{
  48.          if((b==0)&&(c!=0)){
  49.          printf("\n No tiene solucion");
  50.          }  
  51.            else{
  52.              if((b==0)&&(c==0)){
  53.              printf("\n La solucion es trivial", x);                    
  54.              }
  55.            }        
  56.        }
  57.  
  58.  
  59.     }
  60.  
  61.     printf("\n");
  62.  
  63.  
  64. system ("pause");  
  65. }
  66.  

Pero ahora quiero que en vez de ponerme "No tiene solución real", me calcule la solución con números complejos... ¿Cómo podría hacerlo? No veo conveniente declarar la "i" como variante, pero si no la pongo, tampoco sale...

Muchísimas gracias.


Título: Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: Ferno en 7 Noviembre 2011, 16:11 pm
Una solución rápida que se me ocurre es que el radicando de la fórmula de Bahskara sea una variable (b^2 - 4*a*c). Entonces con un condicional, si es negativo, trabajás con el módulo y le agregás la "i" (o el número imaginario que uses) al resultado, sino, trabajás normalmente.
Todo esto partiendo de la base de que la raíz de un número negativo es igual a la raíz de -1 (o sea, "i") por la raíz del módulo del número.
Salú!


Título: Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: DickGumshoe en 7 Noviembre 2011, 16:24 pm
Muchas gracias.

Lo he puesto así:

Código
  1. ...
  2.  
  3. if(a!=0){
  4.      if(b*b-4*a*c>=0){
  5.        x1=(-b+pow(b*b-4*a*c,0.5))/(2*a);
  6.        x2=(-b-pow(b*b-4*a*c,0.5))/(2*a);
  7.        printf("\n Las dos soluciones son %f y %f", x1,x2);
  8.      }
  9.        else{
  10.          if(b*b-4*a*c<0){
  11.        x1=(-b+pow(b*b-4*a*c,0.5))/(2*a);
  12.        x2=(-b-pow(b*b-4*a*c,0.5))/(2*a);  
  13.            printf("\n La solucion es %f i y %f i", x1,x2);
  14.          }
  15.  
  16. ...
Pero la solución de, por ejemplo 1x^2 2x 2 me da -1#IND00 i y -1#IND00 i...

Estoy aprendiendo a programar, y todavía no me sale muy bien algunas cosas...

Muchas gracias.



Título: Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: s00rk en 7 Noviembre 2011, 21:19 pm
Yo hice algo parecido pero en vb6
aqui te lo dejo espero te sirva como ayuda

Código
  1. Dim a As Single, b As Single
  2.        Dim c As Single, d As Single
  3.        Dim x1 As Single, x2 As Single
  4.        a = Val(txta): b = Val(txtb): c = Val(txtc)
  5.        d = b ^ 2 - (4 * a * c) 'dependiendo del valor "d" podemos tener 3 casos, 2 raices reales, 1 raiz real o 2 imaginarias
  6.                                ' si d > 0 tenemos 2 raices reales, si d = 0 tenemos 1 raiz real y si d < 0 tenemos 2 imaginarias
  7.            If d > 0 Then
  8.                x1 = (-b + Sqr(d)) / (2 * a)
  9.                x2 = (-b - Sqr(d)) / (2 * a)
  10.                txtx1 = x1
  11.                txtx2 = x2
  12.            ElseIf d = 0 Then
  13.                x = (-b + Sqr(d)) / (2 * a)
  14.                txtx1 = x
  15.                txtx2 = ""
  16.            Else
  17.                x1 = (Sqr((d * -1))) / (2 * a)
  18.                x2 = (-Sqr((d * -1))) / (2 * a)
  19.                txtx1 = ((-b) / (2 * a)) & " +" & x1 & " i"
  20.                txtx2 = ((-b) / (2 * a)) & " " & x2 & " i"
  21.            End If


Título: Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: тαптяα en 7 Noviembre 2011, 22:31 pm
Así.

Código
  1. #include <iostream>
  2. #include <math.h>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.    float a,b,c;
  9.    double x1,x2,y1,y2,z1,z2;
  10.    cout << "Introduce los coeficientes de la ecuacion\nde segundo grado de la forma ax^2 + bx + c\n";
  11.    cout << "\nCoeficiente a: ";
  12.    cin >> a;
  13.    cout << "\nCoeficiente b: ";
  14.    cin >> b;
  15.    cout << "\nCoeficiente c: ";
  16.    cin >> c;
  17.    x1=(b*b)-4*a*c;
  18.    if (x1<0)
  19.    {
  20.        x1=x1*(-1);
  21.        x2=sqrt(x1);
  22.        z1=(-b/(2*a));
  23.  
  24.        cout << "\nSoluciones imaginarias : " <<z1<<"+"<<x2<<"i y "<<z1<<"-"<<x2<<"i" ;
  25.    }
  26.    else
  27.    {
  28.        x2=sqrt(x1);
  29.        y1=(-b + x2);
  30.        y2=(-b - x2);
  31.        z1=(y1/(2*a));
  32.        z2=(y2/(2*a));
  33.        cout << "\nSoluciones reales: " << z1 << " y " << z2 ;
  34.    }
  35.    return 0;
  36. }
  37.  


Título: Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: DickGumshoe en 7 Noviembre 2011, 23:19 pm
Muchísimas gracias a los dos. Gracias a vosotros ya no me sale como resultado lo del -1#IND00, pero  lo que sí me da mal es el resultado final. Por ejemplo de la ecuación x^2 2x 2=0, me da como resultados 0+i y -1-i... Y debería ser 2+i y -2-i... (No lo hago como тαптяαпсє porque no he llegado a la función de los "cout", y prefiero mejorar lo que sé con los if, else, printf, etc., para después dar un paso más.

El código ahora es:

Código
  1. //Este programa calcula la solucion de una ecuacion de segundo grado introduciendo los coeficientes
  2.  
  3.  
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<math.h>
  7.  
  8. int main (void){
  9.    float a,b,c,x1,x2,x,z,y1,y2,form=pow(b*b-4*a*c,0.5);
  10.  
  11.    printf("\n Introduce el primer coeficiente");
  12.    scanf("%f",&a);
  13.  
  14.  
  15.    printf("\n Introduce el segundo coeficiente");
  16.    scanf("%f",&b);
  17.  
  18.  
  19.    printf("\n Introduce el tercer coeficiente");
  20.    scanf("%f",&c);
  21.  
  22.    y1=(b*b)-4*a*c;
  23.  
  24.    if(a!=0){
  25.      if(b*b-4*a*c>=0){
  26.        x1=(-b+pow(b*b-4*a*c,0.5))/(2*a);
  27.        x2=(-b-pow(b*b-4*a*c,0.5))/(2*a);
  28.        printf("\n Las dos soluciones son %f y %f", x1,x2);
  29.      }
  30.  
  31.      else{
  32.          if(y1<0){
  33.                          y1=(-b+sqrt(y1*(-1)))/(2*a);
  34.                          y2=(-b-sqrt(y1*(-1)))/(2*a);
  35.  
  36.  
  37.            printf("\n La solucion es %f+i y %f-i", y1,y2);
  38.          }
  39.  
  40.  
  41.      else{
  42.              if(b*b-4*a*c==0){
  43.              z=-b/(2*a);                
  44.              printf("\n La solucion es %f",z);
  45.              }    
  46.            }
  47.  
  48.        }
  49.     }
  50.  
  51.     if(a==0){
  52.       if(b!=0){
  53.         x=(-c)/b;  
  54.         printf("\n La solucion es %f", x);
  55.       }
  56.        else{
  57.          if((b==0)&&(c!=0)){
  58.          printf("\n No tiene solucion");
  59.          }  
  60.            else{
  61.              if((b==0)&&(c==0)){
  62.              printf("\n La solucion es trivial", x);                    
  63.              }
  64.            }        
  65.        }
  66.  
  67.  
  68.     }
  69.  
  70.     printf("\n");
  71.  
  72.  
  73. system ("pause");  
  74. }
  75.  
  76.  

Muchas gracias.


Título: Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: Ferno en 8 Noviembre 2011, 05:27 am
Código
  1. if(b*b-4*a*c>=0) /*Aca podes poner directamente if (y1 >= 0) que es la variable donde calculaste el radicando*/
  2. ...
  3. if(y1<0) /*Este if es redundante, con el else anterior, se entiende que y1 es menor a 0*/
  4. ...
  5. y1=(-b+sqrt(y1*(-1)))/(2*a);
  6. y2=(-b-sqrt(y1*(-1)))/(2*a);
  7. /*Procura no mezclar tanto las variables, las soluciones las estas usando en las variables x1 y x2, no está mal, pero tampoco esta muy bien :P*/

Ahora, no está bien el algoritmo a la hora de mostrar el resultado como número imaginario. Porque el número imaginario "i" aparece solo cuando resolvés el radicando, es decir, multiplica solo lo que resuelve la función sqrt (en tu programa, este suma o resta a toda la función real de Bahskara).
Yo separaría en una variable la parte real del resultado Re= (-b/2a) y en otra la parte imaginaria Im = (sqrt((-1)*y1)/2a), y la forma de mostrar el resultado sería:

Código
  1. printf("La primer raiz es %f + (%f)*i \n",Re,Im);
  2. printf("La segunda raiz es %f - (%f)*i \n", Re,Im);
  3.  

Perdón por no poner tu code entero con comentarios, pero es que no salía bien la previsualización.
Espero que se haya entendido.


Título: Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: тαптяα en 8 Noviembre 2011, 19:17 pm
Código
  1. if(b*b-4*a*c>=0) /*Aca podes poner directamente if (y1 >= 0) que es la variable donde calculaste el radicando*/
  2. ...
  3. if(y1<0) /*Este if es redundante, con el else anterior, se entiende que y1 es menor a 0*/
  4. ...
  5. y1=(-b+sqrt(y1*(-1)))/(2*a);
  6. y2=(-b-sqrt(y1*(-1)))/(2*a);
  7. /*Procura no mezclar tanto las variables, las soluciones las estas usando en las variables x1 y x2, no está mal, pero tampoco esta muy bien :P*/

Ahora, no está bien el algoritmo a la hora de mostrar el resultado como número imaginario. Porque el número imaginario "i" aparece solo cuando resolvés el radicando, es decir, multiplica solo lo que resuelve la función sqrt (en tu programa, este suma o resta a toda la función real de Bahskara).
Yo separaría en una variable la parte real del resultado Re= (-b/2a) y en otra la parte imaginaria Im = (sqrt((-1)*y1)/2a), y la forma de mostrar el resultado sería:

Código
  1. printf("La primer raiz es %f + (%f)*i \n",Re,Im);
  2. printf("La segunda raiz es %f - (%f)*i \n", Re,Im);
  3.  

Perdón por no poner tu code entero con comentarios, pero es que no salía bien la previsualización.
Espero que se haya entendido.
Yo si que te he entendido, pero si te fijas, mi código lo hace perfectamente.

Saludos.


Título: Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: ghastlyX en 8 Noviembre 2011, 20:04 pm
Simplemente como comentario, puesto que mucha gente no lo sabe, existe en C++ la librería complex, que permite trabajar con complejos directamente. Pongo un pequeño código que resuelve el problema usándola.
Código
  1. #include <iostream>
  2. #include <complex>
  3. using namespace std;
  4.  
  5. const double EPS = 1e-7;
  6.  
  7. int main() {
  8.    complex<double> a, b, c;
  9.    cin >> a >> b >> c;
  10.    complex<double> x1 = (-b + sqrt(b*b - 4.0*a*c))/(2.0*a), x2 = (-b - sqrt(b*b - 4.0*a*c))/(2.0*a);
  11.    cout << real(x1);
  12.    if (fabs(imag(x1)) > EPS) cout << ((imag(x1) < 0)?"":"+") << imag(x1) << "i" << endl;
  13.    else cout << endl;
  14.    cout << real(x2);
  15.    if (fabs(imag(x2)) > EPS) cout << ((imag(x2) < 0)?"":"+") << imag(x2) << "i" << endl;
  16.    else cout << endl;
  17. }


Título: Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: тαптяα en 8 Noviembre 2011, 20:42 pm
Simplemente como comentario, puesto que mucha gente no lo sabe, existe en C++ la librería complex, que permite trabajar con complejos directamente. Pongo un pequeño código que resuelve el problema usándola.
Código
  1. #include <iostream>
  2. #include <complex>
  3. using namespace std;
  4.  
  5. const double EPS = 1e-7;
  6.  
  7. int main() {
  8.    complex<double> a, b, c;
  9.    cin >> a >> b >> c;
  10.    complex<double> x1 = (-b + sqrt(b*b - 4.0*a*c))/(2.0*a), x2 = (-b - sqrt(b*b - 4.0*a*c))/(2.0*a);
  11.    cout << real(x1);
  12.    if (fabs(imag(x1)) > EPS) cout << ((imag(x1) < 0)?"":"+") << imag(x1) << "i" << endl;
  13.    else cout << endl;
  14.    cout << real(x2);
  15.    if (fabs(imag(x2)) > EPS) cout << ((imag(x2) < 0)?"":"+") << imag(x2) << "i" << endl;
  16.    else cout << endl;
  17. }

Gracias por la información.

Saludos


Título: Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
Publicado por: DickGumshoe en 8 Noviembre 2011, 22:47 pm
Ah, muchas gracias a todos ^^

Acabo de hacerlo de varias maneras; con la librería <complex>, que me ha ayudado ghastly, como me ha dicho Ferno, y como me ha dicho тαптяαпсє.

Muchas gracias a todos los que me habéis ayudado.

Saludos.