例5:输入两个实数,并求出其中的大数。设计 个函数max()来实现这一功能。 51 若输入:24323219 则输出: 两个数中的大数为:3219 函数的调用过程如下: main()函数 调用函数max() 函数max() 结束 执行函数max()的函数体 2021/224 16
2021/2/24 16 例5:输入两个实数,并求出其中的大数。设计一 个函数max( )来实现这一功能。 51 若输入:243.2 321.9 则输出: 两个数中的大数为:321.9 函数的调用过程如下: main( )函数 调用函数max( ) 函数max( ) 结束 执行函数max( )的函数体
参数缺省函数 在函数声明时,其形式参数可以赋值作为 省略值,在调用函数时,若实参数目少于形 参数目时,参数缺省值从右到左调用。 注意:声明和调用时都从右到左。 为什么要用参数缺省函数? 1.对函数的实参实行初始化 2.使函数的定义和调用更具有一般性。 3.降低编程的复杂性,降低程序出错的 可能性。 2021/224
2021/2/24 17 参数缺省函数 在函数声明时,其形式参数可以赋值作为 省略值,在调用函数时,若实参数目少于形 参数目时,参数缺省值从右到左调用。 注意:声明和调用时都从右到左。 为什么要用参数缺省函数? 1. 对函数的实参实行初始化。 2. 使函数的定义和调用更具有一般性。 3. 降低编程的复杂性, 降低程序出错的 可能性
例6:函数可声明为(从右到左缺省) void fO(float x, int y, char z) void fl(float x, int y, charFB); void f2 (float x, int y=4, charEB); void f3(float x=l, int y=4, char FB); 调用时(从右到左补充) float a=2.1; int b=5; char=C; f3(a,b,c); ∥三参数值为:a,b,c f3(a,b); ∥参数值为:a,b,B f30; 参数值为:1,4,B fl(a, b) ∥参数值为:a,b,B f0(a,b,c); ∥参数值为:a,b,c f0(a,b);f(a);f20; ∥错误 问题:是否只要定义一个函数f3? 2021/2/24 18
2021/2/24 18 例6:函数可声明为(从右到左缺省) void f0(float x, int y, char z); void f1(float x, int y, char z=`B`); void f2(float x, int y=4, char z=`B`); void f3(float x=1, int y=4, char z=`B`); 调用时(从右到左补充) : float a=2.1; int b= 5; char c=`C`; f3(a,b,c); //三参数值为:a, b, c f3(a,b); //三参数值为:a, b, `B` f3( ); //三参数值为:1, 4, `B` f1(a,b); //三参数值为:a, b, `B` f0(a,b,c); //三参数值为:a, b, c f0(a,b); f1(a); f2( ); //错误 问题:是否只要定义一个函数 f3?
函数的嵌套和递归调用 在调用一个函数时,该函数体内又调用另 个函数,称为函数的嵌套 main(函数 f10函数 f20函数 调用f1(函数;调用f2函数; 后续语句; 后续语句 结束 返回 返回 2021/224 19
2021/2/24 19 函数的嵌套和递归调用 在调用一个函数时,该函数体内又调用另一 个函数,称为函数的嵌套
函数A中出现调用函数A,或A中调用函数B,B中 又调用函数A,则称为递归调用。前者称直接递归, 后者称间接递归。 例7:求5和10 递归调用和回推过程如下:54 5*f(4) 5*24=120 4*f(3) 4*6=24 3*f(2 3*2=6 2“f(1 21=2 2021/224
2021/2/24 20 例7:求5!和10!。 54 函数A中出现调用函数A,或A中调用函数B,B中 又调用函数A,则称为递归调用。前者称直接递归, 后者称间接递归。 递归调用和回推过程如下: 5*f(4) 4*f(3) 3*f(2) 2*f(1) 1 5*24=120 4*6=24 3*2=6 2*1=2