第3章-函数和编译预处理ppt课件

上传人:29 文档编号:184691777 上传时间:2023-02-02 格式:PPT 页数:111 大小:440.50KB
收藏 版权申诉 举报 下载
第3章-函数和编译预处理ppt课件_第1页
第1页 / 共111页
第3章-函数和编译预处理ppt课件_第2页
第2页 / 共111页
第3章-函数和编译预处理ppt课件_第3页
第3页 / 共111页
资源描述:

《第3章-函数和编译预处理ppt课件》由会员分享,可在线阅读,更多相关《第3章-函数和编译预处理ppt课件(111页珍藏版)》请在装配图网上搜索。

1、单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。第第3章章 函数和编译预处理函数和编译预处理 3.1 函数概述函数概述 3.2函数的定义和调用函数的定义和调用 3.3 函数的参数传递函数的参数传递 3.4 函数的嵌套调用和递归调用函数的嵌套调用和递归调用 3.5 内置函数内置函数 3.6 变量和函数的属性变量和函数的属性 3.7 编译预处理编译预处理 单击此处编辑母版标题样式单击此处编辑母版标题样式 单击

2、此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。3.1 概述概述一个较大的程序不可能完全由一个人从头至尾地完成,更不可能把所有的内容都放在一个主函数中。为了便于规划、组织、编程和调试,一般的做法是把一个大的程序划分为若干个程序模块(即程序文件),每一个模块实现一部分功能。不同的程序模块可以由不同的人来完成。在程序进行编译时,以程序模块为编译单位,即分别对每一个编译单位进行编译。如果发现错误,可以在本程序模块范围内查错并改正。在分别通过编译后,才进行连接,把各

3、模块的目标文件以及系统文件连接在一起形成可执行文件。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。在一个程序文件中可以包含若干个函数。无论把一个程序划在一个程序文件中可以包含若干个函数。无论把一个程序划分为多少个程序模块,只能有一个分为多少个程序模块,只能有一个main函数。程序总是从函数。程序总是从main函数开始执行的。在程序运行过程中,由主函数调用函数开始执行的。在程序运行过程中,由主函数调用其他

4、函数,其他函数也可以互相调用。在其他函数,其他函数也可以互相调用。在C语言中没有类和语言中没有类和对象,在程序模块中直接定义函数。可以认为,一个对象,在程序模块中直接定义函数。可以认为,一个C程序程序是由若干个函数组成的,是由若干个函数组成的,C语言被认为是面向函数的语言。语言被认为是面向函数的语言。C+面向过程的程序设计沿用了面向过程的程序设计沿用了C语言使用函数的方法。在语言使用函数的方法。在C+面向对象的程序设计中,主函数以外的函数大多是被面向对象的程序设计中,主函数以外的函数大多是被封装在类中的。主函数或其他函数可以通过类对象调用类封装在类中的。主函数或其他函数可以通过类对象调用类中的

5、函数。无论是中的函数。无论是C还是还是C+,程序中的各项操作基本上都程序中的各项操作基本上都是由函数来实现的,程序编写者要根据需要编写一个个函是由函数来实现的,程序编写者要根据需要编写一个个函数,每个函数用来实现某一功能。因此,读者必须掌握函数,每个函数用来实现某一功能。因此,读者必须掌握函数的概念以及学会设计和使用函数。数的概念以及学会设计和使用函数。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。“函

6、数函数”这个名词是从英文这个名词是从英文function翻译过来的,其翻译过来的,其实实function的原意是的原意是“功能功能”。顾名思义,一个函。顾名思义,一个函数就是一个功能。数就是一个功能。在实际应用的程序中,主函数写得很简单,它的作在实际应用的程序中,主函数写得很简单,它的作用就是调用各个函数,程序各部分的功能全部都是用就是调用各个函数,程序各部分的功能全部都是由各函数实现的。主函数相当于总调度,调动各函由各函数实现的。主函数相当于总调度,调动各函数依次实现各项功能。数依次实现各项功能。开发商和软件开发人员将一些常用的功能模块编写开发商和软件开发人员将一些常用的功能模块编写成函数,

7、放在函数库中供公共选用。程序开发人员成函数,放在函数库中供公共选用。程序开发人员要善于利用库函数,以减少重复编写程序段的工作要善于利用库函数,以减少重复编写程序段的工作量。量。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。图图3.是一个程序中函数调用的示意图。是一个程序中函数调用的示意图。图图3.main()func1()func2()func3()func5()func4()单击此处编辑母版标题样式单

8、击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。例例31 在主函数中调用其他函数。在主函数中调用其他函数。#include /*ex3_1.cpp*int calc_sum(int n)/定义定义calc_sum()函数函数 int k,s;s=0;for(k=1;k=n;k+)s=s+k;return s;void print_word(void)/定义定义print_word()函数函数 coutHello,C+!n;if(n

9、1)coutthe sum is:calc_sum(n)endl;/调用调用calc_sum()函数函数 print_word();/调用调用rint_word()函数函数 单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。若用户从键盘输入的数是若用户从键盘输入的数是4,运行情况如下:运行情况如下:the sum is:10Hello,C+!从用户使用的角度看,函数有两种:从用户使用的角度看,函数有两种:(

10、1)系统函数,即库函数。这是由编译系统提供的,用户不必自己系统函数,即库函数。这是由编译系统提供的,用户不必自己定义这些函数,可以直接使用它们。定义这些函数,可以直接使用它们。(2)用户自己定义的函数。用以解决用户的专门需要。用户自己定义的函数。用以解决用户的专门需要。从函数的形式看,函数分两类:从函数的形式看,函数分两类:(1)无参函数。调用函数时不必给出参数。无参函数。调用函数时不必给出参数。(2)有参函数。在调用函数时,要给出参数。在主调函数和被调用有参函数。在调用函数时,要给出参数。在主调函数和被调用函数之间有数据传递。函数之间有数据传递。单击此处编辑母版标题样式单击此处编辑母版标题样

11、式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。3.2 函数的定义和调用函数的定义和调用 3.2.1 定义无参函数的一般形式定义无参函数的一般形式定义函数的一般形式如下:定义函数的一般形式如下:类型标识符类型标识符 函数名函数名(形式参数列表形式参数列表)声明语句声明语句执行语句执行语句单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构

12、、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。【例例3.1】的的print_word函数是无参函数,它的定义中首句也函数是无参函数,它的定义中首句也可以写成:可以写成:void print_word()/定义定义print_word()函数的首部函数的首部;或:或:void print_word(void)/定义定义print_word()函数的首部函数的首部【例例3.1】的的calc_sum函数是有参函数,不过它只有一个参数,函数是有参函数,不过它只有一个参数,参数的类型是整数类型。参数的类型是整数类型。int calc_sum(int n)/定义定义calc_s

13、um()函数函数 C+要求在定义函数时必须指定函数的类型。要求在定义函数时必须指定函数的类型。下面的函数下面的函数f则有两个参数,第一个是整数类型,第二个是单则有两个参数,第一个是整数类型,第二个是单精度实数类型,而函数的返回值是双精度实数类型:精度实数类型,而函数的返回值是双精度实数类型:double f(int x,float y)/定义定义f()函数的首部函数的首部 单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用

14、,在此不再说明。(1)对库函数的声明)对库函数的声明其实,对库函数的声明语句已经写在有关包含文件中了,因其实,对库函数的声明语句已经写在有关包含文件中了,因此只要在程序文件头用此只要在程序文件头用include语句将这些包含文件包含到语句将这些包含文件包含到本程序中来,就完成了对库函数的声明。本程序中来,就完成了对库函数的声明。(2)对自定义函数的声明)对自定义函数的声明必须在调用某自定义函数的语句之前写上如下声明语句:必须在调用某自定义函数的语句之前写上如下声明语句:函数类型关键字函数类型关键字 函数名函数名(参数参数1类型,参数类型,参数1名称名称,参数参数2类型,类型,参数参数2名称名称

15、);3.2.2 函数的声明函数的声明单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。(2)对自定义函数的声明)对自定义函数的声明(续)(续)也可以在声明语句中略去参数的名称,或写一个任意名称,也可以在声明语句中略去参数的名称,或写一个任意名称,这叫做函数原型(这叫做函数原型(function prototype),即声明函数原型。,即声明函数原型。函数原型有下列两种表示形式:函数原型有下列两种表示形式:函

16、数类型关键字函数类型关键字 函数名函数名(参数参数1类型类型,参数参数2类型类型);函数类型关键字函数类型关键字 函数名函数名(参数参数1类型,标识符类型,标识符1,参数参数2类型,类型,标识符标识符2);C+中的函数原型说明了函数的类型、函数名、函数各形式中的函数原型说明了函数的类型、函数名、函数各形式参数类型。使用函数原型是参数类型。使用函数原型是C和和C+的一个重要特点。的一个重要特点。3.2.2 函数的声明函数的声明单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部

17、敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。【例例3.2】对被调函数做声明的示例。对被调函数做声明的示例。#include /*ex3_2.cpp*void main()float add(float x,float y);/对对add函数作声明函数作声明 float subtract(float,float);/对对subtract函数作声明,用函数原型函数作声明,用函数原型 double multiply(float p,float q);/对对multiply函数作声明,参数名任意函数作声明,参数名任意 float a,b,c1,c2;double c3;cout

18、 ab;c1=add(a,b);c2=subtract(a,b);c3=multiply(a,b);cout c1,c2,c3endl;单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。float add(float x,float y)/定义定义add函数函数 float z;z=x+y;return(z);float subtract(float x,float y)/定义定义subtract函数函数

19、float z;z=x-y;return(z);double multiply(float x,float y)/定义定义multiply函数函数 double z;z=x*y;return(z);运行情况如下:运行情况如下:please input a,b:4.25 2.00 6.25,2.25,8.5 单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。说明:说明:(1)对函数的定义和函数声明是两回事,不

20、要混淆。)对函数的定义和函数声明是两回事,不要混淆。(2)之所以函数原型中可以省略形式参数的名称,)之所以函数原型中可以省略形式参数的名称,是因为形式参数的名称是无关紧要的,且在调用前是因为形式参数的名称是无关紧要的,且在调用前形参并不存在。形参并不存在。(3)函数声明语句的位置。函数声明语句可以放在)函数声明语句的位置。函数声明语句可以放在主调函数中,也可放在函数外面,只要出现在调用主调函数中,也可放在函数外面,只要出现在调用语句之前即声明有效。语句之前即声明有效。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使

21、用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。3.2.3 函数的返回值函数的返回值(1)函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个确定值带回主调函数中去。return语句后面的括号可以要,也可以不要。return后面的值可以是一个表达式。(2)函数值的类型。既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型。(3)如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准,即函数类型决定返回值的类型。对数值型数据,可以自动进行类型转换。单击

22、此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。第第(1)种形式是基本的形式。为了便于阅读程序,也种形式是基本的形式。为了便于阅读程序,也允许在函数原型中加上参数名,就成了第允许在函数原型中加上参数名,就成了第(2)种形种形式。但编译系统并不检查参数名。因此参数名是什式。但编译系统并不检查参数名。因此参数名是什么都无所谓。上面程序中的声明也可以写成么都无所谓。上面程序中的声明也可以写成float add(fl

23、oat a,float b);/参数名不用参数名不用x、y,而用而用a、b 效果完全相同。效果完全相同。应当保证函数原型与函数首部写法上的一致,即函应当保证函数原型与函数首部写法上的一致,即函数类型、函数名、参数个数、参数类型和参数顺序数类型、函数名、参数个数、参数类型和参数顺序必须相同。在函数调用时函数名、实参类型和实参必须相同。在函数调用时函数名、实参类型和实参个数应与函数原型一致。个数应与函数原型一致。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在

24、近些年的城市地下工程施工中已很少使用,在此不再说明。说明:说明:(1)前面已说明,如果被调用函数的定义出现在主调函数之前,可以不必加以声明。因为编译系统已经事先知道了已定义的函数类型,会根据函数首部提供的信息对函数的调用作正确性检查。有经验的程序编制人员一般都把main函数写在最前面,这样对整个程序的结构和作用一目了然,统览全局,然后再具体了解各函数的细节。此外,用函数原型来声明函数,还能减少编写程序时可能出现的错误。由于函数声明的位置与函数调用语句的位置比较近,因此在写程序时便于就近参照函数原型来书写函数调用,不易出错。所以应养成对所有用到的函数作声明的习惯。这是保证程序正确性和可读性的重要

25、环节。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。(2)函数声明的位置可以在调用函数所在的函数中,也可以在函数之外。函数声明的位置可以在调用函数所在的函数中,也可以在函数之外。如果函数声明放在函数的外部,在所有函数定义之前,则在各个主调如果函数声明放在函数的外部,在所有函数定义之前,则在各个主调函数中不必对所调用的函数再作声明。例如:函数中不必对所调用的函数再作声明。例如:char letter(ch

26、ar,char);/本行和以下两行函数声明在所有函数之前且在函本行和以下两行函数声明在所有函数之前且在函数外部数外部float f(float,float);/因而作用域是整个文件因而作用域是整个文件 int i(float,float);int main()/在在main函数中不必对它所调用的函数作声明函数中不必对它所调用的函数作声明char letter(char c1,char c2)/定义定义letter函数函数float f(float x,float y)/定义定义f函数函数 int i(float j,float k)/定义定义i函数函数如果一个函数被多个函数所调用,用这种方法比

27、较好,不必在每个主调函如果一个函数被多个函数所调用,用这种方法比较好,不必在每个主调函数中重复声明。数中重复声明。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。函数调用的一般形式:函数调用的一般形式:函数名函数名(实际参数列表实际参数列表)如果是调用无参函数,则如果是调用无参函数,则“实参表列实参表列”可以没有,可以没有,但括号不能省略。如果实参表列包含多个实参,则但括号不能省略。如果实参表列包含多个实

28、参,则各参数间用逗号隔开。实参与形参的个数应相等,各参数间用逗号隔开。实参与形参的个数应相等,类型应匹配类型应匹配(相同或赋值兼容相同或赋值兼容)。实参与形参按顺序。实参与形参按顺序对应,一对一地传递数据。但应说明,如果实参表对应,一对一地传递数据。但应说明,如果实参表列包括多个实参,对实参求值的顺序并不是确定的。列包括多个实参,对实参求值的顺序并不是确定的。3.2.4函数的调用函数的调用单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程

29、施工中已很少使用,在此不再说明。按函数在语句中的作用来分,可以有以下按函数在语句中的作用来分,可以有以下3种函数调用方式:种函数调用方式:.函数语句函数语句把函数调用单独作为一个语句,并不要求函数带回一个值,把函数调用单独作为一个语句,并不要求函数带回一个值,只是要求函数完成一定的操作。只是要求函数完成一定的操作。如【例如【例3.1】中的中的print_word()函数调用语句。函数调用语句。2.函数表达式函数表达式函数出现在一个表达式中,这时要求函数带回一个确定的值函数出现在一个表达式中,这时要求函数带回一个确定的值以参加表达式的运算。如以参加表达式的运算。如c=2*max(a,b);3.函

30、数参数函数参数函数调用作为一个函数的实参。如函数调用作为一个函数的实参。如m=max(a,max(b,c);/max(b,c)是函数调用,其值作为外层是函数调用,其值作为外层max函数调用的一个实参函数调用的一个实参函数调用的方式函数调用的方式单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。3.3 函数的参数传递函数的参数传递 形参形参:在定义函数时函数名后面括号中的变量名:在定义函数时函数名后面括号中的

31、变量名称为形式参数(称为形式参数(formal parameter),简称形参。形,简称形参。形参是无内存单元(因而不存在)的任何合法标识符。参是无内存单元(因而不存在)的任何合法标识符。实参实参:在调用一个函数时,调用语句的函数名后:在调用一个函数时,调用语句的函数名后面括号中的参数称为实际参数(面括号中的参数称为实际参数(actual parameter),简称实参。实参是实际存在(因而),简称实参。实参是实际存在(因而有特定值)的常量、变量或表达式。有特定值)的常量、变量或表达式。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用

32、情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。【例例3.3】形参和实参及其数据传递。形参和实参及其数据传递。#include /*ex3_3.cpp*using namespace std;float volume(float r,float h)/定义有参函数定义有参函数volume求圆柱体体积,求圆柱体体积,r和和h是是形参形参 float v;v=3.14*r*r*h;return(v);void main()float a,b,c;cout a b;c=volume(a,b);/调用函数调用函数vol

33、ume,a和和b是实参。函数值赋给变量是实参。函数值赋给变量ccout The volume is cendl;单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。运行情况如下:运行情况如下:please input two float nukbers:2.0 5.0 The volume is 62.8单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使

34、用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。有关形参与实参的说明:有关形参与实参的说明:(1)在定义函数时指定的形参,在未出现函数调用时,它们并在定义函数时指定的形参,在未出现函数调用时,它们并不占内存中的存储单元,因此称它们是形式参数或虚拟参不占内存中的存储单元,因此称它们是形式参数或虚拟参数,表示它们并不是实际存在的数据,只有在发生函数调数,表示它们并不是实际存在的数据,只有在发生函数调用时,函数用时,函数max中的形参才被分配内存单元,以便接收从实中的形参才被分配内存单元,以便接收从实参传来的数据。

35、在调用结束后,形参所占的内存单元也被参传来的数据。在调用结束后,形参所占的内存单元也被释放。释放。(2)实参可以是常量、变量或表达式,如实参可以是常量、变量或表达式,如max(3,a+b);但要求但要求a和和b有确定的值。以便在调用函数时将实参的值赋给形参。有确定的值。以便在调用函数时将实参的值赋给形参。(3)在定义函数时,必须在函数首部指定形参的类型,至于形在定义函数时,必须在函数首部指定形参的类型,至于形参使用何名字可随意。参使用何名字可随意。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾

36、构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。(4)实参与形参的类型应相同或赋值兼容。两种参数实参与形参的类型应相同或赋值兼容。两种参数类型完全一致无疑是完全合法、正确的。如果实参类型完全一致无疑是完全合法、正确的。如果实参为整型而形参为实型,或者相反,则按不同类型数为整型而形参为实型,或者相反,则按不同类型数值的赋值规则进行转换,原则上不出现语法错误,值的赋值规则进行转换,原则上不出现语法错误,但结果可能带来某些非期望的误差。例如实参但结果可能带来某些非期望的误差。例如实参a的的值是值是3.5,而被调函数的形参,而被调函数的形参x为整型,则调用该

37、函为整型,则调用该函数时会将数时会将3.5转化为整数转化为整数3,然后送到形参,然后送到形参x,故,故x得得到的是到的是3,由,由3计算出的函数值与人们期望由计算出的函数值与人们期望由3.5计计算出的函数值一般是有差别的。但字符型与整型可算出的函数值一般是有差别的。但字符型与整型可以互相通用。以互相通用。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。3.3.2 参数的值传递参数的值传递 值传递参数的实现

38、是系统将实参拷贝一个副本给形值传递参数的实现是系统将实参拷贝一个副本给形参,拷贝后两者就断开关系。在被调函数中,形参参,拷贝后两者就断开关系。在被调函数中,形参可以被改变,但这只影响副本中的形参值,而不影可以被改变,但这只影响副本中的形参值,而不影响调用函数的实参值。所以这类函数有对原始数据响调用函数的实参值。所以这类函数有对原始数据保护的作用。换一句话说,这种参数传递机制是单保护的作用。换一句话说,这种参数传递机制是单向影响,即只能由实参将值传给形参(实参影响形向影响,即只能由实参将值传给形参(实参影响形参);而形参在函数中的值如果发生修改,不会反参);而形参在函数中的值如果发生修改,不会反

39、过来影响与之对应的实参。过来影响与之对应的实参。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。【例3.4】参数值传递的演示。#include /*ex3_4.cpp*using namespace std;int max(int x,int y)/定义有参函数max求两数最大值,x和y是形参 float m;coutThe initial x,y:x,yy?x:y;x=2*x;y=y+1;coutThe

40、 new x,y:x,yendl;return(m);单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。void main()float a,b,c;cout a b;c=max(a,b);/调用函数调用函数max,a和和b是实参,函数值赋给变量是实参,函数值赋给变量c。cout The maxinum is:cendl;cout After calling fuction,a,b:a,bendl;运行情况

41、如下:运行情况如下:please input two integer numbers:3 8 The initial x,y:3,8The new x,y:6 9The maxinum is:8After calling fuction,a,b:3,8单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。3.3.3 参数的地址传递参数的地址传递除了除了3.3.2小节介绍的值传递参数方式外,函数调用还有一种小节介

42、绍的值传递参数方式外,函数调用还有一种特殊的值传递形式,即传递的值不是一般的数值,而是一特殊的值传递形式,即传递的值不是一般的数值,而是一些些内存单元地址编号内存单元地址编号(即地址),这时,一般称之为(即地址),这时,一般称之为参数参数的地址传递的地址传递。在这种参数传递形式中,无论在函数的定义。在这种参数传递形式中,无论在函数的定义中出现的形参还是在调用语句中出现的实参,都是代表一中出现的形参还是在调用语句中出现的实参,都是代表一些内存单元地址编号(即些内存单元地址编号(即地址数值地址数值),而),而不是一般的数值不是一般的数值。C+中的参数地址传递情况一般有如下几种:实参可以是一中的参数

43、地址传递情况一般有如下几种:实参可以是一个有确定值的个有确定值的普通变量的地址普通变量的地址,或者是一个,或者是一个已经初始化的已经初始化的指针变量指针变量;或者是;或者是一个初始化的数组名一个初始化的数组名;或者是;或者是一个具体一个具体的函数名的函数名。而形参可以是一个任意。而形参可以是一个任意普通变量的地址普通变量的地址,或是,或是一个任意指针变量一个任意指针变量,或是,或是一个任意的数组名一个任意的数组名,或是,或是一个指一个指向函数的指针变量(对应于实参是具体函数名)向函数的指针变量(对应于实参是具体函数名)。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样

44、式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。实际上,这种参数传递机制就是在函数调用时把一个内存单元地址传递给形参,使形参也具有实参的内存单元地址(即两者对应同一个内存单元),称作形参和实参地址结合,两者合二为一。这样一来,任何时候形参的值等于实参的值;而实参的值也等于形参的值。因此,形参在函数中发生变化后,也会引起实参跟着变化(因为它们是捆绑在一起的,一体化的)。这就意味着按地址传递的方式,在调用刚开始时实参的值影响了形参;而在被调函数执行过程中形参值若发生了变化,它也会影

45、响实参的值变化。即机制是双向影响,这与普通值传递方式的单向影响机制形成对比。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。3.3.4 带默认值的参数带默认值的参数C+语言中,允许在函数声明或定义时给一个或多个参数指定默认值。通语言中,允许在函数声明或定义时给一个或多个参数指定默认值。通常调用函数时,要为函数的每个形式参数给定相应的值。例如下面的常调用函数时,要为函数的每个形式参数给定相应的值。例如下面的

46、delay()函数作用是作时间延迟,在没有使用默认值参数的情况下,是函数作用是作时间延迟,在没有使用默认值参数的情况下,是按如下普通方式声明和定义的:按如下普通方式声明和定义的:【例例3.5】延迟函数的使用。延迟函数的使用。#include /*ex3_5.cpp*void delay(int loop);/函数声明函数声明void main()coutbeginendl;delay(1000);/函数调用函数调用 coutendendl;void delay(int loop)/函数定义函数定义 if(loop=0)return;for(int i=0;iloop;i+)coutiendl;

47、/输出输出i的值为了清楚看到程序执行的情况的值为了清楚看到程序执行的情况 单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。如果每次调用延迟时间基本一样,可以使用C+中默认值参数函数形式来解决问题。解决的方法就是在函数的声明(或定义)时给定默认值即可。具体做法只要把delay()函数的声明改为下列形式:void delay(int loop=1000);/指定参数默认值为1000以后如果需要延迟相同时间10

48、00,都可以不必指定实参的值而直接调用函数:delay();/不给定实参,形参将得到默认值1000 delay(500);/给定实参,形参将得到所给的值500 单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。如果有多个形参,可以使每个形参有一个默认值;也可以只对一部分形参指定默认值。如前面的求圆柱体体积的函数volume,可以这样声明:float volume(float r,float h=8.5);/

49、只对形参h指定默认值8.5这时函数调用可采用以下形式:volume(6.0);/相当于volume(6.0,8.5)volume(6.0,7.2);/r的值为6.0,h的值为7.2 C+中实参和形参的结合是从左至右进行的,第1个实参必然与第1个形参结合,第2个实参必然与第2个形参结合,。因此,指定默认值的参数必须放在参数列表中的最右边。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。3.4 函数的嵌套调用

50、和递归调用函数的嵌套调用和递归调用 C+不允许对函数作嵌套定义,也就是说在一个函数中不能完整地包含另一个函数。在一个程序中每一个函数的定义都是互相平行和独立的。虽然C+不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。见图3.2示意。图3.2 单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。在程序中实现函数嵌套调用时,需要注意的是:在调用函数之前,需要对每一个被调用

51、的函数作声明(除非定义在前,调用在后)。【例3.6】编程求组合,其中求组合的功能要求用函数完成。分析:根据组合的计算公式,知组合函数有两个形参:m和n,可以用自定义函数comb(int n,int m)表示求组合。而在comb函数中需要3次计算阶乘,如果定义函数fac(k)求k的阶乘,然后在comb函数中调用fac函数,可以使程序代码简单,只要在comb函数中写一个语句“c=fac(m)/(fac(n)*fac(m-n);”即可求出组合值。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有

52、挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。【例例3.6】程序代码如下:程序代码如下:#include /*ex3_6.cpp*using namespace std;long fac(int k)/定义求阶乘的函数定义求阶乘的函数long f=1;int i;for(i=1;i=k;i+)f=f*i;return f;long comb(int n,int m)/定义组合函数定义组合函数long c;c=fac(m)/(fac(n)*fac(m-n);/嵌套调用阶乘函数嵌套调用阶乘函数 return c;单击此处编辑母版标题样式单击此处编辑母版标题样式

53、 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。void main()int n,m;long c;coutplease input two integer numbers:m,nmn;c=comb(n,m);/调用组合函数combcoutc=c0,可用,可用n*fac(n-1)表示,即表示,即fac(n)的函数体内将递归调用的函数体内将递归调用fac()本身;本身;但一旦参数但一旦参数n为为0时,则终止调用函数自身并给出函数值时,则终止调用函数自身并

54、给出函数值1。程序如下:程序如下:101!0nnn(n)n!=单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。using namespace std;#include /*ex3_7.cpp*long fac(int n)long f;if(n=0)f=1;else f=n*fac(n-1);/递归调用,求递归调用,求(n-1)!return f;单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处

55、编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。void main()long y;int n;coutplease input a integer n n;y=fac(n);/调用调用fac(n)求求n!coutn=n,y=yendl;运行时,如果输入:运行时,如果输入:3,运行结果如下:运行结果如下:n=3,y=6递归调用及返回过程如图递归调用及返回过程如图3.5所示,图中的数字序号表示递归所示,图中的数字序号表示递归调用和返回的先后顺序。调用和返回的先后顺

56、序。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。图图3.5 求求3!的递归过程!的递归过程 fac(3)fac()n=33*fac(2)return 6main()fac()n=22*fac(1)return 2n=0fac(0)=1return 1n1*fac(0)return 1fac()fac()单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样

57、式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。从求从求n!的递归程序中可以看出,递归定义有两个要!的递归程序中可以看出,递归定义有两个要素:素:(1)递归终止条件递归终止条件。也就是所描述问题的最简单情况,。也就是所描述问题的最简单情况,它本身不再使用递归的定义,即程序必须终止。如它本身不再使用递归的定义,即程序必须终止。如上例,当上例,当n=0时,时,fac(n)=1,不再使用,不再使用f(n-1)来定义。来定义。(2)递归定义使问题向终止条件转化的规则。递归定义使问题向终止条件转化的规则。递归定递

58、归定义必须能使问题越来越简单,即参数越来越接近终义必须能使问题越来越简单,即参数越来越接近终止条件的参数;达到终止条件参数时函数有确定的止条件的参数;达到终止条件参数时函数有确定的值。如上例,值。如上例,f(n)由由f(n-1)定义,越来越靠近定义,越来越靠近f(0),即参数越来越接近终止条件参数即参数越来越接近终止条件参数0;达到终止条件;达到终止条件参数时函数有确定的值是参数时函数有确定的值是f(0)=1。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但

59、在近些年的城市地下工程施工中已很少使用,在此不再说明。【例例3.8】汉诺塔问题汉诺塔问题 汉诺塔(汉诺塔(Tower of Hanoi)问题据说来源于布拉玛神庙。该问)问题据说来源于布拉玛神庙。该问题的装置如图题的装置如图3.6所示所示(图上仅画三个金片以简化问题的原理,图上仅画三个金片以简化问题的原理,原问题有原问题有64个金片个金片),底座上有三根金钢石的针,第一根针,底座上有三根金钢石的针,第一根针a上放着从大到小上放着从大到小64个金片。解决该问题就是要想法把所有个金片。解决该问题就是要想法把所有金片从第一根针金片从第一根针a上移到第三根针上移到第三根针c上,第二根针上,第二根针b作为

60、中间作为中间过渡。要求是每次只能移动一个金片,并且任何时候不允过渡。要求是每次只能移动一个金片,并且任何时候不允许大的金片压在小的金片上面。许大的金片压在小的金片上面。图图3.6 三个金片的汉诺塔问题装置三个金片的汉诺塔问题装置 abc单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。1.本问题的递归终止条件本问题的递归终止条件。如果只有。如果只有1个盘,显然问个盘,显然问题的解就很明显是:直接把金片从题的

61、解就很明显是:直接把金片从a移到移到c。因此终。因此终止条件是止条件是n=1;终止条件对应的操作是直接把金片;终止条件对应的操作是直接把金片从从a移到移到c,示意,示意ac。2.本问题的递归分析本问题的递归分析:移动:移动n个金片从个金片从a到到c,必须先,必须先将将n-1个金片从个金片从a借助借助c移动到移动到b,移动,移动n-1个金片与个金片与原问题相同,但规模变小,即向终止条件接近,因原问题相同,但规模变小,即向终止条件接近,因此,此问题可以用递归过程完成。递归过程可以用此,此问题可以用递归过程完成。递归过程可以用如下步骤表示:如下步骤表示:(1)将将n-1个金片从个金片从a经过经过c移

62、动到移动到b。(2)将第将第n个金片从个金片从a直接移动到直接移动到c。(3)再将再将n-1个金片从个金片从b经过经过a移动到移动到c。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。一般地,设将一般地,设将n个金片从个金片从x针借助针借助y针移动到针移动到z针的函数原形为:针的函数原形为:void hanoi(int n,char x,char y,char z)根据解题步骤,可以写出求解根据解题步骤,

63、可以写出求解n个金片的汉诺塔函数如下:个金片的汉诺塔函数如下:#include /*ex3_8.cpp*using namespace std;void hanoi(int n,char x,char y,char z)if(n=1)/n=1时,直接将金片从时,直接将金片从x移动到移动到z cout x z 1时时 hanoi(n-1,x,z,y);/先将先将n-1个金片从借助个金片从借助z移动到移动到y cout x z 1时,就递归调用时,就递归调用hanoi(),每次,每次n减减1。最后当。最后当n=1时,直时,直接移动该金片就可以了。接移动该金片就可以了。主函数如下:主函数如下:voi

64、d main()int n;cout input n:n;hanoi(n,a,b,c);/n个金片从个金片从a针借助针借助b针移动到针移动到c针针 虽然递归调用在写程序时很简单,但执行起来却很复杂(时虽然递归调用在写程序时很简单,但执行起来却很复杂(时间、存储空间都开销大)。对于汉诺塔问题程序的执行过间、存储空间都开销大)。对于汉诺塔问题程序的执行过程分析比较复杂,有兴趣的读者可参阅教材对程分析比较复杂,有兴趣的读者可参阅教材对3个盘情景的个盘情景的分析(图分析(图3.7 及其相应文字叙述)。及其相应文字叙述)。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此

65、处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。调用函数时需要一定的时间和空间的开销。下图表调用函数时需要一定的时间和空间的开销。下图表示的是一般函数调用的过程。示的是一般函数调用的过程。一般函数调用过程一般函数调用过程3.5 内置函数内置函数单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。3.5

66、.1 内置函数的作用内置函数的作用内置函数也称内联函数、内嵌函数。引入内置函数内置函数也称内联函数、内嵌函数。引入内置函数的目的是为了提高程序中函数调用的效率。的目的是为了提高程序中函数调用的效率。C+提提供一种提高效率的方法,即在编译时将所调用函数供一种提高效率的方法,即在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出的代码直接嵌入到主调函数中,而不是将流程转出去。这种嵌入到主调函数中的函数称为内置函数去。这种嵌入到主调函数中的函数称为内置函数(inline function),又称又称内嵌函数内嵌函数。在有些书中把它。在有些书中把它译成译成内联函数内联函数。指定内置函数的方法很简单,只需在函数首行的左指定内置函数的方法很简单,只需在函数首行的左端加一个关键字端加一个关键字inline即可。即可。单击此处编辑母版标题样式单击此处编辑母版标题样式 单击此处编辑母版副标题样式单击此处编辑母版副标题样式从使用情况来看,闭胸式的使用比较广泛。敞开式盾构之中有挤压式盾构、全部敞开式盾构,但在近些年的城市地下工程施工中已很少使用,在此不再说明。【例例3.9】判断用户从键盘输入的系

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!