函数的嵌套调用
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C 程序设计
引入 问题
8.5函数的嵌套调用
我们知道,一元二次方程有求根公式,
一般的一元三次方程、一元四次方程等高
次方程是否也有类似的求根公式呢?
十六世纪中叶,一元三次方程和一元 四次方程求根公式分别被意大利数学家卡
尔达诺和他的学生弗拉利获得
2、说明
(1)如果是调用无参函数,则“实参表列”
可以没有,但括弧不能省略
会导致编译出错,按语法出错提示
思考一下,如果被调函数出现在主调函 数之前,需要声明吗? 如果被调用函数的定义出现在主调函数 之前,可以不必加以声明。因为编译系统已 经先知道了已定义函数的有关情况,会根据
函数首部提供的信息对函数的调用作正确性
检查
8.5.4函数的嵌套调用
和一元高次方程对应的多项式函数属于 初等函数,而初等函数都是连续函数,根据 闭区间上连续函数的零点定理: 设函数 f (x)在闭区间[a,b]上连续,且 f (a) 与 f (b) 异号,那么在开区间(a,b)上至少有 一点 使得 f ( ) 0
(2)如果实参表列包含多个实参,则各参数
间用逗号隔开,实参与形参的个数应相等, 类型应匹配,实参与形参按顺序对应,一一 传递数据
8.5函数的嵌套调用
1、函数调用的一般形式为: 函数名(实参表列);
例如
max(int a,int b,int c); 该语句表明调用了一个函数名为
max的函数,这个函数有三个实在参数
x2
x
( x, f ( x))
(( x, f ( x1)) x1 ))
( x1 , f ( x1 ))
(( x,, ff ( x1)) (( x, f ( x1)) x1 ( x )) x1 ))
(1)取两个不同点 x1 , x2 ,如果 f ( x1 ) 和 f ( x2 ) 符号相反,则 ( x , x ) 区间内必有一个根。如 1 2 果 f ( x1 )与 f ( x2 ) 同符号,则应改变 x1 , x2 ,直 到 f ( x1 ) 、f ( x2 ) 异号为止 (2)连接 ( x1 , f ( x1 ))和( x1 , f ( x1 )) 两点, 此线(即弦)交x轴于x
在一个函数中调用另一函数(即被调 用函数)需要具备哪些条件呢? (1) 被调用的函数必须是已经存在的函数 (是库函数或用户自己定义的函数)
此后三百多年的时间里,推求五次及其以 上高次方程解法的人不可胜数,但都无果而终 直到十九世纪,挪威数学家阿贝尔证明了一般 的五次及五次以上的方程都不可能有公式解法 法国数学奇才伽罗华,非常彻底地把全部代数 方程可解性问题,转化或归结为臵换群及其子 群结构分析的问题,将这一问题彻底解决
根据上述定理知道,只要能找到某个根 所处的大概区间,找到一个合理的算法让这 个区间缩小,根据区间套定理,就可以找见
一点逼近这个方程根的近似值
根据前面的分析,通过演示我们共同可以
得出算法, 以方程 y x5 6x2 2x 8
y
( x2 , f ( x2 ))
x1
0
x x1
x x1
x x1 x
小
结
函数调用的一般形式
函数调用的三种方式
对被调用函数的声明 函数嵌套调用举例
作
业
表达式的运算,函数max是表达式的一部分
3、函数参数:函数调用作为一个函数的实参
例如
m=max(a,max(b,c));
8.5.3 对被调用函数的声明
在一个函数中调用另一函数(即被调 用函数)需要具备哪些条件呢? (1) 被调用的函数必须是已经存在的函数 (是库函数或用户自己定义的函数)
(2) 如果使用库函数,还应该在本文件开头 用# include命令将调用有关库函数时所需 用到的信息“包含”到本文件中来
(2) 如果使用库函数,还应该在本文件开头 用# include命令将调用有关库函数时所需 用到的信息“包含”到本文件中来
(3) 如果使用用户自己定义的函数,而该函
数的位臵在调用它的函数(即主调函数)的 后面(在同一个文件中),应该在主调函数中 对被调用的函数作声明
8.5.3 对被调用函数的声明
注意
函数的“定义”和“声明”不是一回 事 函数的定义是指对函数功能的确立,包
括指定函数名,函数值类型、形参及其类型、 函数体等,它是一个完整的、独立的函数单 位。已经的定义的函数,编译系统会为它分 配相应的存储区域,可以说,定义的过程就 是子函数生成的过程
函数原型的一般形式为
(1) 函数类型 函数名(参数类型1,参数类 型2……); (2) 函数类型 函数名(参数类型1,参数名1, 参数类型2,参数名2……); 做这样的函数原型声明,编译系统会按 照声明的形式做匹配检查,当和原型不匹配
例如
max(int a,int b,int c); 该语句表明调用了一个函数名为
max的函数,这个函数有三个实在参数
2、说明
(1)如果是调用无参函数,则“实参表列”
可以没有,但括弧不能省略
(2)如果实参表列包含多个实参,则各参数
间用逗号隔开,实参与形参的个数应相等, 类型应匹配,实参与形参按顺序对应,一一 传递数据
会导致编译出错,按语法出错提示
思考一下,如果被调函数出现在主调函 数之前,需要声明吗? 如果被调用函数的定义出现在主调函数 之前,可以不必加以声明。因为编译系统已 经先知道了已定义函数的有关情况,会根据
函数首部提供的信息对函数的调用作正确性
检查
8.5.1函数调用的一般形式
1、函数调用的一般形式为: 数组名(实参表列);
{y1=y;x1=x;} else x2=x; } while(fabs(y)>=0.0001); return(x)}
最后定义主函数,调用前面定义过的函数
void main() {float x1,x2,f1,f2,x; do {printf(“input x1,x2:\n”);
scanf(“%f,%f”,&x1,&x2); f1=f(x1);f2=f(x2); }while(f1*f2>0); x=root(x1,x2); printf(“Aroot of the equation is %8.4f\n”,x);}
(3) 如果使用用户自己定义的函数,而该函
数的位臵在调用它的函数(即主调函数)的 后面(在同一个文件中),应该在主调函数中 对被调用的函数作声明
“声明”一词的原文是delaration,声
明的作用是把函数名、函数参数的个数和参
数类型等信息通知编译系统,以便在遇到函 数调用时,编译系统能正确识别函数并检查 调用是否合法.(例如函数名是否正确,实 参与形参的类型和个数是否一致)
其次,定义求弦与x轴交点横坐标函数 float xpoint(float x1,x2) /*定义xpoint函数,求出弦与x轴交点*/ {float y; y=(x1*f(x2)-x2*f(x1)/f(x2)-f(x1);
return(y);
}
再次,定义求根函数
float root(float x1,float x2) {float x,y,y1; y1=f(x1); do{x=xpoint(x1,x2); y=f(x); if(y*y1>0) /*f(x)与f(x1)同符号 */
得到的 x 就是所求的符合精度要求的近似根
f (x ) 代表 x 的函数: x5 5x 2 3x 8 (1) 用函数
(2) 用函数调用 xpo int(x1 , x2 ) 来求 ( x1 , f ( x1 )) 和( x2 , f ( x2 )) 的连线与 x 轴的交点横坐标
jx
(3) 用函数调用root( x1 , x2 ) 来求( x1, x2 )区间的 那个实根。显然,执行函数root () 过程中要用 到到函数 xpo int() ,而执行函数 xpo int() 过
括指定函数名,函数值类型、形参及其类型、 函数体等,它是一个完整的、独立的函数单 位。已经定义的函数,编译系统会为它分配 相应的存储区域,可以说,定义的过程就是 子函数生成的过程
函数原型的一般形式为
(1) 函数类型 函数名(参数类型1,参数类 型2……); (2) 函数类型 函数名(参数类型1,参数名1, 参数类型2,参数名2……); 做这样的函数原型声明,编译系统会按 照声明的形式做匹配检查,当和原型不匹配
8.5.2 函数调用的三种方式
按函数在程序中出现的位臵来分, 可以有以下三种函数调用方式 1、函数语句:把函数调用作为一个语句
例如
scanf(“%d”,&a[i]);
这时不要求函数带回值,只要求函 数完成一定的操作
2、函数表达式:函数出现在一个表达式中
例如
c=2*max(a,b);
这时要求函数带回一个确定的值以参加
(3) 若 f ( x1 ) 与 f (x) 同号,则根必在( x, x2 ) 区
间内,此时将 x 作为新的x1 ,如果f (x) 与f ( x2 ) 同符号,则表示根在 ( x1 , x)区间内,将x作为新 的 x2
(4) 重复步骤(2)和(3),直到| f ( x) | 为止,
为一个很小的数,此时认为| f ( x) | 0 ,此时
程 include <stdio.h> include <math.h>
float f(float x) /*定义f函数,以实现f(x)=x3-5x2+16x-80*/ {float y; y=(x*x-6)*x*x-2)*x-8; return(y); }
“声明”一词的原文是decleration,
声明的作用是把函数名、函数参数的个数和
参数类型等信息通知编译系统,以便在遇到 函数调用时,编译系统能正确识别函数并检 查调用是否合法.(例如函数名是否正确, 实参与形参的类型和个数是否一致)
注意
函数的“定义”和“声明”不是一回 事 函数的定义是指对函数功能的确立,包
引入 问题
8.5函数的嵌套调用
我们知道,一元二次方程有求根公式,
一般的一元三次方程、一元四次方程等高
次方程是否也有类似的求根公式呢?
十六世纪中叶,一元三次方程和一元 四次方程求根公式分别被意大利数学家卡
尔达诺和他的学生弗拉利获得
2、说明
(1)如果是调用无参函数,则“实参表列”
可以没有,但括弧不能省略
会导致编译出错,按语法出错提示
思考一下,如果被调函数出现在主调函 数之前,需要声明吗? 如果被调用函数的定义出现在主调函数 之前,可以不必加以声明。因为编译系统已 经先知道了已定义函数的有关情况,会根据
函数首部提供的信息对函数的调用作正确性
检查
8.5.4函数的嵌套调用
和一元高次方程对应的多项式函数属于 初等函数,而初等函数都是连续函数,根据 闭区间上连续函数的零点定理: 设函数 f (x)在闭区间[a,b]上连续,且 f (a) 与 f (b) 异号,那么在开区间(a,b)上至少有 一点 使得 f ( ) 0
(2)如果实参表列包含多个实参,则各参数
间用逗号隔开,实参与形参的个数应相等, 类型应匹配,实参与形参按顺序对应,一一 传递数据
8.5函数的嵌套调用
1、函数调用的一般形式为: 函数名(实参表列);
例如
max(int a,int b,int c); 该语句表明调用了一个函数名为
max的函数,这个函数有三个实在参数
x2
x
( x, f ( x))
(( x, f ( x1)) x1 ))
( x1 , f ( x1 ))
(( x,, ff ( x1)) (( x, f ( x1)) x1 ( x )) x1 ))
(1)取两个不同点 x1 , x2 ,如果 f ( x1 ) 和 f ( x2 ) 符号相反,则 ( x , x ) 区间内必有一个根。如 1 2 果 f ( x1 )与 f ( x2 ) 同符号,则应改变 x1 , x2 ,直 到 f ( x1 ) 、f ( x2 ) 异号为止 (2)连接 ( x1 , f ( x1 ))和( x1 , f ( x1 )) 两点, 此线(即弦)交x轴于x
在一个函数中调用另一函数(即被调 用函数)需要具备哪些条件呢? (1) 被调用的函数必须是已经存在的函数 (是库函数或用户自己定义的函数)
此后三百多年的时间里,推求五次及其以 上高次方程解法的人不可胜数,但都无果而终 直到十九世纪,挪威数学家阿贝尔证明了一般 的五次及五次以上的方程都不可能有公式解法 法国数学奇才伽罗华,非常彻底地把全部代数 方程可解性问题,转化或归结为臵换群及其子 群结构分析的问题,将这一问题彻底解决
根据上述定理知道,只要能找到某个根 所处的大概区间,找到一个合理的算法让这 个区间缩小,根据区间套定理,就可以找见
一点逼近这个方程根的近似值
根据前面的分析,通过演示我们共同可以
得出算法, 以方程 y x5 6x2 2x 8
y
( x2 , f ( x2 ))
x1
0
x x1
x x1
x x1 x
小
结
函数调用的一般形式
函数调用的三种方式
对被调用函数的声明 函数嵌套调用举例
作
业
表达式的运算,函数max是表达式的一部分
3、函数参数:函数调用作为一个函数的实参
例如
m=max(a,max(b,c));
8.5.3 对被调用函数的声明
在一个函数中调用另一函数(即被调 用函数)需要具备哪些条件呢? (1) 被调用的函数必须是已经存在的函数 (是库函数或用户自己定义的函数)
(2) 如果使用库函数,还应该在本文件开头 用# include命令将调用有关库函数时所需 用到的信息“包含”到本文件中来
(2) 如果使用库函数,还应该在本文件开头 用# include命令将调用有关库函数时所需 用到的信息“包含”到本文件中来
(3) 如果使用用户自己定义的函数,而该函
数的位臵在调用它的函数(即主调函数)的 后面(在同一个文件中),应该在主调函数中 对被调用的函数作声明
8.5.3 对被调用函数的声明
注意
函数的“定义”和“声明”不是一回 事 函数的定义是指对函数功能的确立,包
括指定函数名,函数值类型、形参及其类型、 函数体等,它是一个完整的、独立的函数单 位。已经的定义的函数,编译系统会为它分 配相应的存储区域,可以说,定义的过程就 是子函数生成的过程
函数原型的一般形式为
(1) 函数类型 函数名(参数类型1,参数类 型2……); (2) 函数类型 函数名(参数类型1,参数名1, 参数类型2,参数名2……); 做这样的函数原型声明,编译系统会按 照声明的形式做匹配检查,当和原型不匹配
例如
max(int a,int b,int c); 该语句表明调用了一个函数名为
max的函数,这个函数有三个实在参数
2、说明
(1)如果是调用无参函数,则“实参表列”
可以没有,但括弧不能省略
(2)如果实参表列包含多个实参,则各参数
间用逗号隔开,实参与形参的个数应相等, 类型应匹配,实参与形参按顺序对应,一一 传递数据
会导致编译出错,按语法出错提示
思考一下,如果被调函数出现在主调函 数之前,需要声明吗? 如果被调用函数的定义出现在主调函数 之前,可以不必加以声明。因为编译系统已 经先知道了已定义函数的有关情况,会根据
函数首部提供的信息对函数的调用作正确性
检查
8.5.1函数调用的一般形式
1、函数调用的一般形式为: 数组名(实参表列);
{y1=y;x1=x;} else x2=x; } while(fabs(y)>=0.0001); return(x)}
最后定义主函数,调用前面定义过的函数
void main() {float x1,x2,f1,f2,x; do {printf(“input x1,x2:\n”);
scanf(“%f,%f”,&x1,&x2); f1=f(x1);f2=f(x2); }while(f1*f2>0); x=root(x1,x2); printf(“Aroot of the equation is %8.4f\n”,x);}
(3) 如果使用用户自己定义的函数,而该函
数的位臵在调用它的函数(即主调函数)的 后面(在同一个文件中),应该在主调函数中 对被调用的函数作声明
“声明”一词的原文是delaration,声
明的作用是把函数名、函数参数的个数和参
数类型等信息通知编译系统,以便在遇到函 数调用时,编译系统能正确识别函数并检查 调用是否合法.(例如函数名是否正确,实 参与形参的类型和个数是否一致)
其次,定义求弦与x轴交点横坐标函数 float xpoint(float x1,x2) /*定义xpoint函数,求出弦与x轴交点*/ {float y; y=(x1*f(x2)-x2*f(x1)/f(x2)-f(x1);
return(y);
}
再次,定义求根函数
float root(float x1,float x2) {float x,y,y1; y1=f(x1); do{x=xpoint(x1,x2); y=f(x); if(y*y1>0) /*f(x)与f(x1)同符号 */
得到的 x 就是所求的符合精度要求的近似根
f (x ) 代表 x 的函数: x5 5x 2 3x 8 (1) 用函数
(2) 用函数调用 xpo int(x1 , x2 ) 来求 ( x1 , f ( x1 )) 和( x2 , f ( x2 )) 的连线与 x 轴的交点横坐标
jx
(3) 用函数调用root( x1 , x2 ) 来求( x1, x2 )区间的 那个实根。显然,执行函数root () 过程中要用 到到函数 xpo int() ,而执行函数 xpo int() 过
括指定函数名,函数值类型、形参及其类型、 函数体等,它是一个完整的、独立的函数单 位。已经定义的函数,编译系统会为它分配 相应的存储区域,可以说,定义的过程就是 子函数生成的过程
函数原型的一般形式为
(1) 函数类型 函数名(参数类型1,参数类 型2……); (2) 函数类型 函数名(参数类型1,参数名1, 参数类型2,参数名2……); 做这样的函数原型声明,编译系统会按 照声明的形式做匹配检查,当和原型不匹配
8.5.2 函数调用的三种方式
按函数在程序中出现的位臵来分, 可以有以下三种函数调用方式 1、函数语句:把函数调用作为一个语句
例如
scanf(“%d”,&a[i]);
这时不要求函数带回值,只要求函 数完成一定的操作
2、函数表达式:函数出现在一个表达式中
例如
c=2*max(a,b);
这时要求函数带回一个确定的值以参加
(3) 若 f ( x1 ) 与 f (x) 同号,则根必在( x, x2 ) 区
间内,此时将 x 作为新的x1 ,如果f (x) 与f ( x2 ) 同符号,则表示根在 ( x1 , x)区间内,将x作为新 的 x2
(4) 重复步骤(2)和(3),直到| f ( x) | 为止,
为一个很小的数,此时认为| f ( x) | 0 ,此时
程 include <stdio.h> include <math.h>
float f(float x) /*定义f函数,以实现f(x)=x3-5x2+16x-80*/ {float y; y=(x*x-6)*x*x-2)*x-8; return(y); }
“声明”一词的原文是decleration,
声明的作用是把函数名、函数参数的个数和
参数类型等信息通知编译系统,以便在遇到 函数调用时,编译系统能正确识别函数并检 查调用是否合法.(例如函数名是否正确, 实参与形参的类型和个数是否一致)
注意
函数的“定义”和“声明”不是一回 事 函数的定义是指对函数功能的确立,包