/*

 * quad_eq.c

 * This program reads the coefficients of a quadratic equation and solves

 * the equation.

 */

 

#include <stdio.h>

#include <math.h>

 

/* Prototypes: */

int solve_quad (double a, double b, double c,

                double *x1, double *x2);

 

int main ()

{

  double    a, b, c;          /* The equation coefficients. */

  double    x1, x2;           /* Its solutions. */

  int       n_sols;           /* The number of real solutions. */

 

  /* Read the coeffcients. */

  printf ("Please enter the three coefficients of the quadratic equation: ");

  scanf ("%lf %lf %lf", &a, &b, &c);

 

  /* Solve the equation. */

  n_sols = solve_quad (a, b, c,

                       &x1, &x2);

 

  /* Print the solutions. */

  switch (n_sols)

  {

  case 0:

    printf ("The equation has no real solutions.\n");

    break;

 

  case 1:

    printf ("The equation has a single solution: (x = %g).\n", x1);

    break;

 

  case 2:

    printf ("The equation has two solutions: (x1 = %g) (x2 = %g).\n", x1, x2);

    break;

 

  default:

    printf ("You must be kidding!\n");

    return (1);

  }

 

  return (0);

}

 

/* ------------------------------------------------------------------------

 * Function: solve_quad

 * Purpose : Solve the quadratic equation: (a*x^2 + bx + c = 0).

 * Input   : a, b, c - The equation coefficients.

 * Output  : x1, x2  - The solutions.

 * Returns : The number of real solutions to the equation (0, 1 or 2).

 */

int solve_quad (double a, double b, double c,

                double *x1, double *x2)

{

  double   disc;

  double   sqrt_disc;

 

  /* Check if this is really a linear equation. */

  if (a == 0)

  {

    /* The equation is: (b*x + c = 0). */

    if (b == 0)

      return (0);

 

    *x1 = -c / b;

    return (1);

  }

 

  /* Compute the discriminant and act according to its sign. */

  disc = b*b - 4*a*c;

 

  if (disc < 0)

  {

    return (0);

  }

  else if (disc == 0)

  {

    *x1 = -b / (2*a);

    return (1);

  }

 

  /*                          -b +/- sqrt(b^2 - 4ac)

   * Use the formula: x1,2 = ------------------------

   *                                   2a

   */

  sqrt_disc = sqrt (disc);

 

  *x1 = (-b + sqrt_disc) / (2*a);

  *x2 = (-b - sqrt_disc) / (2*a);

  return (2);

}