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

#define STR_LENGTH 256
#define NOMEFILE   "polinomio.txt"

typedef float* pfloat;
typedef FILE*  pfile;

int get_int_from_file(pfile f)
 {char s[STR_LENGTH]; 
  fscanf(f,"%s",s);
  return atoi(s);
 }

float get_float_from_file(pfile f)
 {char s[STR_LENGTH]; 
  fscanf(f,"%s",s);
  return atof(s);
 }

int main(void)
 {int n_p,n,i,j;
  pfloat y,x,c;
  float dx,sum;
  FILE* f;

  if ((f=fopen(NOMEFILE,"r"))==NULL) 
    {printf("Non posso aprire il file %s!!\n",NOMEFILE);
     return EXIT_FAILURE;
    }
  
  n=get_int_from_file(f);

  if ((c=(pfloat)malloc(sizeof(float)*(n+1)))==NULL) goto memoria_insufficiente;
  for(i=0;i<=n;i++) c[i]=get_float_from_file(f);
  fclose(f);  

  printf("Dammi il numero di punti:  ");
  n_p=get_int_from_file(stdin);
 
  if ((x=(pfloat)malloc(sizeof(float)*n_p))==NULL) goto memoria_insufficiente;
  if ((y=(pfloat)malloc(sizeof(float)*n_p))==NULL) goto memoria_insufficiente;

  printf("Dammi l'estremo inferiore: ");
  x[0]=get_float_from_file(stdin);
  
  printf("Dammi l'estremo superiore: ");
  x[n_p-1]=get_float_from_file(stdin);

  dx=(x[n_p-1]-x[0])/(n_p-1);
  for(i=1;i<n_p-1;i++) 
   {x[i]=x[i-1]+dx;}
  for(i=0;i<n_p;i++)   
   {for(j=0,sum=0.0;j<=n;j++)
     sum+=c[j]*pow(x[i],j);
    y[i]=sum;
   }
  
  for(i=0;i<n_p;i++)
   printf("x[%d]=%f y[%d]=%f\n",i+1,x[i],i+1,y[i]); 

  return EXIT_SUCCESS;
  
  memoria_insufficiente:
   printf("Memoria insufficiente!!\n");
   return EXIT_FAILURE;

 }
