/*Integrare polinomi da file di testo, dove il file di testo ha come primo numero il numero di polinomi, ogni polinomio ha come primo numero il grado e i coefficienti dal termine noto fino al grado massimo.*/
#include <stdio.h>
#include <stdlib.h>

#define FILE_PATH "/home/aurelio/Desktop/informatica/filetxt/polinomi.txt"
#define STRLEN 1024
#define N_RETT 10000
#define INF -2.0
#define SUP 2.0

typedef int* pint;
typedef float* pfloat;
typedef FILE* pfile;
typedef char* pchar;
 
double integrale(float inf, float sup, unsigned n_r, pfloat pcoeff, unsigned grado) {
    double dx,sum,y,x,xi;
    unsigned i,i_coeff;

    dx=(double)(sup-inf)/n_r;
    for(i=sum=0,x=inf;i<n_r;i++) {
        for(i_coeff=y=0,xi=1;i_coeff<=grado;i_coeff++) {
            y+=pcoeff[i_coeff]*xi;
            xi*=x;
        }
        sum+=y*dx;
        x+=dx;
    }
return sum;
}


int main() {
    unsigned i_pol,i_coeff,numero_polinomi,grado;
    pfile pf;
    char s[STRLEN];
    pfloat pcoeff;
    double integ;

    if(NULL==(pf=fopen(FILE_PATH,"r"))) goto err_file;

    fscanf(pf,"%s",s);
    numero_polinomi=atoi(s);

    printf("Numero di polinomi da intergare pari a %d.\n",numero_polinomi);

    for(i_pol=0;i_pol<numero_polinomi;i_pol++) {
        fscanf(pf,"%s",s);
        grado=atoi(s);
        if(NULL==(pcoeff=malloc(sizeof(float)*(grado+1)))) goto err_mem;
        printf("Polinomio n.%d: ",i_pol+1);
        for(i_coeff=0;i_coeff<=grado;i_coeff++) {
            fscanf(pf,"%s",s);
            pcoeff[i_coeff]=atof(s);
            switch(i_coeff) {
            case 0:
                printf("%.2f",*pcoeff);
                break;
            default:
                if(pcoeff[i_coeff]<0) printf("%.2fx^%d",pcoeff[i_coeff],i_coeff);
                else if(pcoeff[i_coeff]>0) printf("+%.2fx^%d",pcoeff[i_coeff],i_coeff);
                break;
            }
        }
        printf("\n");
        integ=integrale(INF,SUP,N_RETT,pcoeff,grado);
        printf("L'integrale del polinomio %d valutato da %f a %f risulta %f\n",i_pol+1,INF,SUP,integ);
        free(pcoeff);
    }

    return EXIT_SUCCESS;
    fclose(pf);
    err_file:
        printf("Errore file non trovato\n");
        return EXIT_FAILURE;
    err_mem:
        printf("Errore memoria insufficiente\n");
        return EXIT_FAILURE;

}