自定义函数提高
第二部分
函数原型:
函数声明的形式
函数原型与函数定义的一致:
1.返回值类型一致
2.函数名一致
3.参数个数一致
4.参数类型一致
5.参数顺序一致
示例:
//以下的函数声明方式是等价的
float max(float,float);
float max(float x,float y);
float max(float a,float b);
注:函数声明并不要求参数名称一致,所以声明时int max(int x,int y)而在定义时int max(int a,int b){}也是可以的。
函数原型对函数调用的指导
对照函数原型即可确定函数调用的形式,以及对返回值的利用方法。
通过函数解决数学问题
用弦截法解方程:
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/*
用弦截法求解方程
数学基础:
介值定理:设函数f(x)在闭区间[a,b]上连续,
且f(a)与f(b)异号(即f(a)*f(b)<0)则在开区间(a,b)内至少有函数f(x)的一个解
据此设计算法:
连接(x1,f(x1))和(x2,f(x2))两点,此弦交X轴于:x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1))
若f(x)与f(x1)同号,则根在(x,x2)区间内,将x作为新的x1
若f(x)与f(x2)同号,则根在(x1,x)区间内,将x作为新的x2
重复运算直到f(x)的绝对值等于零或小于某个极小的值,就能将x作为方程的近似解
*/
double f(double);//用于通过x的值运算f(x)的值
double xpoint(double,double);//用于通过x1,x2的值运算x的值
double root(double,double);//基础方法
int main()
{
double x1,x2,f1,f2,x;
do//此循环用于保证输入的x1,x2区间内有解
{
printf("input x1,x2:");
scanf("%lf%lf",&x1,&x2);
f1=f(x1);
f2=f(x2);
}
while(f1*f2>=0);
x=root(x1,x2);
printf("A root is %.5f\n",x);
return 0;
}
double root(double x1,double x2)
{
double x,y,y1;
y1=f(x1);
do
{
x=xpoint(x1,x2);
y=f(x);
if(y*y1>0)
{
y1=y;
x1=x;
}
else
{
x2=x;
}
}
while(fabs(y)>=0.00001);//当f(x)的绝对值小于0.00001时,就认为x是一个近似解
return x;
}
double xpoint(double x1,double x2)
{
double x;
x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));
return x;
}
/*
方程算式
可以通过改变这个方程,来改变这个架构解决的问题
*/
double f(double x)
{
double y;
y=x*x*x-5*x*x+16*x-80;
return y;
}
结果:
解析:
1.通过合理的使用函数,一个复杂的程序被分割整理的十分简洁易懂
2.弦截法是在高中的数学学习中被我们扣上无用、繁琐的帽子。但在程序编写中却发挥了巨大的作用,还有很多数学上的方法也是如此(如数列的递推公式)。