/* Exercice IV, feuille d'exercices 3 */
/* Melange des solutions proposees */

#include <stdio.h>
#include <assert.h>

#define alloc(a)      ((a*)malloc(sizeof(a)))
#define alloctab(a,n) ((a*)malloc((n)*sizeof(a)))


/* A polynomial of degre n is a n+2 array of doubles
   The first element represents de degree of the polynomial
   If the polynomial is 0, the degree is 0 */


int GetPolynomial (double ** Polynomial_Ptr)
{
  int i;
  int degre;

  printf("Entrez le degre du polynome : ");
  scanf("%d",&degre);

  /* The degree is known, allocate the array accordingly */

  *Polynomial_Ptr = alloctab(double,degre+2);

  (*Polynomial_Ptr)[0]=degre;

  for (i=0 ; i<=degre ; i++)
    {
      if (i==0)
	printf("Donner la constante : ");
      else if (i==1)
	printf("Donner la constante devant x : ");
      else printf("Donner le coefficient devant x^%d : ",i);
      scanf("%lf",&((*Polynomial_Ptr)[i+1])); 
    }

  assert(i=degre+1);
}


double EvalPolynomial(double * P1 ,
		      double x)
     /* returns P1(x) */
{
  int i;
  int degre;
  double res;

  degre = P1[0];

  res = P1[degre+1];

  for (i=degre-1 ; i>=0 ; i--)
      res = res*x+P1[i+1];
  
  return res;
}


int main()
{
  double x;
  double * P1;

  GetPolynomial(&P1);
  printf("Donner x : ");
  scanf("%lf",&x);
  printf("P(%lf)=%lf\n",x,EvalPolynomial(P1,x));

}