miércoles, 10 de noviembre de 2010

C Ecuación de segundo grado

Laboratorio

Descripción del problema:
Encontrar la solución a una ecuación de segundo grado.
Dada la ecuación de segundo grado ax²+bx+c=0, se calcula el discriminante
disc=b²-4ac
Si el discriminante es mayor que 0 las dos raíces son reales y distintas
x1=(-b+√disc)/(2a)
x2=(-b-√disc)/(2a)
Si el discriminante es igual a 0, entonces las dos raíces son reales e iguales y se calculan:
x1=x2=-b/2
Y si el discriminante es menor que 0, entonces las dos raíces son complejas conjugadas y se calculan:
xr=-b/2a xi= (√-disc)/2a

Código en C
Para empezar a realizar este programa primero se escribe #include<stdio.h> que es la libreria estándar del lenguaje de programación C, enseguida se hace llamada a la libreria<stdio> , que será utilizada en el programa para utilizar funciones ya definidas como la raíz cuadrada, y el la potencia.
Ahora abrimos la función principal del programa int main(int argc, char** args), y se declararan todas las variables que voy a utilizar.

Significado de las variables:
a es el coeficiente de x²
b es el coeficiente x
c es la constante de la ecuación
disc es el valor del discriminante
x1 y x2 representan el valor de las raíces reales
xi es la raíz compleja imaginaria
xr la raíz compleja real

Después de haber declarado las variables, ahora pedimos al usuario el valor de a, b y c, para poder obtener el valor del discriminante, pero con la condición de que el valor de a no sea 0, si es así se pide volver a introducir el valor de a haciendo uso del bucle while.

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

int main(int argc, char** args){
float a, b, c, disc, x1, x2, xi, xr;
printf("\n\t\tSolucion de una ecuacion de segundo grado");
printf("\n\t\t_________________________________________\n\n\n");
printf("\t\t\tEscribe el valor de a --> ");
scanf("%f", &a);
while(a==0){
printf("\t\tEl valor de a no puede ser 0 ingrese el valor de nuevo -->");
scanf("%f", &a);
}
printf("\t\t\tEscribe el valor de b --> ");
scanf("%f", &b);
printf("\t\t\tEscribe el valor de c --> ");
scanf("%f", &c);


Para obtener el valor del discriminante se utilizó la función pow(), que cumple la función de elevar un numero a una determinada potencia, la forma de escribirse es pow(base, exponente).
Después se utilizo la estructura condicional if para determinar si el valor del disc es mayor que 0, entonces entra a la condición y se efectúan las operaciones correspondientes para obtener x1 y x2.

Si no se cumple esa condición entonces entra a otro condicional para saber si disc es igual a 0, y se lleva acabo la operación indicada, si el disc no es igual a 0 entonces el valor del discriminante pasa realizar la operación correspondiente.

Por último para terminar el programa se cierran los las estructuras condicionales y la función principal main.

disc=pow(b, 2.0)-4*a*c;
if(disc>0.0){
printf("\t\t\tLas dos raices son reales");
x1=((-b+sqrt(disc))/(2.0*a));
x2=((-b-sqrt(disc))/(2.0*a));
printf("\n\t\t\tx1=%.2f x2=%.2f", x1, x2);
}
else{
if(disc==0.0){
x1=(-b)/(2.0*a);
printf("\n\t\t\tLa ecuacion solo tiene una raiz %.2f", x1);
}
else{
xr=(-b/(2.0*a));
xi=(sqrt(-disc)/(2.0*a));
printf("\n\t\tLa raiz real es %.2f y la imaginaria es %.2f", xr, xi);
}
}
printf("\n\n\t\t\t");
}


Programa ejecutado, donde el discriminante es:

Mayor que 0:


Menor que 0:


Igual a 0:


Y este es el código para descargar:
ecuacion.c

16 comentarios:

  1. Muy buena entrada, la verdad no le falta nada
    me gusto que pusieras con 3 instancias distintas y muy buena explicación
    SUERTE :)

    ResponderEliminar
  2. Buena entrada Sandra:

    Sin embargo, recomiendo ampliamente manejar por lo menos una subrutina para la solución en general y algunos espacios en blanco para poder leerlo mejor.

    Aqui te dejo el link de descarga para que lo visualices.

    https://docs.google.com/uc?id=0B3_-USmqViKzYzU1NWI1NmEtZDY1Ni00ZWNmLTllZDYtYWIyZjNkNWY3Mjdk&export=download&authkey=CKTq88cH&hl=en

    Por cierto, en soluciones imaginarias, te imprime por decir algo x = 4 i

    También recomiendo que cuando pongas links de descarga, copies el link para que salga la ventana que te pregunte si guardas o abres, sin necesidad de entrar a GoogleDocs

    PD. No es por ser "carro", pero que yo sepa es "SEGUNDO", no "SEGUNDRO".

    ResponderEliminar
  3. error de dedo ¬¬

    aah no se si esto este bien crispin :/ espero alrato me contestes pero mira en el código me escribiste así la funcion para obtener la solución

    float solu(float a, float b, float c) {
    ..........
    return;}

    porque pones float antes de solu si la funcón no esta devolviendo nada...una cosa es el printf y otra cosa que regrese valores la función y pusiste el return solo,, o como? no estoy segura,

    ResponderEliminar
  4. mmmm........... a si es cierto, sorry. Es que lo hice deprisa. Mi idea original era hacer una subrutina de función, pero termine por mostrar los resultados dentro de esa misma subrutina, por lo que si es de proceso. No es FLOAT, es VOID.

    Sorry, gracias por la observación.

    PD. Es que ese código era mi versión BETA.

    ResponderEliminar
  5. Hola Cecy, mira te comento yo también realice un programa para la solución de una ecuación de segundo grado, para el reporte de lenguajes imperativos, en mi caso yo implemente funciones para el calculo de las raíces y el discriminante.
    A mi me paso algo en particular interesante al utilizar la librería math.h no se si te habrá pasado a ti, al querer compilar, me marcaba un error me decía que las funciones de la libreria math.h no estaban definidas, cuando me puse a investigar este detalle, menciona que al compilar el archivo necesitábamos escribirlo así:
    :~$ gcc miarchivo.c -lm
    mencionan que el compilador gcc no llama directamente a la librería math.h por lo que hay que indicar su ubicación.
    de igual para no hacerla de malas :P es necesario tener instalados los paquetes build-essential

    ResponderEliminar
  6. si.. ya de eso habia hablado con el grupo, no si si recuerdes que hace algunos meses mande un correo porque no podia compilar uno, me contesto la Dra Sara eso mismo

    ResponderEliminar
  7. Bien, cuatro puntos para el lab para Cecy. Punto de participación: Roberto y Guillermo.

    ResponderEliminar
  8. me pueden ayudar necesito cuando la raiz es negativa osea cuando es un numero imaginario

    ResponderEliminar
  9. hola alguin me puede ayudar ?
    al ingresar los datos de los valores de a,b y c ya no me aparece nada y se borra la pantalla del programa, saben porque?

    ResponderEliminar
    Respuestas
    1. Lamento ver este mensaje tarde, pero te respondo yo. Debajo de cada printf(El resultado es...); tenes que colocar un getch(); para que no se cierre y le muestre al usuario el resultado.

      Saludos!

      Eliminar
  10. Gracias Cecilia. :D Su código me ayudó a resolver un rompecabezas con lo de las raíces imaginarias.

    ResponderEliminar
  11. en el caso que estaría usando el discriminante cuando x=0 usando la formula X=-c/b como seria el programa me daría una soluciòn negativa pero ese valor mostrarlo en pantalla No quiero q me salga un mensaje(numero imaginario)Sino q me salga el resultado

    ResponderEliminar