*/
# include <stdio.h>
# include <math.h>
# include <string.h>
#pragma hdrstop
void  view_arr(float arr_res[5]);
void  log_file(char  log_str[256]);
void  view_newton(float x1[6],float y1[6],float n1[6],float x2[11],float y2[11],float n2[11],float x3[16],float y3[16],float n3[16],float x4[21],float y4[21],float n4[21]);
void  view_newton_result(float X[99],float f[99],float N1[99],float N2[99],float N3[99],float N4[99]);
void  max_error(float f[99],float N1[99],float N2[99],float N3[99],float N4[99],float En[4]);
void  view_error(float En[4]);
int   init();
int   n = 5;
FILE  *f1;
char  log_str[8192];
#pragma argsused
int main(int argc, char* argv[])
{
	int i,j,k;
        char temp[127];
        float x1[6];
        float x2[11];
        float x3[16];
        float x4[21];
        float y1[6];
        float y2[11];
        float y3[16];
        float y4[21];
        float n1[6];
        float n2[11];
        float n3[16];
        float n4[21],En[4];
        float f[99],N1[99],N2[99],N3[99],N4[99],X[99];
        if((init())< 0) return -1 ;
	memset(&log_str,0,8192);
        memset(&temp,0,127);
	/*计算插值点函数值*/
	for(i = 0;i <= 5 ; i ++)
	{
		x1[i] = 0.4*i - 1 ;
		y1[i] = (float) (1/(1 + 25*x1[i]*x1[i]));
		n1[i] = y1[i];
	}
	for(i = 0;i <= 10 ; i ++)
	{
		x2[i] = (float) -1 + 0.2*i ;
		y2[i] = (float) 1/(1 + 25*x2[i]*x2[i]);
		n2[i] = y2[i];
	}
	for(i = 0;i <= 15 ; i ++)
	{
		x3[i] = (float) -1 + 0.4*i/3 ;
		y3[i] = (float) 1/(1 + 25*x3[i]*x3[i]);
		n3[i] = y3[i];
	}
	for(i = 0;i <= 20 ; i ++)
	{
		x4[i] = (float) -1 + 0.1*i ;
		y4[i] = (float) 1/(1 + 25*x4[i]*x4[i]);
		n4[i] = y4[i];
	}
	/*end of计算插值点函数值*/
	/*计算newton插值系数*/
	for(i = 1;i <= 5 ; i ++)
	{
		for(j = 5 ; j >= i; j --)
                {
		   n1[j] = (n1[j]-n1[j-1])/(x1[j]-x1[j-i]) ;
                }
	}
	for(i = 1;i <= 10 ; i ++)
	{
		for(j = 10 ; j >= i; j --)
                {
		   n2[j] = (n2[j]-n2[j-1])/(x2[j]-x2[j-i]) ;
                }
	}
    	for(i = 1;i <= 15 ; i ++)
	{
		for(j = 15 ; j >= i; j --)
		   n3[j] = (n3[j]-n3[j-1])/(x3[j]-x3[j-i]) ;
	}
	for(i = 1;i <= 20 ; i ++)
	{
		for(j = 20 ; j >= i; j --)
		   n4[j] = (n4[j]-n4[j-1])/(x4[j]-x4[j-i]) ;
	}
	/*end of计算newton插值系数*/
	view_newton(x1, y1, n1, x2, y2,n2,x3,y3,n3,x4,y4,n4);
	/*计算函数值和newton插值函数值*/
	for(k = 1 ; k < 100; k ++)
	{
		X[k-1] = 2.0/100.0*k - 1;
		f[k-1] = 1.0/(1.0 + 25.0*X[k-1]*X[k-1]);
		N1[k-1]=n1[5];
		for(i = 5 - 1 ; i >= 0 ; i --)
		{
			N1[k-1] = N1[k-1]*(X[k-1]-x1[i]) + n1[i];
		}
		N2[k-1]=n2[10];
		for(i = 10 - 1 ; i >= 0 ; i --)
		{
			N2[k-1] = N2[k-1]*(X[k-1]-x2[i]) + n2[i];
		}
		N3[k-1]=n3[15];
		for(i = 15 - 1 ; i >= 0 ; i --)
		{
			N3[k-1] = N3[k-1]*(X[k-1]-x3[i]) + n3[i];
		}
		N4[k-1]=n4[20];
		for(i = 20 - 1 ; i >= 0 ; i --)
		{
			N4[k-1] = N4[k-1]*(X[k-1]-x4[i]) + n4[i];
		}
	}/*end of计算函数值和newton插值函数值*/
	view_newton_result(X,f,N1,N2,N3,N4);
	max_error(f,N1,N2,N3,N4,En);
	view_error(En);
	fclose(f1);
        return 0;
}
int  init()
{
    if((f1 = fopen("result5.txt","w"))==NULL)
       {
        printf("can not create result text file");
        return -1;
        }
    fputs("*****newton插值多项式和三次样条插值多项式*****\n",f1);
    return 0;
}
void  log_file(char  log_str[8192])
{
    log_str[8191]='\0';
    printf("%s",log_str);
    fputs(log_str,f1);
    log_str[0]='\0';
    return;
}

void view_newton(float x1[6],float y1[6],float n1[6],float x2[11],float y2[11],float n2[11],float x3[16],float y3[16],float n3[16],float x4[21],float y4[21],float n4[21])
{
	int  i,j;
	char str_tmp1[555],str_tmp2[555],str_tmp3[8192],str_vtmp[8192],str_new[8192],str_tt[32];
	memset(&str_tmp1,0,sizeof(str_tmp1));
	memset(&str_tmp2,0,sizeof(str_tmp2));
	memset(&str_tmp3,0,sizeof(str_tmp3));
	log_file("*************newton插值系数\n插值点个数为6时：**********\n");
	strcat(str_tmp1,"\n插值点自变量 x的值：");
	strcat(str_tmp2,"\n插值点函数f(x)的值：");
	strcat(str_tmp3,"\nnewton插值函数N(x)：");
	for(i = 0;i <= 5 ; i ++)
	{
		memset(&str_vtmp,0,sizeof(str_vtmp));
		sprintf(str_vtmp,"%f ",x1[i]);
		strcat(str_tmp1,str_vtmp);
		memset(&str_vtmp,0,sizeof(str_vtmp));
		sprintf(str_vtmp,"%f ",y1[i]);
		strcat(str_tmp2,str_vtmp);
		memset(&str_vtmp,0,sizeof(str_vtmp));
		memset(&str_tt,0,sizeof(str_tt));
		memset(&str_new,0,8192);
		if(i != 0){
		for(j = i  ; j > 0 ; j --)
		{
		    memset(&str_tt,0,sizeof(str_tt));
		    if(x1[j-1] <0)
		         sprintf(str_tt,"*(x + %f)",((-1.0)*x1[j-1]));
		    else sprintf(str_tt,"*(x - %f)",x1[j-1]);
		    strcat(str_new,str_tt);
		}
		}
		if (i == 0) sprintf(str_vtmp,"%f ",n1[i]);
		else {
			if(n1[i]>0) sprintf(str_vtmp," + %f " , n1[i]);
			else sprintf(str_vtmp," %f " , n1[i]);
		}
		strcat(str_vtmp,str_new);
		strcat(str_tmp3,str_vtmp);
	}
	log_file(str_tmp1);
	log_file(str_tmp2);
	log_file(str_tmp3);
	/*jhlhjhlhkjh*/
	log_file("\n*****插值点个数为11时：*****\n\n");
	memset(&str_tmp1,0,sizeof(str_tmp1));
	memset(&str_tmp2,0,sizeof(str_tmp2));
	memset(&str_tmp3,0,sizeof(str_tmp3));
	strcat(str_tmp1,"插值点自变量 x的值：");
	strcat(str_tmp2,"\n插值点函数f(x)的值：");
	strcat(str_tmp3,"\nnewton插值函数N(x)：");
	for(i = 0;i <= 10 ; i ++)
	{
		memset(&str_vtmp,0,sizeof(str_vtmp));
		sprintf(str_vtmp,"%f ",x2[i]);
		strcat(str_tmp1,str_vtmp);
		memset(&str_vtmp,0,sizeof(str_vtmp));
		sprintf(str_vtmp,"%f ",y2[i]);
		strcat(str_tmp2,str_vtmp);
		memset(&str_vtmp,0,sizeof(str_vtmp));
		memset(&str_tt,0,sizeof(str_tt));
		memset(&str_new,0,8192);
		if(i != 0){
		for(j = i  ; j > 0 ; j --)
		{
		    memset(&str_tt,0,sizeof(str_tt));
		    if(x2[j-1] <0)
		         sprintf(str_tt,"*(x + %f)",((-1.0)*x2[j-1]));
		    else sprintf(str_tt,"*(x - %f)",x2[j-1]);
		    strcat(str_new,str_tt);
		}
		}
		if (i == 0) sprintf(str_vtmp,"%f ",n2[i]);
		else {
			if(n2[i]>0) sprintf(str_vtmp," + %f " , n2[i]);
			else sprintf(str_vtmp," %f " , n2[i]);
		}
		strcat(str_vtmp,str_new);
		strcat(str_tmp3,str_vtmp);
	}
	log_file(str_tmp1);
	log_file(str_tmp2);
	log_file(str_tmp3);
	log_file("\n********插值点个数为16时：******\n\n");
	memset(&str_tmp1,0,sizeof(str_tmp1));
	memset(&str_tmp2,0,sizeof(str_tmp2));
	memset(&str_tmp3,0,sizeof(str_tmp3));
	strcat(str_tmp1,"插值点自变量 x的值：");
	strcat(str_tmp2,"\n插值点函数f(x)的值：");
	strcat(str_tmp3,"\nnewton插值函数N(x)：");
	for(i = 0;i <= 15 ; i ++)
	{
		memset(&str_vtmp,0,sizeof(str_vtmp));
		sprintf(str_vtmp,"%f ",x3[i]);
		strcat(str_tmp1,str_vtmp);
		memset(&str_vtmp,0,sizeof(str_vtmp));
		sprintf(str_vtmp,"%f ",y3[i]);
		strcat(str_tmp2,str_vtmp);
		memset(&str_vtmp,0,sizeof(str_vtmp));
		memset(&str_tt,0,sizeof(str_tt));
		memset(&str_new,0,8192);
		if(i != 0){
		for(j = i  ; j > 0 ; j --)
		{
		    memset(&str_tt,0,sizeof(str_tt));
		    if(x3[j-1] <0)
		         sprintf(str_tt,"*(x + %f)",((-1.0)*x3[j-1]));
		    else sprintf(str_tt,"*(x - %f)",x3[j-1]);
		    strcat(str_new,str_tt);
		}
		}
		if (i == 0) sprintf(str_vtmp,"%f ",n3[i]);
		else {
			if(n3[i]>0) sprintf(str_vtmp," + %f " , n3[i]);
			else sprintf(str_vtmp," %f " , n3[i]);
		}
		strcat(str_vtmp,str_new);
		strcat(str_tmp3,str_vtmp);
	}
	log_file(str_tmp1);
	log_file(str_tmp2);
	log_file(str_tmp3);
	log_file("\n**********插值点个数为21时：*************\n\n");
	memset(&str_tmp1,0,sizeof(str_tmp1));
	memset(&str_tmp2,0,sizeof(str_tmp2));
	memset(&str_tmp3,0,sizeof(str_tmp3));
	strcat(str_tmp1,"插值点自变量 x的值：");
	strcat(str_tmp2,"\n插值点函数f(x)的值：");
	strcat(str_tmp3,"\nnewton插值函数N(x)：");
	for(i = 0;i <= 20 ; i ++)
	{
		memset(&str_vtmp,0,sizeof(str_vtmp));
		sprintf(str_vtmp,"%f ",x4[i]);
		strcat(str_tmp1,str_vtmp);
		memset(&str_vtmp,0,sizeof(str_vtmp));
		sprintf(str_vtmp,"%f ",y4[i]);
		strcat(str_tmp2,str_vtmp);
		memset(&str_vtmp,0,sizeof(str_vtmp));
		memset(&str_tt,0,sizeof(str_tt));
		memset(&str_new,0,8192);
		if(i != 0){
		for(j = i  ; j > 0 ; j --)
		{
		    memset(&str_tt,0,sizeof(str_tt));
		    if(x4[j-1] <0)
		         sprintf(str_tt,"*(x + %f)",((-1.0)*x4[j-1]));
		    else sprintf(str_tt,"*(x - %f)",x4[j-1]);
		    strcat(str_new,str_tt);
		}
		}
		if (i == 0) sprintf(str_vtmp,"%f ",n4[i]);
		else {
			if(n4[i]>0) sprintf(str_vtmp," + %f " , n4[i]);
			else sprintf(str_vtmp," %f " , n4[i]);
		}
		strcat(str_vtmp,str_new);
		strcat(str_tmp3,str_vtmp);
	}
	log_file(str_tmp1);
	log_file(str_tmp2);
	log_file(str_tmp3);
	return;
}

void view_newton_result(float X[99],float f[99],float N1[99],float N2[99],float N3[99],float N4[99])
{
	int  i;
	char str_tmp[255];
	log_file("\nx         f(x)       N1(x)       N2(x)       N3(x)       N4(x)\n");
	for(i = 0;i < 99 ; i ++)
	{
		memset(&str_tmp,0,sizeof(str_tmp));
		sprintf(str_tmp,"%f ",X[i]);
		log_file(str_tmp);
		sprintf(str_tmp,"%f ",f[i]);
		log_file(str_tmp);
		sprintf(str_tmp,"%f ",N1[i]);
		log_file(str_tmp);
		sprintf(str_tmp,"%f ",N2[i]);
		log_file(str_tmp);
		sprintf(str_tmp,"%f ",N3[i]);
		log_file(str_tmp);
		sprintf(str_tmp,"%f\n",N4[i]);
		log_file(str_tmp);
	}
	return;
}
void  max_error(float f[99],float N1[99],float N2[99],float N3[99],float N4[99],float En[4])
{
	int i,j;
	float f_bew[4];
	En[0] = fabs(f[0]-N1[0]);
	En[1] = fabs(f[0]-N2[0]);
	En[2] = fabs(f[0]-N3[0]);
	En[3] = fabs(f[0]-N4[0]);
	for(i = 1 ; i < 99 ; i ++)
	{
		f_bew[0] = f[i]-N1[i];
		f_bew[1] = f[i]-N2[i];
		f_bew[2] = f[i]-N3[i];
		f_bew[3] = f[i]-N4[i];
		for (j = 0 ; j < 4 ; j ++)
		if(fabs(f_bew[j])>fabs(En[j])) En[j] = fabs(f_bew[j]);
	}
	return ;
}

void  view_error(float En[4])
{
	int i;
	char str_tmp[255];
	log_file("\n****newton插值函数误差：****\n");
	for(i = 0;i < 4 ; i ++)
	{
		memset(&str_tmp,0,sizeof(str_tmp));
		sprintf(str_tmp,"第%d次newton插值最大误差：%f \n",i,En[i]);
		log_file(str_tmp);
	}
}

