




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022-3-61第第4章章 函数函数 本章学习重点掌握内容:本章学习重点掌握内容:n函数的定义函数的定义n函数的调用函数的调用n函数参数的传递方式函数参数的传递方式n内联函数和函数重载内联函数和函数重载2022-3-624.1 函数的定义函数的定义 C+C+语言函数定义的基本格式为:语言函数定义的基本格式为: 函数类型 函数名(形式参数列表) 函数体2022-3-63 函数名需符合标识符的命名规则。 函数类型规定了函数返回值类型,它可以是C+语言中任何一种合法类型。如果函数没有返回值时,必须用关键字void加以说明,缺省的返回值类型为int型。 形式参数列表(即形参列表)是被调函数接受调用者
2、数据的主要途径,定义时应分别给出各形式参数的类型,并用逗号隔开。形参表可以为空,但函数名后的一对圆括号不能省略。 函数体是由一对花括号括起来的语句序列,用于描述函数所要执行的操作。 函数体可以为空,但此函数定义中的一对花括号不能省略。说明说明下面定义了一个空函数:void empty( ) 2022-3-64【例4.2】下面print() 函数用于输出如下图形。 * * *void print() cout*endl; cout *endl; cout *endl; 2022-3-654.1.2 函数的返回值函数的返回值n函数的返回值是通过函数中的return语句获得的n当函数有返回值时,函数
3、体内要有一个return语句nreturn语句将被调用函数中的一个确定值带回到调用它的函数中。n如果一个函数无返回任何值时,则将该函数的类型指定为void,这时函数体内不必使用return语句。2022-3-66 return语句的格式有3种:n return( expression); n return expression ; n return; 若函数体中无return语句,当执行到函数末尾时自动返回到调用函数。 函数的返回值最多只有一个,可通过return 语句返回主调函数。return语句的格式语句的格式2022-3-674.2 4.2 函数的调用函数的调用n函数调用的形式:函数调用
4、的形式: 函数名(实参列表)函数名(实参列表)n说明说明n实参列表中的参数可以是常量、变量或其它构造数据类型,也可以是表达式。n各实参之间用逗号隔开。n实参和形参的个数应相等,类型一致,实参与形参一一对应结合。n 对于无参函数调用时则没有实参列表项。2022-3-684.2.1 4.2.1 函数的调用形式及过程函数的调用形式及过程n函数的调用过程函数的调用过程: :n为形参及函数体中的变量分配存储空间;n用实参向形参传递数据;n中断现行(调用)函数,将控制转交给被调用函数执行。2022-3-69n先计算出返回语句中的值n若表达式值的类型与函数类型不一致,则强制转换。n将计算出的表达式值返回给调
5、用函数作为返回值。n将控制由被调用函数转向调用函数,执行后面的语句。2022-3-610#include int max(int x,int y) /定义有参函数maxint z; z=xy?x:y; return(z);int main( )int a,b,c; coutab; c=max(a,b); /调用max函数,给定实参为a,b。 coutmax=cendl; return 0;2022-3-6114.2.2 4.2.2 函数的声明函数的声明n而编译器获得函数原型有两种情况:而编译器获得函数原型有两种情况:()当函数定义在调用之前时,则从定义中抽取函数原型。()当函数定义在调用之后时
6、,则程序员须在调用之前用函数原型对函数进行声明,让编译器获得函数原型。2022-3-612函数声明函数声明n函数声明也称函数说明或函数原形,形式如下:函数声明也称函数说明或函数原形,形式如下: 函数类型函数类型 函数名(参数列表);函数名(参数列表);n说明:说明:n各部分的含义与函数定义相同,由于它是说明语句,没有函各部分的含义与函数定义相同,由于它是说明语句,没有函数体,所以需以分号结束,且可以省去参数名,因为函数声数体,所以需以分号结束,且可以省去参数名,因为函数声明只关心参数列表中参数的个数和类型。明只关心参数列表中参数的个数和类型。n对于标准库函数,它是通过相应的头文件来加以说明的,
7、在对于标准库函数,它是通过相应的头文件来加以说明的,在头文件中含有标准库函数的说明。因此使用前需在程序的开头文件中含有标准库函数的说明。因此使用前需在程序的开头用头用#include#include命令把头文件包含进来。命令把头文件包含进来。2022-3-613函数声明示例函数声明示例1#include long fact(int); /函数声明函数声明void main() / main( )在在fact()定义的前面定义的前面 int n; long p; cinn; p=fact(n); /函数调用函数调用 coutpendl;long fact( int m) /函数定义,定义函数函数
8、定义,定义函数fact求求m的阶乘的阶乘 int i; long s=1; for(i=1;i=m;i+) s=s*i; return(s); /函数返回函数返回 2022-3-614#include long fact( int m) / fact函数先定义,后调用 int i; long s=1; for(i=1;in; p=fact(n); /调用fact函数,求出n的阶乘,放在p中 coutpendl;2022-3-615总结总结 若被调函数是标准库函数或用户已编写的函数(与主调函数不在同一文件中),则使用前需在程序的开头用#include命令将被调函数的信息包含进来。 若主调函数与被
9、调函数在同一文件内,且主调函数在前,被调函数定义在后,则必须在主调函数的说明部分或主调函数的前面对被调函数进行声明。 如果被调函数在主调函数之前定义,可以省略对被调函数的说明。 通常,将所有函数的声明集中在程序开头;或将所有函数的声明信息写入一个头文件,编程时用#include 命令将其包含进来即可。2022-3-6164.2.3 4.2.3 函数调用的参数传递方式函数调用的参数传递方式n 值调用值调用(1)实参在进行函数调用时,必须具有确定的值,以便把这些值传送给形参。(2)形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元。因此,形参只有在该函数内有效。调用结束,
10、返回调用函数后,则不能再使用该形参变量。(3)实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。(4)实参和形参占用不同的内存单元,即使同名也互不影响。2022-3-617#include int multiple3(int n)n=n*3; /对形参n 赋值return n;void main() int n=5; coutmultiple3(2)endl;coutmultiple3(n)endl; /实参ncoutnendl; /输出实参n2022-3-618#include void swap(int a,int b); /函数声明函数声明voi
11、d main()int x,y;x=6; y=8;coutx=xy=yendl; /输出调用前输出调用前x,y的值的值swap(x,y); /调用调用swap()函数()函数coutx=xy=yendl; /输出调用后输出调用后x,y的值的值void swap(int a,int b) int temp; temp=a; a=b; b=temp;couta=ab=bendl;2022-3-619函数调用过程存储单元状况函数调用过程存储单元状况 2022-3-620 引用调用时,实参与形参使用相同的内存单元,形参的变化影响实参。在后面8.9.2节中使用引用的方式,可以在被调函数中直接交换实参的值
12、。2022-3-6214.3 4.3 函数的嵌套调用和递归调用函数的嵌套调用和递归调用n概念概念n所谓嵌套调用就是在调用一个函数并执行该函数的过程中,又调用另一个函数的情况。2022-3-622main()f1()f2()#include func2(int x) int t; t=x+9; return(t);func1( int a,int b) int z; z=func2(a*b); /函数fun1又调用了fun2 return(z);void main() int x1=2,x2=5,y; y=func1(x1,x2); /main()函数调用fun1 couty1)fac(n-1)
13、 (n1) 2022-3-626程序如下:#include long fac(int n) if (n=1) return(1); /递归结束值 else return(n*fac(n-1); /直接递归调用void main() int n; coutn; coutn!=fac(n)endl; 2022-3-627n递归调用的执行过程分为递推过程和回归过程两部分。这两个过程由递归终止条件控制,即逐层递推,直至递归终止条件,然后逐层回归。2 2递归调用的执行过程递归调用的执行过程2022-3-628n无论是直接递归还是间接递归都必须保证在有限次调用之后能够结束,即递归有结束条件并且递归能向结束
14、条件发展。注意注意2022-3-629【例【例4.104.10】反序输出一个正整数的各位数值,如输入】反序输出一个正整数的各位数值,如输入321321,应输出,应输出132132。# include void conv(int n)if (n10) coutn; return;cout n%10;conv(n/10);void main( )int t;coutt; conv(t);2022-3-630【例4.11】用递归调用的方法编程实现求最大公约数。#includeint gcd1(int x,int y) if(y=0)return x;else return gcd1(y,x%y);v
15、oid main() int a,b; coutab; int g=gcd1(a,b); cout最大公约数为:gendl;2022-3-631分析: A柱只有一个盘子的情况: A柱C柱; A柱有两个盘子的情况:小盘A柱B柱,大盘A柱C柱,小盘B柱C柱。 A柱有n个盘子的情况:将此问题看成上面n-1个盘子和最下面第n个盘子的情况。n-1个盘子A柱B柱,第n个盘子A柱C柱,n-1个盘子B柱C柱。问题转化成搬动n-1个盘子的问题,同样,将n-1个盘子看成上面n-2个盘子和下面第n-1个盘子的情况,进一步转化为搬动n-2个盘子的问题,类推下去,一直到最后成为搬动一个盘子的问题。这是一个典型的递归问题
16、,递归结束于只搬动一个盘子。算法可以描述为: n-1个盘子A柱B柱,借助于C柱; 第n个盘子A柱C柱; n-1个盘子B柱C柱,借助于A柱;汉诺塔问题汉诺塔问题2022-3-632 其中步骤和步骤继续递归下去,直至搬动一个盘子为止。 由此,可以定义两个函数,一个是递归函数,命名为hanoi(int n, char source, char temp, char target),实现将n个盘子从源柱source借助中间柱temp搬到目标柱target;另一个命名为move(char source, char target),用来输出搬动一个盘子的提示信息。 2022-3-633#include v
17、oid move(char source,char target) coutsourcetargetendl; void hanoi(int n,char source,char temp,char target) if(n=1) move(source,target); else hanoi(n-1,source,target,temp); /将n-1个盘子搬到中间柱 move(source,target); /将最后一个盘子搬到目标柱 hanoi(n-1,temp,source,target); /将n-1个盘子搬到目标柱 void main() int n; cout输入盘子数:n; h
18、anoi(n,A,B,C);2022-3-6344.4 4.4 内联函数和函数重载内联函数和函数重载1 1内联函数的引入内联函数的引入 内联函数也称为内嵌函数,在使用内联函数时,C+编译器直接将被调函数的函数体中的代码插入到调用该函数的语句处,在程序运行时不再进行函数调用,从而消除函数调用时的系统开销,提高程序执行效率 2022-3-6352 2内联函数的定义内联函数的定义n内联函数定义的格式:内联函数定义的格式:inline inline 类型标识符类型标识符 函数名(参数列表)函数名(参数列表)n例例: :将求两个将求两个intint型数之和的函数定义为内联函数型数之和的函数定义为内联函数
19、inline int add(int a,intb) return a+b;2022-3-6364 4使用内联函数应注意的事项使用内联函数应注意的事项n内联函数不同于一般函数,主要体现在用替换代替了调用,从而提高了运行效率。在使用内联函数时应注意以下几点:n内联函数的函数体内不允许有循环语句和开关switch语句。如果内联函数内含有这些语句,则按普通函数处理。n内联函数的函数体内不能包含任何静态变量和数组说明,也不能有递归调用。1.内联函数的函数体中语句不宜过多,一般以1至5行为宜。因为,内联函数是一种用空间换时间的措施,若内联函数较长,且调用太频繁,程序的目标代码将加长很多。2022-3-6
20、374.4.2 4.4.2 函数重载函数重载1 1函数重载的引入函数重载的引入n在C+中,两个或两个以上的函数可以重名,但要求函数的参数说明不同,如参数的类型不同,参数的个数不同等。这种共享同名函数称为函数重载。n重载函数的意义就在于,可以用同一个函数名字访问多个相关函数,编译器能够根据参数的具体情况决定调用哪个函数。函数重载有助于解决复杂问题。2022-3-638n对于函数重载问题,要区分函数名相同的函数,只有从它的参数上进行区分。具体地说,要实现函数重载,它们的参数必须满足以下两个条件之一: 参数的个数不同。参数的个数不同。 参数的类型不同参数的类型不同2022-3-639#include
21、int max(int a,int b) /求两个整数的最大值 if(ab) return a; else return b;float max(float a,float b) /求两个浮点数的最大值 if(ab) return a; else return b;double max(double a,double b) /求两个双精度数的最大值 if(ab) return a; else return b;void main() int a=7,b=9; float c=5.6f,d=7.4f; double e=78.54,f=6.759; couta与b的最大值:max(a,b)end
22、l; coutc与d的最大值:max(c,d)endl; coute与f的最大值:max(e,f)endl;2022-3-640#includemax(int a,int b);max(int a,int b,int c);max(int a,int b,int c,int d);void main( ) coutmax(3,5)endl; coutmax(-7,9,0)endl; coutmax(8,6,1,2)b?a:b); max(int a,int b,int c) int t=max(a,b); return max(t,c);max(int a,int b,int c,int d)
23、 int t1,t2; t1=max(a,b); t2=max(c,d); return max(t1,t2);2022-3-6412 2重载函数的匹配顺序重载函数的匹配顺序n重载函数选择的规则顺序重载函数选择的规则顺序(1)寻找一个严格的匹配,即:调用与实参的数据类型、个数完全相同的那个函数。(2)通过内部转换寻求一个匹配,即:通过(1)的方法没有找到相匹配的函数时,则由C+系统对实参的数据类型进行内部自动转换,转换完毕后,如果有匹配的函数存在,则执行该函数。(3)对实参进行强制类型转换,以此作为查找相匹配的函数。 2022-3-642#include void print(double d
24、) coutthis is a double dn; void print(int i) coutthis is an integer in; void main( ) int x=1,z=10; float y=1.0; char c=a; print(x); print(y); print(c); print(double(z); 2022-3-6433. 3. 定义重载函数时的注意事项定义重载函数时的注意事项(1 1)重载函数的区别不能只是函数的返回值不同,应至少在形参的)重载函数的区别不能只是函数的返回值不同,应至少在形参的个数、参数类型或参数顺序上有所不同。个数、参数类型或参数顺序上
25、有所不同。(2 2)应使所有的重载函数的功能相同。如果让重载函数完成不同的)应使所有的重载函数的功能相同。如果让重载函数完成不同的功能,会破坏程序的可读性。功能,会破坏程序的可读性。void myfun(int i)void myfun(int i) int myfun(int i)int myfun(int i) 2022-3-6444.5 4.5 函数的参数函数的参数1 1 函数参数的求值顺序函数参数的求值顺序 函数的求值顺序会因编译系统的不同而不同,有的编译系统采用自左至右的顺序计算参数的值,而有的编译系统采用自右至左的顺序计算参数的值。2022-3-645 在C+语言中可以设置函数形参的默认值,在调用函数时,若明确给出了实参的值,则使用相应实参的值;若没有给出相应实参的值,则使用默认的值。这将为函数调用带来方便和灵活。4.5.2 4.5.2 具有默认参数值的函数具有默认参数值的函数2022-3-646【例【例4.184.18】编写具有默认参数值的求三个整数最大值函数。】编写具有默认参数值的求三个整数最大值函数。 #include int max(int x=70,int y=60,int z=50) int m; if(xy) m=x; else m=y; if(zm) m=z; return m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程技术服务劳动协议年
- 项目管理中的能力提升试题及答案
- 工程项目管理人才发展试题及答案
- 网络游戏开发测试与上线合同
- 工程项目风险控制的方法试题及答案
- 小学生生命安全教育
- 工程项目管理的实践性试题及答案
- 行政管理公共关系学社会职责试题及答案
- 市政工程实践案例分享试题及答案
- 2024年减震系统材料项目资金申请报告代可行性研究报告
- 银行评估明细表
- 水稻脱粒机毕业设计毕业设计
- 《光学原理与应用》之双折射原理及应用
- 完整版电力工程设计资质分级标准
- 硬笔书法练习用纸A4打印模板
- U8ERP实施方案
- 配电间及机柜室方案
- 中国民用航空通信导航监视系统运行、维护规程
- 5000吨干货船设计总体方案及第三部分
- fx-991cnx计算器说明书
- 魔法奇缘英文脚本台词
评论
0/150
提交评论