[Ejemplo de C: muy básico] Solucionar ecuaciones de 2º grado

Ver el tema anterior Ver el tema siguiente Ir abajo

[Ejemplo de C: muy básico] Solucionar ecuaciones de 2º grado

Mensaje  HarZe el Mar Dic 08, 2009 2:35 pm

Si acabas de empezar C, este es el primer ejemplo que debes ver, es el más sencillo.

Este programa soluciona una ecuación de 2º grado de este estilo:
Código:
Ax² + Bx + C = 0
Indica si tiene solución doble, única o imaginaria. Primero mira el código:
Código:
// Creative Commons 2009 - opengl-esp.superforo.net - HarZe

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

unsigned char op;
short bucle = 1;
float a,b,c,d,r,i1,i2;

int main() {
   while (bucle) {
      //Presentación
      printf("\n Práctica de C. Resolución de ecuaciones de 2º grado.\n Introduce los factores A, B y C en una ecuacion asi:\n Ax²+By+C=0\n\nIntroduce A:");
      scanf("%f",&a);
      printf("Introduce B:");
      scanf("%f",&b);
      printf("Introduce C:");
      scanf("%f",&c);

      //Resolucion
      r = (-b)/(2*a);
      d = (b*b)-(4*a*c);
      i1 = sqrt(fabs(d))/(2*a);
      i2 = -i1;

      if (d>0) printf("\n\nSolucion doble: %f , %f",r+i1,r+i2);
      else if (d==0) printf("\n\nSolucion unica: %f",r);
      else if (d<0) printf("\n\nSolucion doble imaginaria: %f+%fi , %f+%fi",r,i1,r,i2);

      printf("\n\nHacer otra ecuacion [s/n]?");
      op = 0;
      while (op!='s' && op!='n') {
         scanf("%c",&op);
         if (op=='n') bucle = 0;
      }
      if (!bucle) printf("\nCC 2009 - Visitanos: http://opengl-esp.superoforo.net - por HarZe\n");
   }
}
Primero hay que aclarar las librerías que usamos y por qué:
Código:
#include <stdio.h> // Para usar printf() y scanf() y emitir/recoger datos
#include <stdlib.h> // Para usar fabs() y obtener el valor absoluto de un decimal
#include <math.h> // Para usar sqrt() y obtener la raiz cuadrada
Las variables de este programa son todas globales:
Código:
unsigned char op; // Para guardar la opcion s/n al final del programa
short bucle = 1; // Variable auxiliar que se des/activa si ordenas hacer otra ecuacion
float a,b,c,d,r,i1,i2; // Variables para las ecuaciones y sus resultados
La función main() es la que se ejecuta por defecto, y el bucle se encarga de repetir el programa.
Con el siguiente código obtenemos la ecuación
Código:
      //Presentación
      printf("\n Práctica de C. Resolución de ecuaciones de 2º grado.\n Introduce los factores A, B y C en una ecuacion asi:\n Ax²+By+C=0\n\nIntroduce A:");
      scanf("%f",&a);
      printf("Introduce B:");
      scanf("%f",&b);
      printf("Introduce C:");
      scanf("%f",&c);
Ahora la solucionamos, teniendo en cuenta que tiene dos términos, uno real y otro que puede ser real o imaginario, el de la raiz.
Código:
      r = (-b)/(2*a);
      d = (b*b)-(4*a*c);
      i1 = sqrt(fabs(d))/(2*a);
      i2 = -i1;
Recuerda que hay dos soluciones, una con el término imaginario positivo y negativo. Primero hallamos el termino real. Luego averiguamos el discriminante, que es lo que va dentro de la raíz, y luego obtenemos el término imaginario haciendo la raíz del discriminante sin signo (no se pueden hacer raíces negativas). Y por último hallamos el segundo término imaginario, que es el negativo del primero.
Ahora toca mostrar la solución, que es la suma de los dos términos:
Código:
      if (d>0) printf("\n\nSolucion doble: %f , %f",r+i1,r+i2);
      else if (d==0) printf("\n\nSolucion unica: %f",r);
      else if (d<0) printf("\n\nSolucion doble imaginaria: %f+%fi , %f+%fi",r,i1,r,i2);
Si la raíz es positiva, las solucion es doble, y la suma de el término real y cada uno de los imaginarios, que realmente también son reales. Si la raíz es 0 solo hay una solución, el primer término real. Y si la raíz es negativa (aquí he usado (d<0), pero puedes omitirlo y poner else, pues si no es ni positivo ni cero, por eliminación será negativo) la solución doble se expresa como la suma de los dos términos por separado, la parte real está tal cuál y la imaginaria multiplicada por i ( i es la raíz de -1).

HarZe
WebMaster & Desarrollador

Cantidad de envíos : 58
Fecha de inscripción : 21/06/2009
Edad : 24

Ver perfil de usuario http://opengl-esp.superforo.net

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.