《好用的工具函数.ppt》由会员分享,可在线阅读,更多相关《好用的工具函数.ppt(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、好用的工具函数函数的声明、定义以及调用函数的类型和返回值形式参数与实际参数,参数值的传递函数重载多功能“开瓶器”递归函数汉诺塔游戏带有缺省参数值的函数自动的“工具”内联函数变量的作用域、生存周期和存储类别主函数写得很简单,它的作用就是调用各个函数,程序各部分的功能全部都是由各函数实现的。主函数相当于总调度,调动各函数依次实现各项功能。库函数:开发商和软件开发人员将一些常用的功能模块编写成函数,放在函数库中供公共选用。一个程序文件中可以包含若干个函数,但只能有一个main函数。程序总是从main函数开始执行的,主函数调用其他函数,其他函数也可以互相调用。函数(function):一个函数就是一个
2、功能。例 在主函数中调用其他函数。void printstar(void)cout*endl;void print_message(void)cout Welcome to C+!endl;int main(void)printstar();print_message();printstar();return 0;定义函数的一般形式定义函数的一般形式函数声明的语法形式函数返回值函数返回值函数名(形式参数表)函数名(形式参数表)复合语句复合语句C+C+要求在定义函数时必须指定函数的类型!要求在定义函数时必须指定函数的类型!给你的函数起个好名字!给你的函数起个好名字!若无参数,写void是被初始化
3、的内部变量,寿命和可见性仅限于函数内部若无返回值,写void形式参数表name_1,.,name_n函数的返回值由由return语句给出语句给出无返回值的函数(无返回值的函数(void类型)类型),不必写不必写return语句语句例:无参函数void printstar(void)cout*y?x:y;return(z);例:调用函数时的数据传递。int max(int x,int y)int z;z=xy?x:y;return(z);int main()int a,b,c;cinab;c=max(a,b);coutmax=cy?x:y;return(z);intmain()inta,b,c;
4、cinab;c=max(a,b);coutmax=cendl;return0;(4)如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准,即函数类型决定返回值的类型(3)函数返回值的类型:应是确定的类型,必须在定义函数时指定函数值的类型按函数在语句中的作用来分,可以有以下3种函数调用方式:1.函数语句如printstar();2.函数表达式如c=2*max(a,b);3.函数参数函数调用作为一个函数的实参如m=max(a,max(b,c);函数调用的方式函数调用的方式一个函数调用另一个函数需要具备的条件:(1)首先被调用的函数必须是已经存在的函数。首先被调用的函数必须是已经存
5、在的函数。(2)如果使用库函数,应该在文件开头用如果使用库函数,应该在文件开头用#include命令将有关头文件命令将有关头文件“包含包含”到本文件中来到本文件中来(3)如果使用用户自己定义的函数,而该函数与如果使用用户自己定义的函数,而该函数与调用它的函数(即主调函数)在同一个程序单位调用它的函数(即主调函数)在同一个程序单位中中,且位置在主调函数之后,则必须在调用此函数且位置在主调函数之后,则必须在调用此函数之前对被调用的函数作之前对被调用的函数作声明声明。函数声明(declare):在函数尚在未定义的情况下,事先将该函数的有关信息通知编译系统,以便使编译能正常进行。void main()
6、floatadd(floatx,floaty);float a,b,c;coutab;c=add(a,b);coutsum=cendl;floatadd(floatx,floaty)float z;z=x+y;return(z);调用前先声明函数原型:函数返回值 函数名(形参表);注意:对函数的定义和声明不是同一件事情。n定义是指对函数功能的确立,包括指定函数名、定义是指对函数功能的确立,包括指定函数名、函数类型、形参及其类型、函数体等,它是一个函数类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。完整的、独立的函数单位。n声明的作用则是把函数的名字、函数类型以及声明的作用则是把函
7、数的名字、函数类型以及形参的个数、类型和顺序形参的个数、类型和顺序(注意,不包括函数体注意,不包括函数体)通知编译系统,以便在对包含函数调用的语句进通知编译系统,以便在对包含函数调用的语句进行编译时,据此对其进行对照检查(例如函数名行编译时,据此对其进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)。是否正确,实参与形参的类型和个数是否一致)。函数原型(function prototype)在函数声明中也可以不写形参名,而只写形参的类型在函数声明中也可以不写形参名,而只写形参的类型floatadd(float,float);这种函数声明称为这种函数声明称为函数原型函数原型(fu
8、nctionprototype)。作用:作用:根据函数原型在程序编译阶段对调用函数的合法根据函数原型在程序编译阶段对调用函数的合法性进行全面检查。如果发现与函数原型不匹配的函数调用性进行全面检查。如果发现与函数原型不匹配的函数调用就报告编译出错。它属于语法错误。用户根据屏幕显示的就报告编译出错。它属于语法错误。用户根据屏幕显示的出错信息很容易发现和纠正错误。出错信息很容易发现和纠正错误。应当保证函数原型与函数首部写法上的一致,即函数类型、应当保证函数原型与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序必须相同。在函函数名、参数个数、参数类型和参数顺序必须相同。在函数调用
9、时函数名、实参类型和实参个数应与函数原型一致。数调用时函数名、实参类型和实参个数应与函数原型一致。程序员习惯用法:(1)一般都把main函数写在最前面,用函数原型来声明函数。(2)函数声明的位置可以在调用函数所在的函数中,也可以在函数之外。函数调用的执行过程调用函数时需要一定的调用函数时需要一定的时间和空间时间和空间的开销:的开销:main()调fun()结束fun()返回保存:返回地址当前现场恢复:主调程序现场返回地址例:用函数实现交换变量例:用函数实现交换变量#includeusingnamespacestd;voidswap(intx,inty);/交换交换函数声明函数声明intmain
10、()inta=10,b=55;swap(a,b);/调用交换函数调用交换函数couta=aendl;coutb=bendl;return0;voidswap(intx,inty)/交换函交换函数定义数定义inttemp;temp=x;x=y;y=temp;运行结果运行结果a=10b=55为什么会这样为什么会这样?!?!问题的所在问题的所在变量aswap变量bswap变量tempswap数据1数据2数据2变量amain变量bmain数据1数据2数据1数据2函数调用结束后,函数调用结束后,swap函数内的变量函数内的变量都消失了,主函数的变量没有变化。都消失了,主函数的变量没有变化。给变量和参数起
11、个给变量和参数起个“绰号绰号”引用引用所谓引用(Reference)就是给变量起一个“别名”。对变量引用的操作相当于对变量本身的操作,例如:inta;int&b=a;intb=5;相当于inta;inta=5;用引用传递参数用引用传递参数变量amain变量bmain变量tempswap变量amain变量bmain使用了引用之后,函数可以导致使用了引用之后,函数可以导致调用处的变量发生改变。调用处的变量发生改变。数据1数据2数据1数据2数据2用函数交换变量用函数交换变量编码编码#includeusingnamespacestd;voidswap(int&x,int&y);/交换函数,用引用传递参
12、数交换函数,用引用传递参数intmain()inta=10,b=55;swap(a,b);/调用交换函数调用交换函数couta=aendl;coutb=bi1i2i3;/输入3个整数 i=max(i1,i2,i3);/求3个整数中的最大者 couti_max=id1d2d3;/输入3个双精度数 d=max(d1,d2,d3);/求3个双精度数中的最大者 coutd_max=dg1g2g3;/输入3个长整数 g=max(g1,g2,g3);/求3个长整数中的最大者 coutg_max=ga)a=b;if(ca)a=c;return a;double max(double a,double b,d
13、ouble c)/定义求3个双精度数中的最大者 if(ba)a=b;if(ca)a=c;return a;long max(long a,long b,long c)/定义求3个长整数中的最大者的函数 if(ba)a=b;if(ca)a=c;return a;老和尚和小和尚的故事老和尚和小和尚的故事从前有座山,山上有座庙,庙里住着老和尚和小和尚,老和尚给小和尚讲故事:“从前有座山,山上有座庙,庙里住着老和尚和小和尚,老和尚给小和尚讲故事:从前有座山,山上有座庙,庙里住着老和尚和小和尚,老和尚给小和尚讲故事:从前”函数的递归调用函数的递归调用函数直接或间接地调用自身,称为递归调用。函数直接或间接
14、地调用自身,称为递归调用。递归过程的两个阶段:递推:递推:4!=43!3!=32!2!=21!1!=10!0!=1未知未知已知已知回归:回归:4!=43!=243!=32!=62!=21!=21!=10!=10!=1未知 已知例:用递归方法求!。可用下面的递归公式表示:n!=1(n=0,1)n(n-1)!(n1)long fac(int n)/递归函数 long f;if(n0)coutn0,data error!endl;f=-1;else if(n=0|n=1)f=1;else f=fac(n-1)*n;return f;求Fibonacci数列前40个数。这个数列有如下特点:第1、2个数
15、为1、1。从第3个数开始,每个数是其前面两个数之和。即F1=1 (n=1)F2=1 (n=2)Fn=Fn-1+Fn-2 (n3)intF(intn)if(na)a=b;if(ca)a=c;returna;intmax(inta,intb)if(ab)returna;elsereturnb;voidmain()inta=8,b=-12,c=27;max(a,b);内联函数内联函数声明时使用关键字 inline。编译时编译时在调用处用函数体进行在调用处用函数体进行替换替换,节省了参数传递、控节省了参数传递、控制转移等开销。制转移等开销。注意:内联函数体内内联函数体内不能有循环语句和不能有循环语句和
16、switch语句语句。内联函数的声明必须出现在内联函数第一次被调用之前。内联函数的声明必须出现在内联函数第一次被调用之前。对内联函数不能进行异常接口声明。对内联函数不能进行异常接口声明。例4 函数指定为内置函数。inline int max(int,int,int);/声明函数,注意左端有inlineint main()int i=10,j=20,k=30,m;m=max(i,j,k);coutmax=ma)a=b;/求a,b,c中的最大者 if(ca)a=c;return a;说明:由于在定义函数时指定它为内置函数,因此编译系统在遇由于在定义函数时指定它为内置函数,因此编译系统在遇到函数调用
17、到函数调用“max(i,j,k)”max(i,j,k)”时,就用时,就用maxmax函数体的代码代函数体的代码代替替“max(i,j,k)”max(i,j,k)”,同时将实参代替形参。同时将实参代替形参。程序第程序第6 6行行“m=max(i,j,k);”m=max(i,j,k);”就被置换成就被置换成if(ji)i=j;if(ki)i=k;m=i;注意:注意:可以在声明函数和定义函数时同时写可以在声明函数和定义函数时同时写inline,也可以只在其中一处声明也可以只在其中一处声明inline,效果相同,都效果相同,都能按内置函数处理。能按内置函数处理。使用内置函数可以节省运行时间,但却增加了使用内置函数可以节省运行时间,但却增加了目标程序的长度。因此一般只将规模很小目标程序的长度。因此一般只将规模很小(一般一般为为5个语句以下个语句以下)而使用频繁的函数而使用频繁的函数(如定时采集如定时采集数据的函数数据的函数)声明为内置函数。声明为内置函数。
限制150内