您的位置:首页 > 编程语言 > C语言/C++

第4周 C语言及程序设计提高例程-9 函数的嵌套调用

2016-04-20 11:33 309 查看
问题及代码:

/*用弦截法求方程f(x)=x^3-5x^2+16x-80=0的根。*/
#include<stdio.h>
#include<math.h>
double f(double x);
double root(double x1,double x2);
double point(double x1,double x2);
int main ()
{
double x1,x2,f1,f2,x;
do
{
printf("输入两个数字x1,x2:");
scanf("%lf %lf",&x1,&x2);//这里为何要用lf,做题时因为用%f,导致程序算不出来
f1=f(x1);
f2=f(x2);
}
while(f1*f2>=0);//弦截法介绍,两个值为异号,则在(x1,x2)区间有根,即函数段与x轴有交点。
x=root(x1,x2); //x为在x轴上的交点的坐标值
printf("实根是%f\n",x);
return 0;
}
/*
功能:求(x1, x2)区间方程的实根
参数:两个浮点型值,表示x轴上两点,由主调函数保证f(x1)和f(x2)是异号
返回值:方程的根
*/
double root (double x1,double x2)
{
double x,y,y1;
y1=f(x1);//这步的目的是什么,为了后续的判断吗?
do
{
x=point(x1,x2);//x为在(x1,x2)区间的x轴坐标值
y=f(x);
if(y*y1>0)   //这个判断有什么根据?
{
y1=y;
x1=x;
}
else
x2=x;
}
while(fabs(y)>=0.00001);//求绝对值,当其值无限接近0时,即可表示此时的x即为所求。
return x;
}
/*
功能:求(x1, f(x1))和(x2, f(x2))的连线与x轴的交点x
参数:两个浮点型值,表示x轴上两点
返回值:交点的x轴坐标
*/
double point(double x1,double x2)
{
double x;
x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));//这是一个已经通用的公式。
return x;
}
/*
功能:求函数f(x)=x3-5x2+16x-80的值
参数:一个浮点型数,表示x轴上的一点
返回值:给定函数的值
*/
double f(double x)
{
double y;
y=x*x*x-5*x*x+16*x-80;
return y;
}
运行结果:



知识总结:

自定义函数间的嵌套及各类算法。

学习心得:

懂得弦截法在求根中的运用;

对fabs(y)>=0刚开始不太理解;是求绝对值,当其值无限接近0时,即可表示此时的x即为所求。

还有就是scanf()为何用%lf,而不是%f。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: