Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Chapielchapas en 20 Febrero 2018, 15:45 pm



Título: duda numeros complejos ec segundo grado
Publicado por: Chapielchapas en 20 Febrero 2018, 15:45 pm
Hola buenas, me mandaron escribir un programita que calculara las ecuaciones de segundo grado y todo bien, pero cuando salen raices complejas que carajo que no las calcula me cawen to, que hay que asel pa resolvel este drama carajo. Pongo código:

Código
  1. /**Escribe un programa que pida los coeficientes de una ecuación de segundo grado (a · x^
  2. 2 + b · x + c =0) y escriba la solución. Recuerda que una ecuación de segundo grado puede
  3. tener dos soluciones reales diferentes, una única solución real, o dos soluciones complejas
  4. conjugadas.*/
  5.  
  6. #include <stdio.h>
  7. #include <math.h>
  8. #include <complex.h>
  9.  
  10. int main(){
  11.  
  12. float coefa, coefb, coefc, sol1, sol2, discri;
  13.  
  14. /** coefa -> a
  15. coefb -> b
  16. coefc -> c
  17. sol1 -> primera solución de la ecuación
  18. sol2 -> segunda solución de la ecuación
  19. discri -> discrimante, que es igual a   b^2 menos 4ac */
  20.  
  21. printf("\nBienvenido a la calculadora de raices cuadradas\n");
  22.  
  23. //Bloque término al cuadrado
  24.  
  25. printf("\nIntroduzca el coeficiente que acompaña al termino que esta al cuadrado: \n");
  26. scanf("%f",&coefa);
  27. printf("\n\nEl coeficiente que acompaña al termino al cuadrado es: %.4f\n\n",coefa);
  28.  
  29. //Bloque término de grado uno
  30.  
  31. printf("\nIntroduzca el coeficiente que acompaña al termino de primer grado: \n");
  32. scanf("%f",&coefb);
  33. printf("\n\nEl coeficiente que acompaña al termino de primer grado es: %.4f\n\n",coefb);
  34.  
  35. //Bloque término independiente
  36.  
  37. printf("Introduzca el coeficiente correspondiente al termino independiente: \n");
  38. scanf("%f",&coefc);
  39. printf("\n\nEl coeficiente que acompaña al termino independiente es: %.4f\n\n",coefc);
  40.  
  41. //Definimos qué es el discriminante
  42.  
  43. discri = pow(coefb,2) - 4 * coefa * coefc;
  44.  
  45. /** Introducimos los condicionales pues vamos a tener tres casos posibles:
  46. 1. Que el discriminante sea mayor que cero, entonces habra dos soluciones reales
  47. y distintas.
  48. 2. Que el discriminante sea cero, entonces habrá dos soluciones reales iguales.
  49. 3. Que el discrimante sea menor que cero, entonces habrá dos soluciones complejas.
  50. */
  51.  
  52. if (discri > 0) //CASO 1
  53. {
  54. sol1 = (-coefb + sqrt(discri) ) / 2 * coefa;
  55. sol2 = (-coefb - sqrt(discri) ) / 2 * coefa;
  56.  
  57. printf("\n\nLa solucion son dos raices reales %.4f y %.4f \n\n",sol1,sol2);
  58. }
  59.  
  60. if (discri == 0) //CASO 2
  61. {
  62.  
  63. sol1 = (-coefb + sqrt(discri) ) / 2 * coefa;
  64. sol1 = sol2;
  65.  
  66. printf("\n\nLa solucion son dos raices reales iguales %f y %f \n\n",sol1,sol2);
  67.  
  68.  
  69. }
  70. if ( discri < 0) //CASO 3.
  71. {
  72. sol1 = (-coefb + csqrt(discri) ) / 2 * coefa;
  73. sol2 = (-coefb - csqrt(discri) ) / 2 * coefa;
  74.  
  75. printf("\n\nLa solucion son dos raices complejos %f , %f \n\n",sol1,sol2);
  76. }
  77.  
  78. //FALTA SABER COMO OPERAR NUMEROS COMPLEJOS
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86. return 0;
  87. }
  88.  


· Los códigos deben ir en etiquetas GeSHi
· No se debe escribir en mayúsculas
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: duda numeros complejos ec segundo grado
Publicado por: marcebond en 20 Febrero 2018, 19:23 pm
En la wikipedia tienes las fórmulas, según este artículo el discriminante se representa por la letra "D"
https://es.wikipedia.org/wiki/Ecuaci%C3%B3n_de_segundo_grado#Discriminante (https://es.wikipedia.org/wiki/Ecuaci%C3%B3n_de_segundo_grado#Discriminante)

Dentro de la cabecera "complex.h" existe una macro llamada "I", que sí, se trata de la constante imaginaria
http://en.cppreference.com/w/c/numeric/complex (http://en.cppreference.com/w/c/numeric/complex)

Código
  1. float discriminante(float a, float b, float c) {
  2.    sqrt(pow(b, 2) - 4 * a * c);
  3. }
  4.  
  5. float solucionRealDoble(float a, float b) {
  6.    return (-b / (2 * a));
  7. }
  8.  
  9. float solucionReal1(float a, float b, float D) {
  10.    return (-b + sqrt(D)) / (2 * a);
  11. }
  12.  
  13. float solucionReal2(float a, float b, float D) {
  14.    return (-b - sqrt(D)) / (2 * a);
  15. }
  16.  
  17. float solucionCompleja1(float a, float b, float D) {
  18.    return (-b / (2 * a)) + I * (sqrt(-D) / (2 * a));
  19. }
  20.  
  21. float solucionCompleja2(float a, float b, float D) {
  22.    return (-b / (2 * a)) - I * (sqrt(-D) / (2 * a));
  23. }
  24.