好久没写过 C 程序了,今天写了一个,也是迫不得已,是计算方法的作业,呵呵~~
这个程序用来计算 Lagrange 插值,老师要求要用数组,偶就用数组了,有点浪费内存的说,不过现在的机器内存太大了,偶的那点内存算什么,呵呵~~
由于很久没写了,还真有点手生,在那个循环那里还卡了一段时间,最后终于搞清楚是那几个变量没有初始化,唉,这么低级的错误,汗~~~[neutral]
/*lagrange.c*/
/*计算Lagrange插值*/
/*2005年4月21日*/
/*作者:Fdream*/
#include<stdio.h>
/*定义初始数组的大小*/
#define M 100
/*主函数*/
void main(void){
/*定义数组,用来存放点的信息*/
float point[M][2];
/*定义变量*/
float fdx,fdy,fdxx,fdm,fdn,fdyy=0;
int n,i,j,k;
/*输入点的个数*/
printf("How many points do you want to input:\n");
scanf("%d",&n);
/*判断输入的点的个数是否大于2*/
for(;n<2;){
printf("The number of points cannot be less than 2 !\n");
printf("How many points do you want to input:\n");
scanf("%d",&n);
}
/*输入点的信息;x和f(x)*/
for(i=0;i<n;i++){
printf("point %d:\n",i+1);
scanf("%f%f",&fdx,&fdy);
point[i][0]=fdx;
point[i][1]=fdy;
}
/*输入要插值的点的x值*/
printf("Please input x:\n");
scanf("%f",&fdxx);
/*计算过程*/
for(j=0;j<n;j++){
/*初始化各变量的值*/
k=0;
fdn=1;
fdm=1;
/*计算∏(x-xi)与∏(xi-xj),下标从0到j-1*/
for(k=0;k<j;k++){
fdn*=(fdxx-point[k][0]);
fdm*=(point[j][0]-point[k][0]);
}
k++;
/*计算∏(x-xi)与∏(xi-xj),下标从j+1到n-1*/
for(;k<n;k++){
fdn*=(fdxx-point[k][0]);
fdm*=(point[j][0]-point[k][0]);
}
/*计算∑yi(∏(x-xi)/∏(xi-xj)),下标从0到n-1*/
fdyy+=(fdn/fdm)*point[j][1];
}
/*输出结果*/
printf("The result is: %f\n",fdyy);
}
不愧是科班出生,写得很仔细:)
你是CS的吧?
呵呵~~
是 CS 的,这个程序里还一个问题也是弄了好长一断时间的才弄好的,貌似是 C编译器的bug,浮点数组里不能直接输入浮点数,要通过变量中转~~
呵呵,这个是 Turbo C 2.0 的 BUG 噢.
同样的,结构体中的 float 和 double 也是如此.
以前课程设计的时候也遇到过,呵呵
不过Visual C++里好像也有这个问题~