#include <stdio.h>
#include <math.h>


void resoudreDegre1(double a,double b,int* n,double* x)
{
   if (a!=0.0)
   {
      *n = 1;
      *x = -b/a;
   }
   else if (b!=0.0)
   {
      *n = 0;
   }
   else
   {
      *n = -1;
   }
}

void resoudreDegre2(double a,double b,double c,int* n,double* x1,double* x2)
{
  double delta = b*b-4*a*c;
  if (delta > 0.0)
  {
    *n = 2;
    *x1 = (-b+sqrt(delta))/(2*a);
    *x2 = (-b-sqrt(delta))/(2*a);
  }
  else
  {
    if (delta == 0.0)
    {
      *n = 1;
      *x1 = *x2 = (-b)/(2*a);
    }
    else
    {
      *n = 0;
    }
  }
}

void resoudre(double a,double b,double c,int* n,double* x1,double* x2)
{
  if (a != 0.0)
  {
    resoudreDegre2(a,b,c,n,x1,x2);
  }
  else
  {
    resoudreDegre1(b,c,n,x1);
  }
}

void afficherSolutions(int n,double x1,double x2)
{
  switch (n)
  {
    case 2:
      printf("==> Deux racines: %g et %g\n",x1,x2);
      break;
    case 1:
      printf("==> Une racine: %g\n",x1);
      break;
    case 0:
      printf("==> Aucune solution dans R\n");
      break;
    default:
      printf("==> L'ensemble R\n");
  }
}

void test_quadratik1()
{
  double a;
  double b;
  double c;
  printf("Coefficients a b c de l'equation? ");
  scanf("%lf%lf%lf",&a,&b,&c);
  int ns;
  double x1;
  double x2;
  resoudre(a,b,c,&ns,&x1,&x2);
  afficherSolutions(ns,x1,x2);
}

void resoudreDegre2C(double a,double b,double c,int* n,double* x1,double* x2)
{
   double delta = b*b-4*a*c;
   if (delta > 0.0)
   {
      *n = 2;
      *x1 = (-b+sqrt(delta))/(2*a);
      *x2 = (-b-sqrt(delta))/(2*a);
   }
   else if (delta == 0.0)
   {
      *n = 1;
      *x1 = *x2 = (-b)/(2*a);
   }
   else
   {
      *n = -2;
      *x1 = (-b)/(2*a);
      *x2 = sqrt(-delta)/(2*a);
   }
}

void resoudreC(double a,double b,double c,int* n,double* x1,double* x2)
{
  if (a != 0.0)
  {
    resoudreDegre2C(a,b,c,n,x1,x2);
  }
  else
  {
    resoudreDegre1(b,c,n,x1);
  }
}

void afficherSolutionsC(int n,double x1,double x2)
{
  switch (n)
  {
    case 2:
      printf("==> Deux racines sur R: %g et %g\n",x1,x2);
      break;
    case 1:
      printf("==> Une racine: %g\n",x1);
      break;
    case 0:
      printf("==> Aucune solution\n");
      break;
    case -1:
      printf("==> L'ensemble R\n");
      break;
    default:
      printf("==> Deux racines sur C: %g-%gi et %g+%gi\n",x1,x2,x1,x2);
  }
}

void test_quadratik2()
{
  double a;
  double b;
  double c;
  printf("Coefficients a b c de l'equation? ");
  scanf("%lf%lf%lf",&a,&b,&c);
  int ns;
  double x1;
  double x2;
  resoudreC(a,b,c,&ns,&x1,&x2);
  afficherSolutionsC(ns,x1,x2);
}

int main()
{
   test_quadratik1();
   test_quadratik2();
}
