第3章 函数.ppt

上传人:春哥&#****71; 文档编号:16924299 上传时间:2022-05-20 格式:PPT 页数:58 大小:446KB
返回 下载 相关 举报
第3章 函数.ppt_第1页
第1页 / 共58页
第3章 函数.ppt_第2页
第2页 / 共58页
点击查看更多>>
资源描述

《第3章 函数.ppt》由会员分享,可在线阅读,更多相关《第3章 函数.ppt(58页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、课程主讲人:第3章 函数中国铁道出版社中国铁道出版社张思民等主编张思民等主编C+C+语言程序设计语言程序设计第第 3 章函章函 数数本 章 内 容n函数模板的定义n模板函数n3.4 变量的作用域和存储类型n3.4.1 变量的作用域n3.4.2 变量的存储类型n3.4.3 外部变量n3.5 随机函数n3.6 函数重载n本章小结n3.1 函数定义n3.1.1 函数的分类n3.1.2 函数的定义n3.2 函数的调用n3.2.1 函数调用的语法形式n3.2.2 函数调用的过程n3.2.3 函数的传值调用n3.2.4 函数的引用调用n3.2.5 函数的嵌套调用n3.2.6 函数的递归调用n3.3 函数模

2、板3.1函数定义函数定义3.1.1 函数的分类函数的分类在C+ 语言中,函数分为两种:系统库函数和自定义函数。3.1.2 函数的定义函数的定义1、函数的定义、函数的定义返回类型 函数名(数据类型1 参数1,数据类型2 参数2,) (函数变量定义);(函数功能实现);(函数返回值);函数体函数体函数头函数头n 返回类型可以是基本数据类型或用户自定义的数据类型,它是函数体中通过 return 语句返回值的数据类型,也称为该函数的类型。当该函数为无返回值时,需要用 void 作函数的类型。n 函数名是由用户定义的标识符。函数名后面有一对小括号,如果括号里面是空的,这样的函数就称为无参函数;如果括号里

3、面至少有一个参数(称为形式参数,简称形参),则称该函数为有参函数。n 用一对大括号括起来的语句构成函数体,完成函数功能的具体实现。函数体一般由3部分组成:第一部分为定义函数所需的变量。函数内部定义的变量称为局部变量;第二部分完成函数功能的具体实现;第三部分由return 语句返回函数的结果。n 函数不允许嵌套定义,即不允许一个函数的定义放在另一个函数的定义中。【例3-1】无参函数实例。1 #include 2using namespace std;3 void hello()4 5 cout ”Hello,Lets study the C+ language. n”;6 函数说明函数说明:n第

4、3行是函数头的定义,函数类型为void型,表明函数无返回值,函数名为hello。函数名后面的括号中没有参数,表明该函数无返回值。n第4至6行是函数体,它的功能是输出“Hello,Lets study the C+ language.”字符串。定义函数头,函数名为hello,无参数,无返回值。函数体2、函数的返回值、函数的返回值n 在函数定义中,函数的类型是该函数返回值的数据类型。 return return 表达式表达式该语句的功能是将函数要输出的信息反馈给主调函数。【例3-2】有参函数实例。编写函数, 求1 + 2 + 3 + + n的和。1int mysum(int n)23int i,

5、s = 0;4for(i = 1; i y) return x;4 else return y;5 3、函数原型的声明、函数原型的声明n 在C+ 程序中,函数使用前需要先声明。这种声明函数的语句称为函数原型声明。函数原型声明的形式如下:返回类型返回类型 函数名函数名( (数据类型数据类型1 1 参数参数1 1,数据类型,数据类型2 2 参数参数2 2, );声明函数原型的形式与定义函数头基本相同,但函数原型声明是一条语句,要以分号结尾,而函数定义中的函数头末尾是没有分号的。例如:n void hello( );n int mysum(int n);n 在实际使用函数时,如果函数定义在先,函数调

6、用在后,调用前可以不必声明。但如果函数定义在后,函数调用在先,调用前必须先声明函数原型。3.2函数的调用函数的调用3.2.1 函数调用的语法形式函数调用的语法形式n 函数调用的语句形式如下:n 一个函数在被调用语句中,其参数称为实际参数。实际参数简称为实参,函数调用中的实参不需要加数据类型,实参的个数、类型、顺序要和函数定义时的形参一一对应。函数名(实际参数函数名(实际参数1, 实际参数实际参数2, , 实际参数实际参数n););n 定义有参函数时,形式参数并没有具体数据值,在被主调函数调用时,主调函数也必须给出具体数据(实参),将实参值依次传递给相应的形参。 n C+程序的运行总是从main

7、()开始,main()函数又称之为主函数,它可以调用任何其他的函数,但不允许被其他函数调用。n 除了main()函数以外,其它任何函数的关系都是平等的,可以相互调用。【例3-4】调用max( )函数语句main( )函数定义max( )函数声明函数max( ),函数必须“先声明,后调用”1 #include 2 using namespace std;3 int max(int x, int y);4 void main()5 6 int a, b, m;7 cout a b;9 m = max(a, b); 10 cout “a,b 二个数中的较大数为:” m y) s = x;17 els

8、e s = y;18 return s;19 例例3-4#includeusing namespace std;int max(int x, int y);void main() int a,b; coutab; m=max(a, b); cout“a,b二个数中的较大者为二个数中的较大者为:”my) s=x; else s=y; return s;程序总是从主函数开始执行程序总是从主函数开始执行4 6 4 6 程序的入程序的入口点口点调用之前调用之前a4b6cinaba4b6调用开始调用开始实参实参形参形参xy46开辟开辟a4b6调用期间调用期间实参实参形参形参xy46s=xy?x:y;a4

9、b6调用完毕调用完毕实参实参形参形参xy46释放释放m=max(a, b);3.2.2 函数调用的过程函数调用的过程 以例3-4为例,当调用一个函数时,整个调用过程分为4步进行:n 第1步函数调用,并把实参的值传递给形参;n 第2步执行被调用函数max()的函数体,形参用所获得的数值进行运算;n 第3步通过return语句将被调用函数的运算结果输出给主调函数;n 第4步返回到主调函数的函数调用表达式位置,继续后续语句的执行。图3.2所示 函数的调用过程3.2.3 函数的传值调用函数的传值调用n 在C+语言中,调用有参函数时,是通过实参向形参传值的,按调用方式可分为传值调用和引用调用。图3.3

10、函数参数按值依次传递实实参参到到形形参参的的传传递递过过程程图3.4#include using namespace std;void swap(int a, int b) int temp; temp=a; a=b; b=temp;void main() int x=5,y=6; cout“a与与b交换之前交换之前”; count“x=”x“y=”yendl; swap(x,y); cout“a与与b交换之后交换之后”; count“x=”x“y=”yendl;调用:56a:b:56x:y:swap:56x:y:65a:b:temp例3-5 交换两个数程序入口点程序入口点56x:y:调用前:

11、调用结束调用结束:56x:y:3.2.4 函数的引用调用函数的引用调用1、引用的概念n 引用是已存在的变量的一个别名,对引用型变量的操作实际上就是对被引用变量的操作。n 定义一个引用型变量的语法形式如下:数据类型&引用变量名 = 被引用变量名;例如:例如: int a; int &ra = a; 定义引用变量ra,它是变量a的引用,a是被引用变量说明:n (1)“&”是引用运算符,注意与后面章节中的指针取址运算符区别。n (2)引用变量的数据类型应与被引用变量的类型相同。n (3)声明引用时,必须同时对其进行初始化。n (4)引用声明完毕后,相当于被引用变量名有两个名称,ra相当于a的别名(绰

12、号)。对ra的任何操作就是对a的操作。且不能再把该引用名作为其他变量名的别名。 n (5)声明一个引用,不是新定义了一个变量,它不占存储单元,系统也不给引用分配存储单元。n (6)引用运算符“&”仅在说明一个引用型变量时使用,引用型变量被说明之后,就不能再带“&”,只需直接使用其变量名。#include using namespace std;void swap(int &a, int &b) int temp; temp=a; a=b; b=temp;void main() int x=5,y=6; cout“a与与b交换之前交换之前”; count“x=”x“y=”yendl; swap(

13、x,y); cout“a与与b交换之后交换之后”; count“x=”x“y=”yendl;例例3-7 如何实现实参如何实现实参x,y的交换呢?的交换呢?xint &a=x;a说明:n &-引用运算符n 声明引用时必须同时对其进行初始化;n 声明一个引用不占内存单元;n 引用型变量在使用时直接使用其变量名。#include using namespace std;void swap(int &a, int &b) int temp; temp=a; a=b; b=temp;void main() int x=5,y=6; cout“a与与b交换之前交换之前”; count“x=”x“y=”ye

14、ndl; swap(x,y); cout“a与与b交换之后交换之后”; count“x=”x“y=”yendl;程序入口点程序入口点x56y调前:x65y返回:x56y调用:abx711y调用中:abtemp65int &a=x;int &b=y;n 函数调用中参数传递n 以简单变量作为形参n 以引用变量作为形参n 通过引用形参的方式可以返回多于一个的计算结果3.2.5 函数的嵌套调用函数的嵌套调用 嵌套调用nC+规定:函数定义不可嵌套,但可以嵌套调用函数#include using namespace std;void main() int n; long sum; long add(int

15、 n); long f(int i); coutn; sum=add(n); cout“1!+2!+3!+n!=”sum;long add(int n) int i; long s=0; for(i=1;i=n;i+) s=s+f(i); return s;long f(int i) int j; long fac=1; for(j=1;j=i;j+) fac=fac*j; return fac;例3-7 嵌套调用示例 求1!+2!+3!+n!的值3.2.6 函数的递归调用函数的递归调用 C+ 语言允许被调函数调用该函数自身,这样的嵌套调用称为函数的递归调用。f( )调f调f2调f1f1( )

16、f2( )int f(int x) int y,z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);【例3-11】用递归的方法求斐波那契数列的第n项。斐波那契数列第1项和第2项都是1,后面每一项都是前两项之和,即 1,1, 2,3,5,8, 13,。 求斐波那契数列第n项的公式为:11,2( )(1)(2)2nf nf nf nn例如,n = 6 时计算斐波那契数列的递归过程如下:f(6) = f(5) + f(4

17、)f(5) = f(4) + f(3)f(4) = f(3) + f(2)f(3) = f(2) + f(1)f(2) = 1f(1) = 1按上述相应的过程回溯计算,就得到n = 6 时的斐波那契数列:f(1) = 1f(2) = 1f(3) = f(2) + f(1) = 1 + 1 = 2f(4) = f(3) + f(2) = 2 + 1 = 3f(5) = f(4) + f(3) = 3 + 2 = 5f(6) = f(5) + f(4) = 5 + 3 = 8 #include using namespace std; long int f(int n); void main( )

18、 int n = 0; long int x = 0; cout 请输入正整数 n : n; x = f(n); cout n = n , f(n) = x endl; long int f(int n) long int x = 0; if(n = 1 | n = 2) x = 1; else x = f(n - 1) + f( n - 2); return x; 递归函数终止条件调用函数自身3.3函数模板函数模板3.3 函数模板n c+语言的一个特性n 实现代码的重用,减少程序设计人员的重复劳动int sum(int a, int b) return a+b;double sum(doub

19、le a, double b) return a+b;T sum(T a, T b) return a+b;3.3.1 函数模板的定义template 返回类型返回类型 函数名(形参表)函数名(形参表) 函数体语句函数体语句;template void swap(T a, T b) T temp; temp=a;a=b;b=temp;template T1 swap(T1 a, T2 b, T3 c) /函数体函数体3.3.2 模板函数n 函数模板是对于一组函数的描述-不产生可执行代码n 模板函数是某个函数模板的一个具体实例#include using namespace std;templa

20、teT1 add(T1 a, T2 b) return a+b;void main() int x=5;float y=-3.1f;double z=8.5;char ch=a; cout“add(x,x)=”add(x,x)endl; cout“add(y,x)=”add(y,x)endl; cout“add(z,x)=”add(z,x)endl; cout“add(y,y)=”add(y,y)endl; cout“add(ch,x)=”add(ch,x)endl;定义一个函数模板定义了两个类型参数T1,T2add(x,x)=10add(y,x)=6.9add(z,x)=13.5add(y,

21、y)=-6.2add(ch,x)=f3.3变量的作用域和存储类型变量的作用域和存储类型3.4.1 变量的作用域变量的作用域 n 变量按在程序中所处不同位置分为两类:局部变量和全局变量局部变量和全局变量。n 如果一个变量定义在函数内部或者复合语句内部,该变量称之为局部变量局部变量。n 如果一个变量定义在所有函数外面,则该变量称之为全局变量全局变量。局部变量和全局变量的作用范围如下面图3.7所示。例3-13#include using namespace std;int Max=0; Min=0;int fnc1(int x, int y) Max=x; if(yx) Max=y; return

22、Max;int fnc2(int i, int j) Min=i; if(jab; Max=fac1(a,b); Min=fac2(a,b); cout“max”=Maxendl; cout“min”=Minendl;Max, Min全局变量,作用域整个源程序文件x, y局部变量,作用域:fnc1函数i, j局部变量,作用域:fnc2函数a, b局部变量,作用域:main函数3.4.2 变量的存储类型变量的存储类型1、静态存储方式和动态存储方式2、内存空间的划分3、动态局部变量4、静态局部变量【例3-14】动态局部变量和 静态局部变量举例 #include using namespace st

23、d; int myfun(); main() int i=0,a=0; for(i=1;i=2;i+) a=myfun(); coutaendl; int myfun() auto int x=1; static int y=1; x=x+2; y=y+2; return x+y; 3.4.3 外部变量外部变量n 定义一个外部变量的一般格式为: extern 变量类型 外部变量名;声明一个变量为外部变量,其实质是引用其他程序中的同名全局变量,故其他程序中的同名全局变量的值将成为外部变量的初值,外部变量的运算结果将被其他程序作为同名全局变量的新值。如调用情况如图3.9所示。图3.9 调用外部变量

24、(1)file2.cppextern int s;void f2() s=0; for(int i=1;i=100;i+) s=s+i;(2)file1.cpp#includeusing namespace std;void f2();static int s=10;void main() f2(); cout“s=”sendl;外部变量的声明外部变量的声明:声明该变量是在外部定义过的一个全局变量声明该变量是在外部定义过的一个全局变量外部变量的定义【例3-15】外部变量的应用示例。设在程序文件file2.cpp中将其全局变量s设置为外部变量,s = 1 + 2 + + 100,由文件file1

25、.cpp调用该变量的运算结果。调用外部函数f2( ),其外部变量s的运算结果改变了本程序全局变量s的值3.5随机函数随机函数3.5 随机函数n rand(): 产生032767之间的一个伪随机整数;根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系数 n srand(): 初始化rand()函数的初始值,即指定不同的种子n time(): 时间来作为随机数生成器rand()的种子, time的值每时每刻都不同,所以种子不同,所以产生的随机数也不同。#include#include#includeusing namespace std;void main() int a,b,c;

26、 srand(time(0); a=rand(); b=rand(); c=rand(); cout“a=”a; cout“tb=”b; cout“tc=”cendl;#include#include#includeusing namespace std;void main() int a,b,c; int N=100; srand(time(0); a=rand()%100+1; b=rand()%100+1; c=rand()%100+1; cout“a=”a; cout“tb=”b; cout“tc=”cendl;产生随机数的范围产生随机数的范围11003.6函数重载函数重载3.6 函数

27、重载n 函数重载 指同一个函数名可以对应着多个函数的实现。每种实现对应着一个函数体,这些函数的名字相同,但是函数的参数的类型不同。 确定函数实现时,要求从函数参数的个数和类型上来区分。这就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。否则,将无法实现重载 #include using namespace std;int max(int x, int y) if(x y) return x; else return y; float max(float x, float y) if(x y) return x; else return y; int max(int x,

28、 int y,int z) if(x y &xz) return x; else if(xy&xz) return z; else if(xz) return y; else if(xy&yz) return z; else return x; void main(void) int x = 5, y = 6, z = 7, t2, t3; float u = 5.5, v = 6.6, w; t2 = max(x, y); cout t2 = t2 endl; t3 = max(x, y, z); cout t3 = t3 endl; w = max(u, v); cout w = w endl;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁