duda numeros complejos ec segundo grado

Iniciado por Chapielchapas, 20 Febrero 2018, 15:45 PM

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

Chapielchapas

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:

/**Escribe un programa que pida los coeficientes de una ecuación de segundo grado (a · x^
2 + b · x + c =0) y escriba la solución. Recuerda que una ecuación de segundo grado puede
tener dos soluciones reales diferentes, una única solución real, o dos soluciones complejas
conjugadas.*/

#include <stdio.h>
#include <math.h>
#include <complex.h>

int main(){

float coefa, coefb, coefc, sol1, sol2, discri;

/** coefa -> a
coefb -> b
coefc -> c
sol1 -> primera solución de la ecuación
sol2 -> segunda solución de la ecuación
discri -> discrimante, que es igual a   b^2 menos 4ac */

printf("\nBienvenido a la calculadora de raices cuadradas\n");

//Bloque término al cuadrado

printf("\nIntroduzca el coeficiente que acompaña al termino que esta al cuadrado: \n");
scanf("%f",&coefa);
printf("\n\nEl coeficiente que acompaña al termino al cuadrado es: %.4f\n\n",coefa);

//Bloque término de grado uno

printf("\nIntroduzca el coeficiente que acompaña al termino de primer grado: \n");
scanf("%f",&coefb);
printf("\n\nEl coeficiente que acompaña al termino de primer grado es: %.4f\n\n",coefb);

//Bloque término independiente

printf("Introduzca el coeficiente correspondiente al termino independiente: \n");
scanf("%f",&coefc);
printf("\n\nEl coeficiente que acompaña al termino independiente es: %.4f\n\n",coefc);

//Definimos qué es el discriminante

discri = pow(coefb,2) - 4 * coefa * coefc;

/** Introducimos los condicionales pues vamos a tener tres casos posibles:
1. Que el discriminante sea mayor que cero, entonces habra dos soluciones reales
y distintas.
2. Que el discriminante sea cero, entonces habrá dos soluciones reales iguales.
3. Que el discrimante sea menor que cero, entonces habrá dos soluciones complejas.
*/

if (discri > 0) //CASO 1
{
sol1 = (-coefb + sqrt(discri) ) / 2 * coefa;
sol2 = (-coefb - sqrt(discri) ) / 2 * coefa;

printf("\n\nLa solucion son dos raices reales %.4f y %.4f \n\n",sol1,sol2);
}

if (discri == 0) //CASO 2
{

sol1 = (-coefb + sqrt(discri) ) / 2 * coefa;
sol1 = sol2;

printf("\n\nLa solucion son dos raices reales iguales %f y %f \n\n",sol1,sol2);


}
if ( discri < 0) //CASO 3.
{
sol1 = (-coefb + csqrt(discri) ) / 2 * coefa;
sol2 = (-coefb - csqrt(discri) ) / 2 * coefa;

printf("\n\nLa solucion son dos raices complejos %f , %f \n\n",sol1,sol2);
}

//FALTA SABER COMO OPERAR NUMEROS COMPLEJOS







return 0;
}



· Los códigos deben ir en etiquetas GeSHi
· No se debe escribir en mayúsculas
>aquí las reglas del foro
-Engel Lex

marcebond

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

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


float discriminante(float a, float b, float c) {
    sqrt(pow(b, 2) - 4 * a * c);
}

float solucionRealDoble(float a, float b) {
    return (-b / (2 * a));
}

float solucionReal1(float a, float b, float D) {
    return (-b + sqrt(D)) / (2 * a);
}

float solucionReal2(float a, float b, float D) {
    return (-b - sqrt(D)) / (2 * a);
}

float solucionCompleja1(float a, float b, float D) {
    return (-b / (2 * a)) + I * (sqrt(-D) / (2 * a));
}

float solucionCompleja2(float a, float b, float D) {
    return (-b / (2 * a)) - I * (sqrt(-D) / (2 * a));
}