《C++程序结构.ppt》由会员分享,可在线阅读,更多相关《C++程序结构.ppt(68页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5章章 函函 数数 main()fnuc1()fnuc2()fnuc3()fnuc5()fnuc4()C+C+程序结构程序结构 在在C+C+语言中所使用的函数包括:语言中所使用的函数包括:标标准函数准函数(sin(x)sin(x)、coscos(x)(x)、sqrtsqrt(x)(x)等等等等)和和自定义函数自定义函数。例:例:#include#include void main()double x,y;cinx;y=sin(x);couty=yendl;第第5章章 函函 数数 自定义函数一般包括:自定义函数一般包括:函数名函数名、自变量自变量和和函数体函数体。1 1有参数函数有参数函数格
2、式格式类型类型 函数名函数名(形式参数表形式参数表)说明部分说明部分 语句语句1 1 语句语句2 2 语句语句n n 一、自定义函数一、自定义函数 1 1有参数函数有参数函数功能功能例例1 1:设设f(x)=xf(x)=x3 3+2x+2x2 2-5x+1-5x+1,求求y=f(u)+f(v)y=f(u)+f(v)一、自定义函数一、自定义函数 定义函数:定义函数:float f(float x)float f(float x)float float yyyy;yyyy=x*x*x+2*x*x-5*x+1;=x*x*x+2*x*x-5*x+1;return(return(yyyy););一、自定
3、义函数一、自定义函数 一、自定义函数一、自定义函数 主函数:主函数:#include float f(float);void main()float u,v,y;float u,v,y;cincinu uv;v;y=f(u)+f(v);y=f(u)+f(v);couty=yendl;程序:程序:#include float f(float);void main()float u,v,y;float u,v,y;cincinu uv;v;y=f(u)+f(v);y=f(u)+f(v);couty=yendl;float f(float x)float f(float x)float float
4、yyyy;yyyy=x*x*x+2*x*x-5*x+1;=x*x*x+2*x*x-5*x+1;return(return(yyyy););一、自定义函数一、自定义函数 运行过程:运行过程:输入:输入:0 10 1输出:输出:y=0y=0输入:输入:1.5 21.5 2输出:输出:y=8.375y=8.3752 2无无参数函数参数函数格式格式类型类型 函数名函数名()()说明部分说明部分 语句语句1 1 语句语句2 2 语句语句n n 一、自定义函数一、自定义函数#include void printstar1();void printstar2();void main()printstar1(
5、);printstar1();printstar2();printstar2();printstar1();printstar1();2 2无无参数函数参数函数功能功能void printstar1()void printstar1()coutcout*endl;void printstar2()void printstar2()coutcout How do you do endl;运行结果:运行结果:*How do you do*#include int max(int,int);void main()int a,b,c;cinab;c=max(a,b);coutMax=cy?x:y;re
6、turn(z);运行结果:运行结果:输入:输入:7 8输出:输出:Max=81 1在定义函数中指定的形参变量,在在定义函数中指定的形参变量,在未出现函数调用时,它们并不占用内存未出现函数调用时,它们并不占用内存单元。只有在发生函数调用时函数中的单元。只有在发生函数调用时函数中的形参才被分配内存单元。在调用结束后,形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。(形参所占的内存单元也被释放。(示例示例)2 2实参可以是实参可以是常量常量、变量变量或或表达式表达式,如:如:c=max(3,a+b)c=max(3,a+b);但要求它们必须有但要求它们必须有确定的值,在调用时将实参的值
7、赋值给确定的值,在调用时将实参的值赋值给形参变量。形参变量。关于关于形式参数形式参数与与实际参数实际参数的说明的说明 3 3在被定义的函数中,必须指定形参在被定义的函数中,必须指定形参的类型。(的类型。(用前例用前例说明说明)。)。4 4实参与形参实参与形参的类型必须一致。的类型必须一致。(用前例说明用前例说明)5 5C+C+语言规定,语言规定,实参变量实参变量对对形参变形参变量量的数据传递是的数据传递是“值传递值传递”,即,即单向单向传递传递,只能由实参传给形参。而不能,只能由实参传给形参。而不能由形参传回给实参。由形参传回给实参。关于关于形式参数形式参数与与实际参数实际参数的说明的说明 1
8、 1函数语句函数语句。把函数调用作为一。把函数调用作为一个语句个语句三、函数调用的方式三、函数调用的方式#include void printstar1();void printstar2();void main()printstar1();printstar1();printstar2();printstar2();printstar1();printstar1();void printstar1()void printstar1()coutcout*endl;void printstar2()void printstar2()coutcout How do you do endl;三、函数
9、调用的方式三、函数调用的方式 程序:程序:#include float f(float);void main()float u,v,y;float u,v,y;cincinu uv;v;y=f(u)+f(v);y=f(u)+f(v);couty=yendl;2 2函数表达式。函数表达式。函数出现在一函数出现在一个表达式中,这种表达式称为函个表达式中,这种表达式称为函数表达式。数表达式。float f(float x)float f(float x)float float yyyy;yyyy=x*x*x+2*x*x-5*x+1;=x*x*x+2*x*x-5*x+1;return(return(y
10、yyy););3 3函数参数函数参数。函数调用作为一个函数调用作为一个函数的参数。函数的参数。#include int max(int,int);void main()int a,b,c;cinab;c=max(a,max(b,10);coutMax=cy?x:y;return(z);四、函数原型四、函数原型 在在C+C+中,函数声明就是中,函数声明就是函数原型函数原型函数原型是一条程序语句,必须以分号结束#include int max(int,int);void main()int a,b,c;cinab;c=max(a,max(b,10);coutMax=cy?x:y;return(z)
11、;五、函数递归调用五、函数递归调用 函数的递归调用是指在调用一函数的递归调用是指在调用一个函数的过程中又直接或间接调个函数的过程中又直接或间接调用了函数本身。用了函数本身。函数函数1 1函数函数2 2函数函数3 3函数函数4 4特殊情况特殊情况子函数子函数例例2 2:用递归方法求:用递归方法求n!n!分析:分析:设:设:f(n)=n!f(n)=n!f(n-1)=(n-1)!f(n-1)=(n-1)!f(n)=n*f(n-1)f(n)=n*f(n-1)f(n-1)=(n-1)*f(n-2)f(n-1)=(n-1)*f(n-2)f(n-2)=(n-2)*f(n-3)f(n-2)=(n-2)*f(n
12、-3)f(1)=1f(1)=1五、函数递归调用五、函数递归调用例例2 2:用递归方法求:用递归方法求n!n!f(n)=n*f(n-1)f(n)=n*f(n-1)五、函数递归调用五、函数递归调用定义递归函数:定义递归函数:intint f(f(intint n)n)intint ff;ff;if(n=1)ff=1;if(n=1)ff=1;else ff=n*f(n-1);else ff=n*f(n-1);return(ff);return(ff);主函数:主函数:#include int f(int);void main()intint n1,y;n1,y;cincinn1;y=f(n1);y=
13、f(n1);couty=yendl;五、函数递归调用五、函数递归调用程序:程序:#include int f(int);void main()intint n1,y;n1,y;cincinn1;y=f(n1);y=f(n1);couty=yendl;intint f(f(intint n)n)intint ff;ff;if(n=1)ff=1;if(n=1)ff=1;else ff=n*f(n-1);else ff=n*f(n-1);return(ff);return(ff);执行过程:执行过程:输入:输入:5 5y=f(5)y=f(5)=5*f(4)=5*f(4)=5*4*f(3)=5*4*f
14、(3)=20*3*f(2)=20*3*f(2)=60*2*f(1)=60*2*f(1)=120*1=120*1=120=120五、函数递归调用五、函数递归调用例例3 3:用递归方法求:用递归方法求xn分析:分析:设:设:f(x,n)=f(x,n)=xn f(x,n-1)=f(x,n-1)=xn-1 f(x,n)=x*f(x,n-1)f(x,n)=x*f(x,n-1)f(x,n-1)=x*f(x,n-2)f(x,n-1)=x*f(x,n-2)f(x,n-2)=x*f(x,n-3)f(x,n-2)=x*f(x,n-3)f(x,1)=xf(x,1)=x例例3 3:用递归方法求:用递归方法求xnf(x
15、,n)=x*f(x,n-1)f(x,n)=x*f(x,n-1)定义递归函数:定义递归函数:float f(float x,float f(float x,intint n)n)float ff;float ff;if(n=1)ff=x;if(n=1)ff=x;else ff=x*f(x,n-1);else ff=x*f(x,n-1);return(ff);return(ff);主函数:主函数:#include float f(float,int);void main()float y;float y;intint n1;n1;cincinxn1;y=f(x,n1);y=f(x,n1);cout
16、y=yendl;程序:程序:#include float f(float,int);void main()float y;float y;intint n1;n1;cincinxn1;y=f(x,n1);y=f(x,n1);couty=yendl;float f(float x,float f(float x,intint n)n)float ff;float ff;if(n=1)ff=x;if(n=1)ff=x;else ff=x*f(x,n-1);else ff=x*f(x,n-1);return(ff);return(ff);执行过程:执行过程:输入:输入:2,52,5y=f(2,5)y
17、=f(2,5)=2*f(2,4)=2*f(2,4)=2*2*f(2,3)=2*2*f(2,3)=4*2*f(2,2)=4*2*f(2,2)=8*2*f(2,1)=8*2*f(2,1)=16*2=16*2=32=321 1内联函数的意义:内联函数的意义:主要解决主要解决程序运行的效率程序运行的效率六、内联函数六、内联函数#include int max(int,int);void main()int a,b,c;cinab;c=max(a,b);coutMax=cy?x:y;return(z);#include void main()int a,b,c;cinab;c=ab?a:b;coutMa
18、x=cendl;用以上程序与下面程序进行比较用以上程序与下面程序进行比较2 2内联函数的定义内联函数的定义 定义内联函数的方法很简定义内联函数的方法很简单。只要在函数声明和函数定单。只要在函数声明和函数定义的前面加上关键字义的前面加上关键字inline即可。即可。其它与函数定义相同。其它与函数定义相同。六、内联函数六、内联函数#include inline int max(int,int);void main()int a,b,c;cinab;c=max(a,b);coutMax=cy?x:y;return(z);内内联联函函数数#include int max(int,int);void m
19、ain()int a,b,c;cinab;c=max(a,b);coutMax=cy?x:y;return(z);不不是是内内联联函函数数没有没有inline3内联函数的限制内联函数的限制 内内联联函函数数虽虽然然具具有有普普通通函函数数的的特特性性,但但其其处处理理方方式式与与普普通通函函数数不不同同,它它是是将将调调用用表表达达式式用用内内联联函函数数体体来来替替换换,若若内内联联函函数数比比较较大大,在在程程序序中中就就会会有有多多个个程程序序备备份份,反反而而会会占占用用更更多多的的内内存存空空间间,这这就就失失去去了了内内联联函函数数存存在在的的实实际际意意义义。因因此此,C+对内链
20、函数的定义有专门限制。对内链函数的定义有专门限制。六、内联函数六、内联函数在内联函数内部不允许使用在内联函数内部不允许使用循环语句和开关语句,否则系循环语句和开关语句,否则系统将其视为普通函数。统将其视为普通函数。内联函数不能是递归函数。内联函数不能是递归函数。语句数尽可能少,一般不超语句数尽可能少,一般不超过过5行。行。六、内联函数六、内联函数 1函数重载的意义函数重载的意义 所谓所谓函数重载函数重载是指同一个函数名可是指同一个函数名可以对应着多个函数的实现。例如,可以以对应着多个函数的实现。例如,可以给函数名给函数名add()()定义多个函数实现,定义多个函数实现,该函数的功能是求和,即求
21、两个操作数该函数的功能是求和,即求两个操作数的和。其中,一个函数是求两个的和。其中,一个函数是求两个int型的型的和,另一个实现是求两个浮点型数之和。和,另一个实现是求两个浮点型数之和。每种实现都对应一个函数体,这些函数每种实现都对应一个函数体,这些函数的名字相同,但是函数的参数的类型不的名字相同,但是函数的参数的类型不同。这就是函数重载的概念。同。这就是函数重载的概念。七、函数重载七、函数重载例例4:求两个操作数之和。:求两个操作数之和。#include int add(int,int);double add(double,double);void main()coutadd(5,10)en
22、dl;coutadd(5.0,10.5)endl;int add(int x,int y)return x+y;double add(double a,double b)return a+b;输出结果为:输出结果为:15155 2 2、函数重载的匹配顺序、函数重载的匹配顺序 调调用用一一个个重重载载函函数数时时,编编译译器器是是如如何何知知道道该该调调用用那那个个函函数数呢呢?这这就就要要根根据据实实参参和和形形参参类类型型以以及及参参数数的的个数来决定。具体比较过程:个数来决定。具体比较过程:七、函数重载七、函数重载寻寻找找一一个个严严格格的的匹匹配配,如如果果找找到到了了,就就用用那那个个
23、函函数数。这这种种匹匹配配要要求求类型一致、参数个数一致。类型一致、参数个数一致。通通过过内内部部转转换换寻寻求求一一个个匹匹配配,只只要要找找到到了了,就就用用那那个个匹匹配配。这这种种要要求求参参数数个个数数一一致致,类类型型可可内内部部转转换换实现。实现。通通过过用用户户定定义义的的转转换换条条件件寻寻求求匹匹配配,若若能能查查出出有有唯唯一一的的一一组组转转换换,就用那个函数。就用那个函数。七、函数重载七、函数重载#include int min(int a,int b);int min(int a,int b,int c);int min(int a,int b,int c,int
24、d);void main()cout min(13,5,4,9)endl;int min(int a,int b)return ab?a:b;int min(int a,int b,int c)int t=min(a,b);return min(t,c);int min(int a,int b,int c,int d)int t1=min(a,b,c);return min(t1,d);1 1、默认参数的含义默认参数的含义 默认参数就是在调用函数时可以默认参数就是在调用函数时可以省略实参。省略实参。程序:程序:#include float f(float x=0);void main()flo
25、at y;float y;y=y=f()f()+f(2);+f(2);couty=yendl;八、默认参数八、默认参数默认参数只能默认参数只能默认参数只能默认参数只能在函数声明中在函数声明中在函数声明中在函数声明中定义定义定义定义默认参数的调用默认参数的调用默认参数的调用默认参数的调用float f(float x)float f(float x)float float yyyy;yyyy=x*x*x+2*x*x-5*x+1;=x*x*x+2*x*x-5*x+1;return(return(yyyy););八、默认参数八、默认参数运行结果:运行结果:y=8y=8 2 2默认参数的顺序规定默认参
26、数的顺序规定 当当函函数数中中定定义义默默认认参参数数时时,如如果果仅仅有有部部分分参参数数定定义义成成默默认认参参数数,则则应应将将默默认认参参数数连连续续放放在在右右边边(不不能能空空缺缺)。当调用函数时只能向左匹配参数。当调用函数时只能向左匹配参数。例如:例如:funcfunc(intint a=1,a=1,intint b,b,intint c=3,c=3,intint d=4);/d=4);/错错funcfunc(intint a,a,intint b=2,b=2,intint c=3,c=3,intint d=4);/d=4);/正确正确对于第二个声明,其调用的方法为:对于第二个声
27、明,其调用的方法为:八、默认参数八、默认参数funcfunc(10,15,20,30);/(10,15,20,30);/正确正确funcfunc();/();/错误错误funcfunc(12,12);(12,12);/正正确确,参参数数c c,d d默认默认funcfunc(2,15,20);(2,15,20);错错误误,只只能能从从右右到到左左顺顺序序匹匹配配默默认认参参数数,这这等等于于将将c c进进行行默默认认匹匹配配,而而没没有有将将d d也也默默认认匹匹配配,也也就就是是说说,c c默认匹配则默认匹配则d d也必须先默认匹配。也必须先默认匹配。八、默认参数八、默认参数 3 3默认参数
28、与函数重载默认参数与函数重载 默默认认参参数数可可将将一一系系列列简简单单的的重重载载函函数数合合成为一个。成为一个。例如,下面三个重载函数:例如,下面三个重载函数:void point(void point(intint,intint);void point(void point(intint a)a)return point(a,4);return point(a,4);void point()return point(3,4);void point()return point(3,4);void point(void point(intint=3,=3,intint=4);=4);八、默
29、认参数八、默认参数下面调用是合法的。下面调用是合法的。point();point();point(6);point(6);point(7,8);point(7,8);八、默认参数八、默认参数 调调 用用 point(3,4),等等于于调调用用上上面面第第三三个个函函数数 调调 用用 point(6,4),等等于于调调用用上上面面第第二二个个函函数数 调调用用point(3,4),等等于调用上面第一个函数于调用上面第一个函数 1 1局部变量局部变量 在在一一个个函函数数内内部部定定义义的的变变量量称称为为内内部部变变量量,它它只只在在本本函函数数范范围围内内有有效效,也也就就是是说说只只有有在在
30、本本函函数数内内才才能能使使用用它它们们,在在此此函函数数以以外外是是不不能能 使使用用这这些些变变量量的的。称称这些变量为这些变量为局部变量局部变量。九、全程变量和局部变量九、全程变量和局部变量例:例:#include int max(int,int);void main()int a,b,c;cinab;c=max(a,b);coutMax=cy?x:y;return(z);变变 量量 a,b,c只只 能能在在主主函函数数中中使使用用,所所以它们是局部变量以它们是局部变量 变变 量量 x,y,z只只 能能 在在max函函数数中中使使用用,所所以以它们是局部变量它们是局部变量2 2全程变量全
31、程变量在在函函数数外外面面定定义义的的变变量量称称为为全全程程变变量量特点:特点:l l 全程变量全程变量可被每个函数使用。可被每个函数使用。l l 全程变量全程变量存放在全局数据区。存放在全局数据区。l l全全程程变变量量默默认认初初始始值值为为0 0,也也可可专门初始化。专门初始化。九、全程变量和局部变量九、全程变量和局部变量#include#include .hintint a;a;intint max(max(intint x1,x1,intint y1);y1);void main()void main()intint x=1,y=8;x=1,y=8;x+=a+-y;x+=a+-y;
32、coutcoutmax(x,y),a,max(x,y),a,x,y x,yy1)?x1:y1;a=(x1y1)?x1:y1;return a;return a;九、全程变量和局部变量九、全程变量和局部变量 变变变变量量量量x,yx,y只只只只能能能能在在在在主主主主函函函函数数数数中中中中使使使使用用用用,所所所所以以以以它它它它们们们们是是是是局部变量局部变量局部变量局部变量 变变变变 量量量量 x1,y1x1,y1只只只只 能能能能 在在在在maxmax函函函函数数数数中中中中使使使使用用用用,所所所所以以以以它们是局部变量它们是局部变量它们是局部变量它们是局部变量 变变变变量量量量a a
33、能能能能在在在在所所所所有有有有函函函函数数数数中中中中使使使使用用用用,所所所所以以以以它它它它们们们们是全程变量是全程变量是全程变量是全程变量#include#include .h intint a;a;intint max(max(intint x1,x1,intint y1);y1);void main()void main()intint x=1,y=8;x=1,y=8;x+=a+-y;x+=a+-y;coutcoutmax(x,y),amax(x,y),a ,x,y ,x,yy1)?x1:y1;a=(x1y1)?x1:y1;return a;return a;运行结果:运行结果:8
34、 1 -7 88 1 -7 8如果将上面的如果将上面的coutcout语句改语句改为下面两个语句。为下面两个语句。coutcoutmax(x,y),;max(x,y),;coutcout a,x,y;a,x,y;运行结果:运行结果:8 8 -7 8 8 8 -7 8 在在局局部部变变量量前前加加上上staticstatic关关键键字字,就就成成了静态局部变量。了静态局部变量。特点:特点:l l静静态态局局部部变变量量在在定定义义它它的的函函数数内内部部是是可可见见的的,只只能能被被定定义义它它的的函函数数使使用用。这这一一点点与与局部变量相同。局部变量相同。l l静静态态局局部部变变量量存存放
35、放在在内内存存的的全全局局数数据据区区,静静态态局局部部变变量量一一经经定定义义不不会会再再次次分分配配存存储储空空间间,也也不不会会自自行行消消失失,直直到到程程序序运运行行结结束,这一点与全局变量相同。束,这一点与全局变量相同。l l静静态态局局部部变变量量默默认认初初始始值值为为0 0,也也可可专专门门初始化。这一点又与全局变量相同初始化。这一点又与全局变量相同十、静态局部变量十、静态局部变量例:例:#include#include .hint facint fac(intint););void main()void main()intint i;i;for(i=1;i=5;i+)for
36、(i=1;i=5;i+)coutcouti!=i!=facfac(i)(i)endlendl;int facint fac(intint n)n)static static intint f=1 f=1;f=f*n;f=f*n;return(f);return(f);例:例:#include#include .hint facint fac(intint););void main()void main()intint i;i;for(i=1;i=5;i+)for(i=1;i=5;i+)coutcouti!=i!=facfac(i)(i)endlendl;int facint fac(intin
37、t n)n)static static intint f=1 f=1;f=f*n;f=f*n;return(f);return(f);运行结果运行结果1!=12!=23!=64!=245!=120例:例:#include#include .hint facint fac(intint););void main()void main()intint i;i;for(i=1;i=5;i+)for(i=1;i=5;i+)coutcouti!=i!=facfac(i)(i)endlendl;int facint fac(intint n)n)intint f=1 f=1;f=f*n;f=f*n;return(f);return(f);去去掉掉static后后的的运运行行结结果果与与前前例进行比较例进行比较十、静态局部变量十、静态局部变量运行结果运行结果1!=12!=23!=34!=45!=5十一、作十一、作 业业 练习五练习五5.1 5.2 5.3 5.45.1 5.2 5.3 5.4
限制150内