第5章-函数与预处理.ppt
《第5章-函数与预处理.ppt》由会员分享,可在线阅读,更多相关《第5章-函数与预处理.ppt(91页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5 5章章 函数与预处理函数与预处理 5.1 函数的定义函数的定义 5.2 函数的调用函数的调用 5.3 指针与函数指针与函数 5.4 函数的嵌套函数的嵌套 5.5 函数的递归函数的递归 5.6 内联函数和重载函数内联函数和重载函数 5.7 带默认形参值的函数带默认形参值的函数 5.8 作用域与生命期作用域与生命期 5.9 编译预处理编译预处理12/23/20221Question?什么是函数?什么是函数?为什么要使用函数?为什么要使用函数?12/23/202225.1 函数的定义函数的定义函数函数的概念的概念函数是一个能完成某一独立功能的程序函数是一个能完成某一独立功能的程序模块模块函数
2、函数的作用的作用把一个复杂的程序分解成若干个功能相把一个复杂的程序分解成若干个功能相对独立的小模块对独立的小模块避免代码的重复,优化程序结构,提高避免代码的重复,优化程序结构,提高程序的开发效率程序的开发效率12/23/20223函数的定义函数的定义一般格式一般格式合法标识符合法标识符函数返回值类型函数返回值类型缺省缺省int型型无返回值无返回值void函数体函数体数据类型数据类型 函数名函数名(形式参数列表形式参数列表)说明部分说明部分语句部分语句部分例例 有参函数有参函数 int max(int x,int y)int z;z=xy?x:y;return(z);例例 有参函数有参函数 in
3、t max(int x,y)int z;z=xy?x:y;return(z);例例 空函数空函数 dummy()函数体为空函数体为空例例 无参函数无参函数 printstar()cout“*n”;或或 printstar(void)cout“*n”;12/23/20224函数的返回值函数的返回值返回语句返回语句形式:形式:return(表达式表达式);或或 return 表达式表达式;或或 return;功能:使程序控制从被调用函数返回到调用函数功能:使程序控制从被调用函数返回到调用函数中,同时把返中,同时把返回回值值(只能有一个)(只能有一个)带给调用函数带给调用函数说明:说明:u函数中可有
4、多个函数中可有多个return语句语句,但每次调用只能执行一个但每次调用只能执行一个u若无若无return语句,遇语句,遇时,自动返回调用函数时,自动返回调用函数u若函数类型与若函数类型与return语句中表达式值的类型不一致,语句中表达式值的类型不一致,按前者为准,自动转换按前者为准,自动转换-函数调用转换函数调用转换uvoid型函数型函数可无可无return语句语句例例 无返回值函数无返回值函数 void swap(int x,int y)int temp;temp=x;x=y;y=temp;12/23/20225例例 函数返回值类型转换函数返回值类型转换#include max(floa
5、t x,float y)float z;z=xy?x:y;return(z);void main()float a,b;int c;cinab;c=max(a,b);coutMax is c;12/23/20226函数声明函数声明函数声明也称为函数原型说明函数声明也称为函数原型说明u一般形式一般形式数据类型数据类型 函数名函数名(形参形参类型类型说明表说明表);例:例:double power(double,int);或或 数据类型数据类型 函数名函数名(形参列表形参列表);例:例:double power(double x,int n);12/23/20227函数声明说明函数声明说明函数原型
6、说明中形参名可以任意;函数原型说明中形参名可以任意;除形参名外,函数原型必须和所定义的函除形参名外,函数原型必须和所定义的函数完全一致;数完全一致;函数调用在前,定义在后时,必须在调用函数调用在前,定义在后时,必须在调用该函数之间的位置对函数进行原型说明;该函数之间的位置对函数进行原型说明;当函数定义出现在函数调用之前时,可省当函数定义出现在函数调用之前时,可省略函数原型声明略函数原型声明main是主函数,在程序中不被任何函数调是主函数,在程序中不被任何函数调用,不需要原型说明。用,不需要原型说明。12/23/202285.2 函数的调用函数的调用函数的调用形式函数的调用形式u函数名函数名(实
7、际参数表实际参数表);u说明:说明:l实参与形参实参与形参个数相等,类型一致,按个数相等,类型一致,按顺序一一对应顺序一一对应l实参可以是常量,变量,表达式,它实参可以是常量,变量,表达式,它们在们在调用前都应有确定的值调用前都应有确定的值l对于对于无参函数无参函数,函数调用中的实参表,函数调用中的实参表为空,但为空,但圆括号不能省略圆括号不能省略12/23/202295.2 函数的调用函数的调用调用方式调用方式u函数语句函数语句 例:例:printstar();cout“Hello,World!”;u函数表达式函数表达式 例:例:m=max(a,b)*2;u函数参数函数参数 例例 coutm
8、ax(a,b);m=max(a,max(b,c);12/23/2022105.2.3 函数调用的过程函数调用的过程main()调调fun()结束结束fun()返回返回保存:保存:返回地址返回地址当前现场当前现场恢复:恢复:主调程序现场主调程序现场返回地址返回地址12/23/2022115.2.4 参数传递机制参数传递机制C+中有两种不同的参数传递机制中有两种不同的参数传递机制u传值调用传值调用l变量的值传递变量的值传递l变量的地址值传递变量的地址值传递u引用调用引用调用12/23/202212传值调用传值调用在函数被调用时才分配形参的存储单元。在函数被调用时才分配形参的存储单元。实参可以是常量
9、、变量或表达式。实参可以是常量、变量或表达式。实参类型必须与形参相符。实参类型必须与形参相符。传递时是传递参数值,即单向传递,形传递时是传递参数值,即单向传递,形参值的修改并不会影响实参的值。参值的修改并不会影响实参的值。12/23/202213传值调用示例传值调用示例XN被调函数:被调函数:主调函数:主调函数:3 2.5AD=power(A,3)2.53double power(double X,int N)12/23/202214例例5.9 输入两整数交换后输出输入两整数交换后输出(传递变量的值传递变量的值)#includeiostream.hvoid swap(int x,int y)i
10、nt t=x;x=y;y=t;void main()int a=3;int b=4;couta=ab=bendl;cout-swap-endl;swap(a,b);couta=ab=bendl;34a:b:调用前:调用前:调用结束:调用结束:34a:b:调用:调用:34x:y:34a:b:swap:34a:b:43x:y:temp12/23/202215例例5.10 输入两整数交换后输出输入两整数交换后输出(传递变量的地址,交换变量的值传递变量的地址,交换变量的值)#includeiostream.hvoid swap(int*x,int*y)int t=*x;*x=*y;*y=t;void
11、main()int a=3;int b=4;couta=ab=bendl;cout-swap-endl;swap(&a,&b);couta=ab=bendl;a34b调前:调前:a34b调调swap:x&a&bya43b交换:交换:x&a&bya43b返回:返回:12/23/202216例例5.11 输入两整数交换后输出输入两整数交换后输出(传递变量的地址,交换变量的地址传递变量的地址,交换变量的地址)#includeiostream.hvoid swap(int*x,int*y)int*t=x;x=y;y=t;void main()int a=3;int b=4;couta=ab=bendl
12、;cout-swap-endl;swap(&a,&b);couta=ab=bendl;a34b调前:调前:a34b调调swap:x&a&bya34b交换:交换:y&a&bxa34b返回:返回:12/23/202217引用调用引用调用引用引用(&)是标识符的别名是标识符的别名,例如例如:int i,j;int&ri=i;/建立一个建立一个int型的引用型的引用ri,并将其并将其 /初始化为变量初始化为变量i的一个别名的一个别名j=10;ri=j;/相当于相当于 i=j;声明一个引用时,必须同时对它进行初始化,声明一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象。使它指向一个已存在的对
13、象。一旦一个引用被初始化后,就不能改为指向其一旦一个引用被初始化后,就不能改为指向其它对象。它对象。引用可以作为形参引用可以作为形参 void swap(int&a,int&b).12/23/202218例例5.13 输入两整数交换后输出输入两整数交换后输出(使用引用调用使用引用调用)#includeiostream.hvoid swap(int&x,int&y)int t=x;x=y;y=t;void main()int a=3;int b=4;couta=ab=bendl;cout-swap-endl;swap(a,b);couta=ab=bendl;a34b调前:调前:a34b调调swa
14、p:xa的别名的别名b的别名的别名ya43b返回:返回:a43b交换:交换:xa的别名的别名b的别名的别名y12/23/2022195.3 指针与函数指针与函数指针变量作为函数参数指针变量作为函数参数函数调用中数组的传递函数调用中数组的传递函数指针函数指针(指向函数的指针指向函数的指针)指针函数指针函数(函数返回值为指针函数返回值为指针)12/23/202220函数调用中数组的传递函数调用中数组的传递1.实参为数组名,形参为指针变量实参为数组名,形参为指针变量u例例5.14 用用sort函数对整型数组进行排序函数对整型数组进行排序void sort(int*s,int n)void main(
15、)int aN;sort(a,N);当数组首地址当数组首地址a传递传递给形参指针变量给形参指针变量s后,后,a和和s指向同一块内存指向同一块内存空间空间12/23/202221函数调用中数组的传递函数调用中数组的传递2.实参为数组名,形参也为数组名实参为数组名,形参也为数组名u例例5.16 用用inverse函数逆序输出整型数组函数逆序输出整型数组void inverse(int s,int n);void main()int tN;inverse(t,N);形参数组与实参数形参数组与实参数组指向同一块内存组指向同一块内存空间空间一维形参数组一维形参数组大小可不指定,大小可不指定,但多维形参数
16、但多维形参数组仅可省略第组仅可省略第一维一维12/23/202222函数调用中数组的传递函数调用中数组的传递3.实参为数组名,形参为引用实参为数组名,形参为引用u例例5.19 用用inverse函数逆序输出整型数组函数逆序输出整型数组typedef int array10;void inverse(array&s,int n);void main()int tN;inverse(t,N);为数组为数组t起了个别名起了个别名s,对数组对数组s操作,就操作,就相当于对相当于对t操作操作定义一个长度为定义一个长度为10的整型数组,的整型数组,并将其作为一个并将其作为一个类型,类型名为类型,类型名为a
17、rray12/23/202223函数指针函数指针(指向函数的指针指向函数的指针)函数在编译时被分配的函数在编译时被分配的入口地址入口地址,用用函数名函数名表示表示max.指令1指令2u函数指针变量赋值函数指针变量赋值:如如p=max;函数返回值的数据类型专门存放函数入口地址可指向返回值类型相同的不同函数函数指针:指向函数的指针变量,该指针存储的是函数指针:指向函数的指针变量,该指针存储的是函数的入口地址,它指向程序代码存储区。函数的入口地址,它指向程序代码存储区。u定义形式:定义形式:数据类型数据类型 (*指针变量名指针变量名)(形参列表形参列表);如如 int (*p)(int a,int
18、b);函数指针变量指向的函数必须有函数说明u函数调用形式:函数调用形式:c=max(a,b);c=(*p)(a,b);c=p(a,b);u对函数指针变量对函数指针变量p n,p+,p-无意义无意义()不能省int(*p)()与 int *p()不同12/23/202224例例5.20 用函数指针变量调用函数用函数指针变量调用函数#includeiostream.hint func(int a,int b);void main()int(*pf)(int a,int b);pf=func;coutplease enter two integers:mn;int result=(*pf)(m,n)
19、;/int result=pf(m,n);coutresult isresultab;process(a,b,max);process(a,b,min);process(a,b,add);void process(int x,int y,int(*fun)()int result;result=(*fun)(x,y);coutresultendl;int max(int x,int y)coutcoutmax=;y?x:y);return(xy?x:y);int min(int x,int y)coutcoutmin=;min=;return(xy?x:y);return(xy?x:y);in
20、t add(int x,int y)coutcoutsum=;sum=;return(x+y);return(x+y);12/23/202226指针函数指针函数指针函数:函数的返回值为指针的函数指针函数:函数的返回值为指针的函数u定义形式:定义形式:数据类型数据类型 *函数名函数名(参数表参数表);如如 int *pf(int x,int y);例例5.22(p150)char*month_name(int n)char*name=“illegal month”,“January”,“December”;return(n12)?name0:namen);12/23/2022275.4 函数的嵌
21、套调用函数的嵌套调用main调调fun1()结束结束fun1()调调fun2()返回返回fun2()返回返回12/23/202228例例5.23 用截弦法求解用截弦法求解f(x)=x34x2+9x16的根的根(2)连接连接f(x1)和和f(x2)两点,此线两点,此线(即弦即弦)交交x轴于轴于x,如右如右图图所示所示再从再从x求出求出f(x)。xyxf(x1)f(x)x1x2f(x2)x点坐标可用下式求出:点坐标可用下式求出:(1)取两个不同点取两个不同点x1、x2,如果如果f(x1)和和f(x2)符号相反,则符号相反,则(x1,x2)区间内必有区间内必有一个根。如果一个根。如果f(x1)与与f
22、(x2)同符号,同符号,则应改变则应改变x1、x2,直到直到f(x1)、f(x2)异异号为止。注意号为止。注意x1、x2的值不应差太大,的值不应差太大,以保证以保证(x1,x2)区间只有一根。区间只有一根。12/23/202229根据上述思路画出根据上述思路画出n-s流程流程图,图,如右如右图图所示所示输入输入x1、x2,求求f(x1)、f(x2)直到直到f(x1)与与f(x2)异号异号求求f(x1)与与f(x2)连线与连线与x轴的轴的交点交点xy=f(x),y=f(x1)y与与y1同号同号x1=xy1=yx2=xy2=y直到直到|f(x)|root=x 输出输出root真真假假(3)若若f(
23、x)与与f(x1)同符号,则根必在同符号,则根必在(x,x2)区间内,此时将区间内,此时将x作为新的作为新的x1。如果如果f(x)与与f(x2)同符号,则表示根在同符号,则表示根在(x1,x2)区间内,将区间内,将x作为新的作为新的x2.(4)重复步骤重复步骤(2)和和(3),直到,直到|f(x)|0)/f(x)与与f(x1)同符号同符号 y1=y;x1=x;else x2=x;while(fabs(y)=0.000001);return x;12/23/202232void main()/主函数主函数 double x1,x2,y1,y2,x;do cout请输入根所在的范围:请输入根所在的
24、范围:x1x2;y1=f(x1);y2=f(x2);cout两端点的值为两端点的值为y1,y2=0);x=root(x1,x2);cout在在x1与与x2“之间,方程的解为之间,方程的解为x1)1.从数学上定义从数学上定义2.源程序源程序#includeiostream.h double fac(int n)double f;if(n=1)f=1;else f=n*fac(n-1);return f;12/23/202236void main()int a;double y;coutinput a integer number:a;y=fac(a);couta!=yendl;12/23/202
25、2373.执行过程执行过程:设输入设输入n5fac(5)f=5 fac(4);fac(4)f=4 fac(3);return f;fac(3)f=3 fac(2);return f;fac=4!n=4n=3fac=3!12/23/2022383.执行过程执行过程:设输入设输入n5fac(2)f=2 fac(1);return f;fac(1)f=1;return f;n=1fac=1n=2fac=2!12/23/202239可简化表示为可简化表示为n=1n=2n=3n=4fac=4!fac=3!fac=2!fac=1n=5 当变成机器代码时当变成机器代码时,将其拉成直线将其拉成直线(线性程线性
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 预处理
限制150内