/* N次関数の定積分 Nと係数と区間を読み込み 区分求積 */

 

#include<stdio.h>

#include<math.h>

#define M 10  /* 分割数の最大値=2^M */

int n;

float c[10];

main(){

        int i,j,k;

        float a,b,d,s,x;

        int power(int,int);

        float f(float);

        FILE *fp;

        fp=fopen("K:/40103A.dat","w");

        printf("n次関数:n=? ");

        scanf("%d",&n);

        for(k=0;k<=n;k++){

                printf("%d次係数=? ",k);

                scanf("%f",&c[k]);

        }

        printf("a から b まで : a=? ");

        scanf("%f",&a);

        printf("b=? ");

        scanf("%f",&b);

        fprintf(fp,"%4.1f から %4.1f まで",a,b);

        printf("\nf(x)= %4.1f ",c[0]);

        fprintf(fp,"\nf(x)= %4.1f ",c[0]);

        for(i=1;i<=n;i++){

                printf("+ %4.1f x^%d ",c[i],i);

                fprintf(fp,"+ %4.1f x^%d ",c[i],i);

 

        }

        printf("\n");

        fprintf(fp,"\n");

        for(i=0;i<=M;i++){

                printf("STEP %2d ( %4d 分割 )  ",i,power(2,i));

                fprintf(fp,"STEP %2d ( %4d 分割 )  ",i,power(2,i));

                d=(b-a)/power(2,i);

                printf("d=%6.4f",d);

                fprintf(fp,"d=%6.4f",d);

                s=0.0;

                for(j=0;j<power(2,i);j++){

                        x=a+d*j+d/2;

                        s=s+d*f(x);

                }

                printf(" 定積分の値 = %9.4f\n",s);

                fprintf(fp," 定積分の値 = %9.4f\n",s);

        }

        fclose(fp);

        return(1);

}

/* 整数p の q 乗を計算する関数 */

int power(int p,int q){

        int i,r=1;

        for(i=0;i<q;i++){

                r=r*p;

        }

        return(r);

}

/* 関数 f(x) の値を計算する関数 */

float f(float x){

        int i;

        float fpower(float,int);

        float y=c[0];

        for(i=1;i<=n;i++){

                y=y+c[i]*fpower(x,i);

        }

        return(y);

}

/* 実数x の n 乗を計算する関数 */

float fpower(float x,int n){

        int i;

        float s=1.0;

        for(i=0;i<n;i++){

                s=s*x;

        }

        return(s);

}