C++课件第六章

上传人:公**** 文档编号:569277315 上传时间:2024-07-28 格式:PPT 页数:72 大小:247KB
返回 下载 相关 举报
C++课件第六章_第1页
第1页 / 共72页
C++课件第六章_第2页
第2页 / 共72页
C++课件第六章_第3页
第3页 / 共72页
C++课件第六章_第4页
第4页 / 共72页
C++课件第六章_第5页
第5页 / 共72页
点击查看更多>>
资源描述

《C++课件第六章》由会员分享,可在线阅读,更多相关《C++课件第六章(72页珍藏版)》请在金锄头文库上搜索。

1、第第6 6章自定义函数章自定义函数6.3、自定义函数、自定义函数一、自定义函数的一般形式一、自定义函数的一般形式定义函数的一般格式为:定义函数的一般格式为:函数值类型说明函数值类型说明 函数名函数名( (参数说明表参数说明表) ) 函数体函数体 其中:其中:第一行称为第一行称为函数头函数头7/28/20241函数值类型说明函数值类型说明:是指函数返回值的数据类是指函数返回值的数据类型型. .如果某一函数不需要返回值,则函数值类型如果某一函数不需要返回值,则函数值类型说明可选用说明可选用void.void.函数名函数名:为一个标识符为一个标识符. .参数说明表参数说明表格式为:格式为: 类型类型

2、 参数参数1,1,类型类型 参数参数2,2, ,类型类型 参数参数n n用来说明完成函数功能所需的必要参数,这用来说明完成函数功能所需的必要参数,这些参数在设计函数时经常还无具体值,因此这些些参数在设计函数时经常还无具体值,因此这些参数也称为形式参数参数也称为形式参数( (形参形参) )或虚拟参数或虚拟参数. .此处定义的参数此处定义的参数( (变量变量) )仅在本函数内有效仅在本函数内有效. .7/28/20242函数体函数体:本身是一个分程序,由语句和其他本身是一个分程序,由语句和其他分程序组成。分程序组成。分程序分程序: 说明语句部分说明语句部分执行语句部分执行语句部分 函数体内可随时声

3、明一个变量,但同一函数函数体内可随时声明一个变量,但同一函数内不能重复声明同一变量。内不能重复声明同一变量。7/28/20243函数返回值函数返回值:函数的返回值也称函数值,返函数的返回值也称函数值,返回的不是函数本身,而是一个值,是通过函数体回的不是函数本身,而是一个值,是通过函数体内部的内部的returnreturn语句提供。语句提供。 returnreturn语句的格式为:语句的格式为:return (return (表达式表达式););returnreturn语句的功能是将表达式的值作为函数语句的功能是将表达式的值作为函数值返回,值返回,()()可有可无。可有可无。returnretu

4、rn语句提供的函数值的类型应与函数声语句提供的函数值的类型应与函数声明中的函数值类型一致,否则会作类型的强制转明中的函数值类型一致,否则会作类型的强制转换,如果数据类型不相容,则编译时会出错。换,如果数据类型不相容,则编译时会出错。7/28/20244如:如:double add(double x,double y)double add(double x,double y) return x+y;return x+y; 又如:又如: intint fa(intfa(int n) n)/求求n!n! intint j,y=1; j,y=1;for(j=1;j=n;j+)for(j=1;jb)?a

5、:b;return (ab)?a:b; (2)(2)不获取参数但返回值不获取参数但返回值double double getigeti( )( ) intint x; x;cincinx;x;return x;return x; 7/28/20246(3)(3)获取参数但不返回值获取参数但不返回值void delay(long a)void delay(long a) for(intfor(int j=1;j=a;j+; j=1;j=a;j+; (4)(4)不获取参数也不返回值不获取参数也不返回值void message( )void message( ) coutcoutThis is a m

6、essage.nThis is a message.n 无返回值的函数也可以使用无返回值的函数也可以使用returnreturn,但不能但不能返回值。返回值。void print( )void print( ) for(intfor(int i=0;i60;i+) i=0;i60;i+) coutcout*;*;coutcoutendlendl; ;return ;return ; 7/28/20247C+C+不允许函数定义嵌套,即在函数定义中再不允许函数定义嵌套,即在函数定义中再定义一个函数是非法的。定义一个函数是非法的。如:如: void main( )void main( ) void

7、void funcfunc( )( )/非法非法 7/28/20248函数类型声明可以省略,此时函数类型声明可以省略,此时: :若函数有返回值,则返回值强制为整型;若函数有返回值,则返回值强制为整型;若函数无返回值若函数无返回值( (无无returnreturn或或returnreturn后不跟任何后不跟任何返回值返回值) ),则此函数为,则此函数为voidvoid型。型。#include #include using namespace std;using namespace std;max(double x,double y)max(double x,double y)/intint型返回

8、值型返回值 return x+y;return x+y; void main()void main() double x,y;double x,y;cincinxy;xy;coutcoutmax(x,y)max(x,y)endlendl; ; / /输入输入 3.5 4.43.5 4.4输出输出 7 77/28/20249#include #include using namespace std;using namespace std;max(double x,double y) /voidmax(double x,double y) /void型返回值型返回值 double z=x+y;do

9、uble z=x+y;return;return; void main() void main() double x,y;double x,y; cincinxy;xy;coutcoutmax(x,y)max(x,y)endlendl; ; / /输出内容错,未实现加法功能输出内容错,未实现加法功能7/28/202410二二 、函数、函数调用调用在在C+C+程序中,除了程序中,除了main()main()函数外,其它函数函数外,其它函数都不能独立地在程序中存在,任一函数的执行都都不能独立地在程序中存在,任一函数的执行都是通过在是通过在main()main()函数中直接或间接地调用来执行,函数中

10、直接或间接地调用来执行,调用一个函数就是执行该函数的函数体的过程。调用一个函数就是执行该函数的函数体的过程。函数调用的一般形式为:函数调用的一般形式为:函数名函数名( (实参表实参表) )实参表是调用函数时所提供的实在参数值,实参表是调用函数时所提供的实在参数值,这些参数值可以是常量、已赋值的变量或可求值这些参数值可以是常量、已赋值的变量或可求值的表达式。的表达式。7/28/202411实参表中多于一个实参时,用逗号分开,它实参表中多于一个实参时,用逗号分开,它们的类型、个数和顺序应与函数的参数表中的参们的类型、个数和顺序应与函数的参数表中的参数个数和类型一一对应。数个数和类型一一对应。函数的

11、调用既可以出现在表达式可出现的任函数的调用既可以出现在表达式可出现的任何地方,也可以以函数调用语句(后加分号)的何地方,也可以以函数调用语句(后加分号)的形式独立出现,调用后的结果是函数的返回值,形式独立出现,调用后的结果是函数的返回值,其类型与定义函数时的函数值类型相同。其类型与定义函数时的函数值类型相同。函数不允许嵌套声明,但可以嵌套调用,也函数不允许嵌套声明,但可以嵌套调用,也可以递归调用可以递归调用, ,即函数直接或间接调用自身。即函数直接或间接调用自身。7/28/202412函数调用的执行过程:main( )调调fun( )结束结束fun( )返回返回保存:保存:返回地址返回地址当前

12、现场当前现场恢复:恢复:主调程序现场主调程序现场返回地址返回地址7/28/202413例例6.16.1、调用函数、调用函数add( ),add( ),求求5a+4b5a+4b#include #include using namespace std;using namespace std;double add(double x,double y)double add(double x,double y) x=5*x;x=5*x;y=4*y;y=4*y;coutcoutx=xty=yx=xty=yab;ab;c=add(a,b);c=add(a,b);coutcoutc=ct;c=ct;cout

13、couta=atb=ba=atb=bendlendl; ; 7/28/202415例例6.26.2、计算、计算1!+2!+3!+1!+2!+3!+m!+m!程序一程序一:#include #include using namespace std;using namespace std;intint fa(intfa(int n) n) for(intfor(int facfac=1,i=1;i=n;i+)=1,i=1;i=n;i+)facfac= =facfac*i;*i;return return facfac; ; 7/28/202416void main()void main() con

14、st const intint m=8; m=8;for(intfor(int sum=0,i=1;i=m;i+) sum=0,i=1;i=m;i+)sum=sum=sum+fa(isum+fa(i););coutcoutm=mm=mendlendl; ;coutcouts=sums=sumendlendl; ; 7/28/202417程序二程序二( (嵌套调用嵌套调用) ):#include #include using namespace std;using namespace std;intint fa(intfa(int n) n) for(intfor(int facfac=1,i=

15、1;i=n;i+)=1,i=1;i=n;i+)facfac= =facfac*i;*i;return return facfac; ; 7/28/202418intint sum(intsum(int m) m) for(intfor(int susu=0,i=1;i=m;i+)=0,i=1;i=m;i+)susu= =su+fa(isu+fa(i););return return susu; ; void main()void main() const const intint m=8; m=8;coutcoutm=mm=mendlendl; ;coutcouts=sum(m)s=sum(m

16、)endlendl; ; 7/28/202419例例6.36.3、编写程序求编写程序求的值的值其中其中arctanarctan用如下形式的级数计算:用如下形式的级数计算:直直到到级级数数某某项项绝绝对对值值不不大大于于1010-15-15为为止止;和和x x均为均为doubledouble型。型。7/28/202420#include#include using namespace std;using namespace std;void main()void main() double a,b; double a,b; double double arctan(doublearctan(do

17、uble x) ; x) ; a=16.0*arctan(1/5.0) ; a=16.0*arctan(1/5.0) ; b=4.0*arctan(1/239.0) ; b=4.0*arctan(1/239.0) ; coutcoutPI=a-bPI=a-b1e-15) while(e/i1e-15) f=e/i; f=e/i; r=(i%4=1)? r+f : r-f ; r=(i%4=1)? r+f : r-f ; e=e* e=e*sqrsqr; i+=2; ; i+=2; return r ; return r ; 运行结果:运行结果:PI=3.141597/28/202422例例6.

18、46.4、寻找并输出、寻找并输出1199911999之间的数之间的数m m, 它满足它满足m m、m m2 2和和m m3 3均为回文数。均为回文数。分析:分析:1010取余的方法,从最低位开始,依次取出该取余的方法,从最低位开始,依次取出该数的各位数字。按反序重新构成新的数,比较与数的各位数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数是回文数。原数是否相等,若相等,则原数是回文数。#include#include using namespace std;using namespace std;void main(void)void main(void) boolbool sy

19、mm(longsymm(long n); n);long m;long m; 7/28/202423for(m=11; m1000; m+)for(m=11; m1000; m+) if ( if (symm(m)&symm(msymm(m)&symm(m* *m)&symm(mm)&symm(m*m*m) *m*m) coutcoutm=m m*m=m*mm=m m*m=m*mm*m*m=m*m*mm*m*m=m*m*mendlendl; ; boolbool symm(longsymm(long n) n) long i=n, m=0;long i=n, m=0; while(i)whil

20、e(i) m=m*10+i%10;m=m*10+i%10; i=i/10 ;i=i/10 ; return ( m=n ); return ( m=n ); 7/28/202424三三、函数原型函数原型函数和变量一样,在使用之前要先说明。函数和变量一样,在使用之前要先说明。函数的定义可视为对函数的声明,如果函数函数的定义可视为对函数的声明,如果函数的定义放在调用之前,则可不用另外声明;如果的定义放在调用之前,则可不用另外声明;如果函数的定义放在调用之后,则必须对函数先作声函数的定义放在调用之后,则必须对函数先作声明,否则将在编译时出错。明,否则将在编译时出错。函数声明的一般形式为:函数声明的一

21、般形式为:函数返回值类型说明函数返回值类型说明 函数名函数名 ( (参数表参数表););其中各部分的意义与函数定义相同。其中各部分的意义与函数定义相同。7/28/202425C+C+中,函数声明就是中,函数声明就是函数原型函数原型。函数原型跟函数定义时的区别:函数原型跟函数定义时的区别:函数原型没有函数体且用分号结束,类似变函数原型没有函数体且用分号结束,类似变量声明,函数原型中的参数表可以只说明形参类量声明,函数原型中的参数表可以只说明形参类型,而无形参本身。型,而无形参本身。有了函数原型,则只要将其放在函数的调用有了函数原型,则只要将其放在函数的调用之前,则即使函数的定义放在调用之后,也不

22、会之前,则即使函数的定义放在调用之后,也不会引起编译失败。引起编译失败。函数原型和函数定义在返回类型、函数名和函数原型和函数定义在返回类型、函数名和参数表上必须一致,否则会产生编译错误;如果参数表上必须一致,否则会产生编译错误;如果函数原型不正确,编译器也会及时报告错误。函数原型不正确,编译器也会及时报告错误。7/28/202426例例6.56.5、改写例、改写例6.26.2、程序一、程序一#include #include using namespace std;using namespace std;void main()void main() const const intint m=8

23、; m=8;intint fa(intfa(int n); n);/intint fa(intfa(int););for(intfor(int sum=0,i=1;i=m;i+) sum=0,i=1;i=m;i+)sum=sum=sum+fa(isum+fa(i););7/28/202427coutcoutm=mm=mendlendl; ;coutcouts=sums=sumendlendl; ; intint fa(intfa(int n) n) for(intfor(int facfac=1,i=1;i=n;i+)=1,i=1;i=n;i+)facfac= =facfac*i;*i;ret

24、urn return facfac; ; 7/28/202428四四、变量的作用域和生存期、变量的作用域和生存期变量的作用域变量的作用域:指一个变量在程序的哪一部:指一个变量在程序的哪一部分可以使用。分可以使用。变量的生存期变量的生存期:指一个变量在计算机内存中能保:指一个变量在计算机内存中能保留的时间。留的时间。 1 1、局部变量和全局变量、局部变量和全局变量根据作用域的不同,可将程序中的变量分为根据作用域的不同,可将程序中的变量分为局部变量和全局变量。局部变量和全局变量。局部变量局部变量是在函数或分程序中说明的变量,是在函数或分程序中说明的变量,只能在本函数或分程序的范围内使用。只能在本函

25、数或分程序的范围内使用。局部变量的类型修饰是局部变量的类型修饰是auto,auto,通常都将其省略通常都将其省略7/28/202429例例6.66.6、分程序中说明的变量只能在本分程序的、分程序中说明的变量只能在本分程序的范围内使用。范围内使用。#include#include using namespace std;using namespace std;void main()void main() intint i=1; i=1; intint i=2,j=3; i=2,j=3;coutcouti=i,j=ji=i,j=jendlendl; ; coutcouti=i;i=i;/coutc

26、out,j=j;,j=j;coutcoutendlendl; ; 7/28/202430例例6.76.7、函数中说明的变量只能在本函数内使用、函数中说明的变量只能在本函数内使用#include#include using namespace std;using namespace std;intint add( ); add( );void main()void main() intint a=2,b=3,c; a=2,b=3,c;c=add();c=add(); coutcoutc=cc=cendlendl; ; intint add( ) add( ) /错误错误: a: a和和b b未定

27、义未定义 intint x,y; x,y;x=a,y=b; x=a,y=b; return x+y;return x+y; 7/28/202431例例6.86.8、函数中说明的变量只能在本函数内使用、函数中说明的变量只能在本函数内使用#include#include using namespace std;using namespace std;intint add(int,intadd(int,int););intint add(intadd(int x,intx,int y) y) return x+y;return x+y; void main()void main() intint a

28、=2,b=3,c; a=2,b=3,c;c=add(a,b);c=add(a,b);coutcoutc=cc=cendlendl; ;coutcoutxyxyendlendl; ; /错误错误: x: x和和y y未定义未定义 7/28/202432一个函数可以为局部变量定义任何名字,而一个函数可以为局部变量定义任何名字,而不用担心其它函数使用过同样的名字。在函数开不用担心其它函数使用过同样的名字。在函数开始运行时,局部变量分配存储空间,函数退出时,始运行时,局部变量分配存储空间,函数退出时,局部变量随之消失。局部变量随之消失。例如:两个函数中都定义了变量例如:两个函数中都定义了变量n n,但

29、不同但不同void main( )void main( ) intint n; n; void void funcfunc( )( ) intint n; n; 局部变量在定义时若未没有初始化,则其值局部变量在定义时若未没有初始化,则其值是不确定。是不确定。7/28/202433全局变量全局变量说明于所有函数之外,可以为本源说明于所有函数之外,可以为本源程序文件中位于该全局变量说明之后的所有函数程序文件中位于该全局变量说明之后的所有函数共同使用。共同使用。全局变量通常在程序顶部定义,也可以在程全局变量通常在程序顶部定义,也可以在程序中间的任何地方定义,但要定义在任何函数之序中间的任何地方定义,

30、但要定义在任何函数之外。外。全局变量在定义时,若未对它设置初始值全局变量在定义时,若未对它设置初始值(作初始化),则会由系统自动初始化为(作初始化),则会由系统自动初始化为0 0值。值。若某函数修改了一全局变量的值,则其它所若某函数修改了一全局变量的值,则其它所有函数再用到该全局变量时,取得的值是修改后有函数再用到该全局变量时,取得的值是修改后的值。的值。7/28/202434全局变量一旦定义后,就可在其后的所有程全局变量一旦定义后,就可在其后的所有程序中使用,但全局变量定义之前的所有函数定义,序中使用,但全局变量定义之前的所有函数定义,将不会认识该变量。如右上程序,编译出错。将不会认识该变量

31、。如右上程序,编译出错。intint n=5; n=5; /全局变量全局变量void main()void main() int int m=n;m=n; void void funcfunc()() int int s;s;n=s;n=s; void main()void main() int int m=n;m=n; intint n=5; n=5; /全局变量全局变量void void funcfunc()() int int s=3;s=3;n=s;n=s; 7/28/202435当函数内有与全局变量同名的局部变量时,当函数内有与全局变量同名的局部变量时,则局部变量起作用,全局变量被屏

32、蔽则局部变量起作用,全局变量被屏蔽. .例例6.96.9、#include#include using namespace std;using namespace std;intint a=1,b=2; a=1,b=2;/定义全局变量定义全局变量void func1(int void func1(int a,inta,int b) b) intint t;t=a;a=b;b=t; t;t=a;a=b;b=t; intint func2(int func2(int x,intx,int y) y) intint a; a;a=x+y; return a;a=x+y; return a; 7/28

33、/202436void main()void main() func1(a,b);func1(a,b);coutcout调用调用func1func1后后 a=a=a,b=ba,b=bendlendl; ;func2(a,b);func2(a,b);coutcout调用调用func2func2后后 a=a=a,b=ba,b=bendlendl; ; 7/28/202437例例6.106.10、编写一交换两个整型变量值的函数,并、编写一交换两个整型变量值的函数,并写一主函数测试。写一主函数测试。程序:程序:#include#include using namespace std;using nam

34、espace std;intint a=1,b=2; a=1,b=2;/定义全局变量定义全局变量void swap( )void swap( ) intint t; t;t=a,a=b,b=t;t=a,a=b,b=t; 7/28/202438void main( )void main( ) coutcout交换前交换前: a=a,b=b: a=a,b=bendlendl; ;swap( );swap( );coutcout交换后交换后: a=a,b=b: a=a,b=bendlendl; ; 输出输出交换前交换前: a=1: a=1,b=2b=2交换后交换后: a=2: a=2,b=1b=1/

35、交换成功交换成功7/28/2024392、自动变量和静态变量、自动变量和静态变量自动变量自动变量: :随函数调用或分程序运行而生成,随函数调用或分程序运行而生成,随函数调用结束或分程序运行结束而消失的变量。随函数调用结束或分程序运行结束而消失的变量。系统不会对自动变量自动作初始化,如果程系统不会对自动变量自动作初始化,如果程序中不对它作显式初始化,那么,其值是不确定序中不对它作显式初始化,那么,其值是不确定的。的。对自动数组也和自动变量一样。对自动数组也和自动变量一样。但数组在定义时若对其中某些元素赋了初值,但数组在定义时若对其中某些元素赋了初值,则其它未赋初值的元素将自动设置为则其它未赋初值

36、的元素将自动设置为0.0.7/28/202440静态变量:自定义开始生成,直到整个程序静态变量:自定义开始生成,直到整个程序运行结束才消失的变量。所有的全局变量都是静运行结束才消失的变量。所有的全局变量都是静态变量。态变量。静态局部变量:只能在其定义的函数或分程静态局部变量:只能在其定义的函数或分程序中使用,函数结束时,静态局部变量不会消失,序中使用,函数结束时,静态局部变量不会消失,每次进入该函数或分程序时,也不会为它重新分每次进入该函数或分程序时,也不会为它重新分配存储单元。只有到整个程序运行结束时,静态配存储单元。只有到整个程序运行结束时,静态局部变量才会消失。局部变量才会消失。静态局部

37、变量的定义:在局部变量定义前加静态局部变量的定义:在局部变量定义前加上关键字上关键字static,static,则定义成了静态局部变量。则定义成了静态局部变量。如:如: static static intint a=1; a=1;static double b=1.5;static double b=1.5;7/28/202441#include#include using namespace std;using namespace std;void void add(int,intadd(int,int););void main()void main() intint a=2,b=3; a=

38、2,b=3;add(a,b);add(a,b);coutcoutccendlendl; ;/错误:错误:c c未定义未定义 void void add(intadd(int x,intx,int y) y) static static intint c; c;c=x+y;c=x+y; 7/28/202442#includevoid main() for(int i=1;i5;i+)double a=5.5;a=a+i;couta ;coutendl; /输出结果6.5 7.5 8.5 9.5静态局部变量的定义语句仅在第一次执行时静态局部变量的定义语句仅在第一次执行时有效,以后再执行时不再有效。

39、静态局部变量在定有效,以后再执行时不再有效。静态局部变量在定义时,若未对它作显式初始化,则会由系统自动初义时,若未对它作显式初始化,则会由系统自动初始化为始化为0 0值。值。#includevoid main() for(int i=1;i5;i+)static double a=5.5;a=a+i;couta ;coutendl;/输出结果6.5 8.5 11.5 15.57/28/202443例例6.126.12、计算、计算1!+2!+3!+1!+2!+3!+m!+m!#include #include using namespace std;using namespace std;int

40、int fa(intfa(int n) n) static static intint facfac=1;=1;/ / 改为改为intint facfac=1;=1;? ?facfac= =facfac*n;*n;return return facfac; ; void main()void main() const const intint m=8; m=8;for(intfor(int sum=0,i=1;i=m;i+) sum=0,i=1;i=m;i+)sum=sum=sum+fa(isum+fa(i););coutcoutm=mm=mendlendl; ;coutcouts=sums=

41、sumendlendl; ; /s=46233/s=462337/28/202444五、其它类型变量五、其它类型变量寄存器寄存器变量变量: : 存放在存放在CPUCPU寄存器中的寄存器中的变量。变量。如:如:register register intint code; code;外部外部变量变量: : 其它程序文件中定义其它程序文件中定义的的变量。变量。如:如:extern extern intint feifei; ;externextern声明的变量不分配存储单元。声明的变量不分配存储单元。7/28/2024456.4、函数调用过程中的参数传递函数调用过程中的参数传递调用函数时,一般要向被

42、调用的函数传递一调用函数时,一般要向被调用的函数传递一些数据值,也就是说要求给出实参表,同样被调些数据值,也就是说要求给出实参表,同样被调用的函数也可能要向其调用者返回一些数据,这用的函数也可能要向其调用者返回一些数据,这些数据主要是通过函数的参数与函数的返回值来些数据主要是通过函数的参数与函数的返回值来传递的,这一过程也即为函数间参数的传递过程。传递的,这一过程也即为函数间参数的传递过程。在调用一个带有参数的函数时,就存在一个在调用一个带有参数的函数时,就存在一个实参与形参结合方式的问题,即参数的传递方式实参与形参结合方式的问题,即参数的传递方式问题问题,C+,C+中实参与形参有三种结合方式

43、:中实参与形参有三种结合方式:值调用、地址调用和引用调用。值调用、地址调用和引用调用。7/28/202446XN被调函数:被调函数:主调函数:主调函数:3 2.5AD = power(A,3) 2.53double power(double X, int N)1 1、值调用、值调用值调用时先计算表达式的值,再赋值给形参。值调用时先计算表达式的值,再赋值给形参。因此调用是将实参拷贝一个副本给形参,然后执因此调用是将实参拷贝一个副本给形参,然后执行函数体,在执行过程中,形参可以被改变,但行函数体,在执行过程中,形参可以被改变,但不会影响调用函数的实参值,即调用过程中实参不会影响调用函数的实参值,即

44、调用过程中实参向形参传值具有单向性,是单向传递。向形参传值具有单向性,是单向传递。7/28/202447例例6.136.13、输入两个数,并输出其中较大的数、输入两个数,并输出其中较大的数程序一:程序一:#include#include using namespace std;using namespace std;void main( )void main( ) intint a,b,c; a,b,c;intint max(intmax(int x,intx,int y); y);coutcoutPlease Enter a and b :;ab;ab;c=max(a,b);c=max(a,

45、b);coutcoutmax=cmax=cy)if (xy)z=x;z=x;elseelsez=y;z=y;return (z);return (z); 7/28/202449程序二:程序二:#include#include using namespace std;using namespace std;void main()void main() intint a,b,c; a,b,c;intint max(intmax(int a,inta,int b); b);coutcoutPlease Enter a and b :;ab;ab;7/28/202450c=max(a,b);c=max

46、(a,b);coutcoutmax=cmax=cb?a:b;return ab?a:b; 7/28/202451例例6.146.14、编写一交换两个整型变量值的函数,并、编写一交换两个整型变量值的函数,并写一主函数测试。写一主函数测试。程序一:(交换不成功)程序一:(交换不成功)#include#include using namespace std;using namespace std;void void swap(intswap(int x,intx,int y) y) intint t; t;t=x,x=y,y=t;t=x,x=y,y=t; void main()void main()

47、 intint a=1,b=2; a=1,b=2;coutcout交换前交换前:a=a,b=b:a=a,b=bendlendl; ;swap(a,b);swap(a,b);coutcout交换后交换后:a=a,b=b:a=a,b=bendlendl;7/28/202452程序二:程序二: (交换不成功)(交换不成功)#include#include using namespace std;using namespace std;void main( )void main( ) intint a=1,b=2; a=1,b=2;void void swap(intswap(int a,inta,i

48、nt b); b);coutcout交换前交换前: a=a,b=b: a=a,b=bendlendl; ;swap(a,b);swap(a,b);coutcout交换后交换后: a=a,b=b: a=a,b=bendlendl; ; void void swap(intswap(int a,inta,int b) b) intint t; t;t=a,a=b,b=t;t=a,a=b,b=t; 7/28/202453程序三:程序三: (交换不成功)(交换不成功)#include#include using namespace std;using namespace std;void main()

49、void main() intint a=1,b=2; a=1,b=2;intint swap(intswap(int a,inta,int b); b);coutcout交换前交换前: a=a,b=b: a=a,b=bendlendl; ;swap(a,b);swap(a,b);coutcout交换后交换后: a=a,b=b: a=a,b=bendlendl; ; 7/28/202454intint swap(intswap(int a,inta,int b) b) intint t;t=a,a=b,b=t;return a;/return b t;t=a,a=b,b=t;return a;

50、/return b值调用的特点好处:减少了调用函数与被调值调用的特点好处:减少了调用函数与被调用函数之间的数据依赖,增强了函数自身的独立用函数之间的数据依赖,增强了函数自身的独立性。性。缺点:被调用函数向调用函数传递的数据仅缺点:被调用函数向调用函数传递的数据仅有一个返回值,有时显得不够用。有一个返回值,有时显得不够用。7/28/2024552 2、地址调用、地址调用( (传址调用传址调用) )调用时给出的实参是变量的地址值,而形参调用时给出的实参是变量的地址值,而形参一般为指针变量,这种方式通过间接访问可以改一般为指针变量,这种方式通过间接访问可以改变实参变量所指向的值。变实参变量所指向的值

51、。数组作为函数参数数组作为函数参数数组作为函数参数时的函数调用实质上是地数组作为函数参数时的函数调用实质上是地址调用址调用, ,实参传送的是数组的首地址实参传送的是数组的首地址( (数组名数组名) ),形参可以是数组或引用,实参和形参共用内存中形参可以是数组或引用,实参和形参共用内存中的同一个数组(存储单元相同),的同一个数组(存储单元相同),对形参数组的对形参数组的改变会直接影响到实参数组改变会直接影响到实参数组,因此数组元素的各,因此数组元素的各种操作都可以通过调用函数来实现。种操作都可以通过调用函数来实现。7/28/202456数组作为函数参数时,一般要同时传送数组数组作为函数参数时,一

52、般要同时传送数组元素的个数。元素的个数。例例6.156.15、将键盘输入的将键盘输入的1010个数按从小到大的方式个数按从小到大的方式排序并输出,要求排序由子函数实现排序并输出,要求排序由子函数实现。 算法分析:可使用选择法来进行算法分析:可使用选择法来进行排序排序。先将先将1010个数中的最小的数与第个数中的最小的数与第1 1个数对调,再个数对调,再将后面将后面9 9个数中的最小的数与第个数中的最小的数与第2 2个数对调,个数对调,每比较一轮,找出一个未经排序的数中最小的,每比较一轮,找出一个未经排序的数中最小的数与相应位置的数对调。数与相应位置的数对调。7/28/202457void so

53、rt(double a ,void sort(double a ,intint n) n) intint i,j; i,j; double temp;double temp; for(i=0;in-1;i+) for(i=0;in-1;i+) for(j=i+1;jn;j+) for(j=i+1;jaj) if(aiaj) temp=ai;ai=aj;aj=temp; temp=ai;ai=aj;aj=temp; #include#include using namespace std;using namespace std;#include #include 7/28/202458void

54、main(void)void main(void) const const intint N=10; N=10; intint i;double aN; i;double aN; coutcout输入需排序的输入需排序的NN个数:个数:endlendl; ; for(i=0;iN;i+) for(i=0;iai;ai; sort(a,N); sort(a,N); coutcout排序后的排序后的NN个数为个数为:endlendl; ; for(i=0;iN;i+) for(i=0;iN;i+) coutcoutsetw(8)ai;setw(8)ai; 7/28/202459例例6.166.16

55、、主函数中初始化一个矩阵并将每个元素、主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。返回主函数之后输出各行元素的和。程序:程序:#include#include using namespace std;using namespace std;void RowSum(int A 4, int nrow)void RowSum(int A 4, int nrow) for (int i=0; inrow; i+)

56、for (int i=0; inrow; i+)for(int j=1; j4; j+)for(int j=1; j4; j+)Ai0+=Aij;Ai0+=Aij; 7/28/202460void main(void)void main(void) int Table34= int Table34= 1,2,3,4,2,3,4,5,3,4,5,6;1,2,3,4,2,3,4,5,3,4,5,6;for (int i=0; i3; i+)for (int i=0; i3; i+) for (intfor (int j=0; j4; j+)j=0; j4; j+)coutTableij ;cout

57、Tableij ;coutendl;coutendl; RowSum(Table,3);RowSum(Table,3); for (i=0; i3; i+)for (i=0; i3; i+) coutSum of row icoutSum of row i is is Tablei0endl;Tablei0endl; 7/28/202461数组元素作实参,与单个变量一样数组元素作实参,与单个变量一样, ,不会改变不会改变数组元素的值。如:数组元素的值。如:#include#include using namespace std;using namespace std;void main()vo

58、id main() intint a2=0,1; a2=0,1;void void add(int,intadd(int,int););add(a0,a1);add(a0,a1);coutcouta0a0endlendl; ; void void add(intadd(int x,intx,int y) y) x=x+y; x=x+y; /运行后输出结果仍为运行后输出结果仍为0 07/28/2024623.3.引用调用引用调用引用实际上是某一变量的别名,要用另一个引用实际上是某一变量的别名,要用另一个变量或对象的名字初始化它。从建立之后,引用变量或对象的名字初始化它。从建立之后,引用作为目标对

59、象的别名使用,对引用的改动实际上作为目标对象的别名使用,对引用的改动实际上就是目标对象的改动。就是目标对象的改动。引用是通过引用运算符引用是通过引用运算符& &来声明,如:来声明,如:intint i,&refii,&refi=i;=i;/建立了一个对整型变建立了一个对整型变量量i i的引用的引用建立之后,建立之后,refirefi就是变量就是变量i i的一个别名,的一个别名,i i与与引用引用refirefi代表的是同一变量,对代表的是同一变量,对refirefi的操作就是的操作就是对变量对变量i i的操作。的操作。7/28/202463 如:如:intint i=100,&refi=i;

60、i=100,&refi=i; refirefi+=100;+=100;/结果是变量结果是变量i i的值变成的值变成200200引用不是值,不占存储空间,声明引用时,引用不是值,不占存储空间,声明引用时,目标对象的存储状态不会改变。引用在声明时必目标对象的存储状态不会改变。引用在声明时必须被初始化。须被初始化。 用引用传递函数参数用引用传递函数参数传递引用给函数时,传递的是原来的变量或传递引用给函数时,传递的是原来的变量或对象,而不是传递变量或对象的副本给函数内的对象,而不是传递变量或对象的副本给函数内的形参。形参。7/28/202464例例6.176.17、编写交换两个整型变量值的函数。、编写

61、交换两个整型变量值的函数。 #include#include using namespace std;using namespace std;void void swap(int&,intswap(int&,int&);&);void main()void main() intint x=1,y=2; x=1,y=2;coutcout交换前交换前:x=x,y=y:x=x,y=yendlendl; ;swap(x,y);swap(x,y);coutcout交换后交换后:x=x,y=y:x=x,y=y1n1 /递归公式递归公式1!=11!=1n=1n=1 /终止条件终止条件7/28/202466设

62、求阶乘的递归函数为设求阶乘的递归函数为fafa( ),( ),则递归条件也则递归条件也可写成:可写成:fa(nfa(n)=n*fa(n-1);)=n*fa(n-1);n1n1 /递归公式递归公式fa(1)=1;fa(1)=1;n=1n=1 / /终止条件终止条件由上面条件,递归函数由上面条件,递归函数fafa( )( )可定义成:可定义成:intint fa(intfa(int n) n) if(n=1)if(n=1) return 1;return 1;return n*fa(n-1);return n*fa(n-1); / /函数自调用函数自调用 7/28/202467大多数递归函数都能用

63、非递归函数来代替,大多数递归函数都能用非递归函数来代替,递归函数能简化程序设计,使程序易读。但系统递归函数能简化程序设计,使程序易读。但系统开销很大,相应的非递归函数虽然效率高,但却开销很大,相应的非递归函数虽然效率高,但却比较难编程,而且相对来说可读性差。比较难编程,而且相对来说可读性差。递归函数不能无终止条件,否则造成无限递递归函数不能无终止条件,否则造成无限递归。下面的函数无条件调用自己归。下面的函数无条件调用自己, ,造成无限递归造成无限递归, ,最终出错。最终出错。void void count(intcount(int valval) ) count(val-1);count(va

64、l-1); /无限递归无限递归if(valif(val1)1)/无法执行到此语句无法执行到此语句coutcout“OK!OK!”valvalendlendl; ; 7/28/202468例例6.186.18、用递归方法计算、用递归方法计算FibonacciFibonacci数列数列#include#include using namespace std;using namespace std;intint fibonacci(intfibonacci(int n) n) intint fibofibo; ; if(n=1|n=2) if(n=1|n=2)fibofibo=1;=1; else

65、elsefibofibo=fibonacci(n-1)+fibonacci(n-2);=fibonacci(n-1)+fibonacci(n-2); return return fibofibo; ; 7/28/202469void main(void)void main(void) intint n,fibonn,fibon; ; coutcoutInput a positive integer:;n;n; fibonfibon= =fibonacci(nfibonacci(n);); coutcoutThe nThe n number of number of fibonaccifibon

66、acci is : is :fibonfibon; ; coutcoutendlendl; ; 7/28/202470例例6.196.19、用递归法计算从、用递归法计算从n n个人中选择个人中选择k k个人组成个人组成一个委员会的不同组合数。一个委员会的不同组合数。分析:分析:n n个人里选个人里选k k个人的组合数个人的组合数= =n-1n-1人中选人中选k k个人的组合数个人的组合数+ + 由由n-1n-1人中选人中选k-1k-1人的组合数人的组合数当当n=kn=k或或k=0k=0时,组合数为时,组合数为1 17/28/202471#include#include using namesp

67、ace std;using namespace std;void main(void)void main(void) intint n,k; n,k; intint comm(intcomm(int n, n, intint k); k); cincinnk;nk;coutcoutcomm(n,kcomm(n,k) ) n) if(kn)return 0;return 0;else if(n=k|k=0)else if(n=k|k=0)return 1;return 1; elseelse return comm(n-1,k)+comm(n-1,k-1) ;return comm(n-1,k)+comm(n-1,k-1) ; 7/28/202472

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号