elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pequeño problema al hacer un programa de ecuaciones de segundo grado
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Pequeño problema al hacer un programa de ecuaciones de segundo grado  (Leído 16,757 veces)
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Pequeño problema al hacer un programa de ecuaciones de segundo grado
« 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.


En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
« Respuesta #1 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ú!


En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
« Respuesta #2 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.

En línea

s00rk

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
« Respuesta #3 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
En línea

тαптяα


Desconectado Desconectado

Mensajes: 1.151


Sic utere tuo ut alienum non laeda


Ver Perfil WWW
Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
« Respuesta #4 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.  
En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
« Respuesta #5 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.
« Última modificación: 7 Noviembre 2011, 23:23 pm por DickGumshoe » En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
« Respuesta #6 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.
En línea

тαптяα


Desconectado Desconectado

Mensajes: 1.151


Sic utere tuo ut alienum non laeda


Ver Perfil WWW
Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
« Respuesta #7 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.
En línea

ghastlyX
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.900



Ver Perfil
Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
« Respuesta #8 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. }
En línea

тαптяα


Desconectado Desconectado

Mensajes: 1.151


Sic utere tuo ut alienum non laeda


Ver Perfil WWW
Re: Pequeño problema al hacer un programa de ecuaciones de segundo grado
« Respuesta #9 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
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ecuaciones de segundo grado... ¿Posible?
Programación Visual Basic
Debci 6 10,499 Último mensaje 17 Julio 2009, 02:48 am
por h0oke
Resolucion de ecuaciones de segundo grado y primer grado tmb :s
Java
Debci 8 13,920 Último mensaje 8 Noviembre 2009, 12:59 pm
por Debci
[Python] Ecuaciones de Segundo Grado - by xassiz
Scripting
xassiz_ 2 8,171 Último mensaje 17 Febrero 2010, 23:41 pm
por xassiz_
[C] Ecuaciones de segundo grado « 1 2 »
Programación C/C++
STANHMAL 10 7,472 Último mensaje 10 Julio 2010, 04:28 am
por STANHMAL
Problema Ecuaciones De Segundo Grado
Java
KaRaLLo 3 11,851 Último mensaje 30 Noviembre 2011, 15:15 pm
por fenomeno92
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines