函数和作用域PPT学习教案_第1页
函数和作用域PPT学习教案_第2页
函数和作用域PPT学习教案_第3页
函数和作用域PPT学习教案_第4页
函数和作用域PPT学习教案_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会计学1函数和作用域函数和作用域 () 函数返回值的函数返回值的类型类型第1页/共74页 () 函数的标识函数的标识第2页/共74页包括参数名和参数类型(无形参时,括号不可省)包括参数名和参数类型(无形参时,括号不可省) () 函数调用时的函数调用时的形式参数形式参数第3页/共74页 () 函数的具体实现函数的具体实现第4页/共74页 int add( int x, int y ) int z; z=x+y; return z; void nothing( ) 第5页/共74页 函数定义在后、调用在先,调用前必须说明函数定义在后、调用在先,调用前必须说明; 函数定义在先、调用在后,可以不加说明

2、;函数定义在先、调用在后,可以不加说明; 复杂调用中,常在程序头对所有被调用函数复杂调用中,常在程序头对所有被调用函数 一次性说明。一次性说明。 () ;例:例:int add(int x, int y);原型说明原型说明第6页/共74页 #include void fun1( ), fun2( ), fun3( ); void main( ) cout“It is in main.”endl; fun2( ); cout“It is back in main.”endl; void fun1( ) cout“It is in fun1.”endl; fun3( ); cout“It is b

3、ack in fun1.”endl; void fun2( ) cout“It is in fun2.”endl; fun1( ); cout“It is back in fun2.”endl; void fun3( ) cout“It is in fun3.”endl; 第7页/共74页()void main( ) int a=3; int b=5; int c=add(a,b); /实参与形参个数相等,类型相同实参与形参个数相等,类型相同实参实参函数调用表达式的值是函数调用表达式的值是函数的返回值函数的返回值;函数调用表达式的类型是函数调用表达式的类型是函数的类型函数的类型;v 函数调用通

4、过一个表达式实现:函数调用通过一个表达式实现: 第8页/共74页return ; 或或 return;v 函数的返回值通过函数的返回值通过实现实现1)的值作为函数的返回值;的值作为函数的返回值;2)的类型自动转换为函数类型;的类型自动转换为函数类型;3)程序执行的控制权转向调用函数;程序执行的控制权转向调用函数;注:无返回值的函数用注:无返回值的函数用“void”说明类型!说明类型!第9页/共74页1. 传值调用传值调用将实参值拷贝一个副本给对应的形参将实参值拷贝一个副本给对应的形参;形参值的改变不影响实参!形参值的改变不影响实参!实参实参:常量、变量值或表达式值:常量、变量值或表达式值形参形

5、参:变量:变量变量的两种值:变量的两种值:变量本身值变量本身值和和变量地址值变量地址值;传值调用分为:传值调用分为:传值调用传值调用和和传址调用传址调用;第10页/共74页例例4.3 #include void swap1(int x, int y) int temp; temp=x; x=y; y=temp; /形参值交换形参值交换 cout“x=”x“y=”yendl; void main( ) int a(5), b(9); swap1(a, b); cout“a=”a“b=”bendl; a=5, b=9x=9, y=5第11页/共74页将实参的地址值赋给对应的形参指针,使将实参的地址

6、值赋给对应的形参指针,使形参指针指向实参;形参指针指向实参;通过改变形参所指向的变量值来影响实参通过改变形参所指向的变量值来影响实参!实参实参:地址值(指针):地址值(指针)形参形参:指针:指针 2. 传址调用传址调用一、函数的传值调用一、函数的传值调用 1. 传值调用传值调用第12页/共74页例例4.4 #include void swap2(int *x, int *y) int temp; temp=*x; *x=*y; *y=temp; /形参指针所指向的变量值交换形参指针所指向的变量值交换 cout“x=”*x“y=”*yendl; void main( ) int a(5), b(

7、9); swap2(&a, &b); cout“a=”a“b=”bendl; a=9, b=5x=9, y=5第13页/共74页将实参变量名赋给对应的形参引用,相当将实参变量名赋给对应的形参引用,相当于在被调用函数中使用了实参的别名于在被调用函数中使用了实参的别名;通过改变引用来通过改变引用来直接直接改变对应的实参值改变对应的实参值;引用调用比传址调用更直接。引用调用比传址调用更直接。形参形参:引用引用实参实参:变量名变量名q引用是引用是变量的别名变量的别名q对引用的操作就是对被引用的变量的操作对引用的操作就是对被引用的变量的操作第14页/共74页例例4.5 #include

8、void swap3(int &x, int &y) int temp; temp=x; x=y; y=temp; /形参引用值交换形参引用值交换 cout“x=”x“y=”yendl; void main( ) int a(5), b(9); swap3(a, b); cout“a=”a“b=”bendl; a=9, b=5x=9, y=5形参形参:引用引用实参实参:变量变量第15页/共74页C+没有规定函数调用时实参的求值顺序没有规定函数调用时实参的求值顺序,各编译器自行规定;,各编译器自行规定;当实参表达式中带有副作用的运算符时,当实参表达式中带有副作用的运算符时,可能产

9、生由于求值顺序不同而造成的二义可能产生由于求值顺序不同而造成的二义性;性;第16页/共74页 例例4.6 #include int add(int x, int y) return x+y; void main( ) int x(4), y(6); int z=add(+x, x+y); coutzendl; int t=+x; int z=add(t, x+y);第17页/共74页1.C+允许在允许在函数说明函数说明或或定义定义时为形参指定时为形参指定默认值;默认值;2.按按从右至左的顺序从右至左的顺序设置参数的默认值;设置参数的默认值;3.函数调用,实参与形参结合时:函数调用,实参与形参结

10、合时:a)若实参数目不足若实参数目不足,则使用形参默认值则使用形参默认值;b)若给定实参值,则使用给定的实参值。若给定实参值,则使用给定的实参值。第18页/共74页例例4.7 #include void fun(int a=1, int b=3, int c=5) couta=a,b=b,c=cendl; void main( ) fun( ); fun(7); fun(7, 9); fun(7, 9, 11);a=1, b=3, c=5a=7, b=3, c=5a=7, b=9, c=5a=7, b=9, c=11默认值默认值函数定义函数定义第19页/共74页例例4.8#include in

11、t m(8); int add_int(int x, int y=7, int z=m); void main( ) int a(5), b(15), c(20); int s=add_int(a, b); coutsendl; int add_int(int x, int y, int z) return x+y+z; 函数声明函数声明函数定义函数定义28第20页/共74页1) 按按自右至左的顺序自右至左的顺序设置参数的默认值设置参数的默认值;2) 默认参数默认参数在函数声明中提供在函数声明中提供;3) 既有函数声明又有函数定义时,定义既有函数声明又有函数定义时,定义中不允许默认参数;中不允

12、许默认参数; 例例4.84) 如果只有函数定义,默认参数才可以如果只有函数定义,默认参数才可以出现在函数定义中。出现在函数定义中。 例例4.7v 设置参数默认值应注意的问题设置参数默认值应注意的问题:第21页/共74页#includeint a8=1, 3, 5, 7, 9, 11, 13;void fun(int b , int n) for( int i=0; in- -1; i+ ) b7+=bi; void main( ) int m=8; fun(a, m); couta7endl;例例4.949实参实参形参形参第22页/共74页#includeint a8=1, 3, 5, 7,

13、9, 11, 13;void fun(int *pa, int n) /指针指针pa指向实参数组指向实参数组 for(int i=0; in-1; i+) *(pa+7)+=*(pa+i);void main() int m=8; fun(a, m); couta7endl;例例4.1049实参实参第23页/共74页#includetypedef int array8;/ int a8=1, 3, 5, 7, 9, 11, 13;array a=1, 3, 5, 7, 9, 11, 13;void fun(array &b, int n) /为实参数组起为实参数组起别名别名b for(

14、int i=0; in-1; i+) b7+=bi; /对对b操作即对实参数组操作操作即对实参数组操作void main( ) int m=8; fun(a, m); couta7endl;例例4.1149实参实参第24页/共74页1.引入内联函数是为了解决函数调用时引入内联函数是为了解决函数调用时的效率问题;的效率问题;2.编译时,编译时,用内联函数的函数体用内联函数的函数体替换替换内内联函数的调用表达式联函数的调用表达式(一般函数在运(一般函数在运行时被调用);行时被调用);3.内联函数是以目标代码的增加为代价内联函数是以目标代码的增加为代价来换取时间的节省。来换取时间的节省。第25页/共

15、74页 inline () #include inline int power(int x) return (x)*(x); void main( ) for(int i=1; i=10; i+) int p=power(i); couti“*”i“=”pendl; 例例4.12第26页/共74页1. 内联函数的内联函数的定义定义必须必须出现在出现在内联函内联函数数第一次被调用第一次被调用前前;2. 内联函数体内内联函数体内不允许不允许用用循环语句循环语句和和开关语句开关语句;3. 类结构中所有在类说明内部定义的类结构中所有在类说明内部定义的函数都是内联函数。函数都是内联函数。v 使用内联函数

16、时应注意:使用内联函数时应注意:第27页/共74页 函数重载是指函数重载是指同一函数名同一函数名对应对应多个函数多个函数实现实现; 函数重载时,要求同名函数在函数重载时,要求同名函数在参数个数参数个数上不同,上不同,或或参数类型上不同参数类型上不同; 函数调用时,系统函数调用时,系统根据根据调用函数的调用函数的实参实参情况选择某个函数实现情况选择某个函数实现。第28页/共74页 #include int add(int, int); double add(double, double); void main( ) coutadd(5, 10)endl; coutadd(5.0, 10.5)en

17、dl; int add(int x, int y) return x+y; double add(double a, double b) return a+b; 例例4.13第29页/共74页 #include 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); void main( ) coutmin(5, 4, 9)endl; coutmin(- -2, 0)endl; 例例4.14第30页/共74页 main函函数数调用调用a函数函数结束

18、结束 b函数函数 a函数函数调用调用b函数函数q在调用一个函数的过程中,又调用另一个函在调用一个函数的过程中,又调用另一个函数数第31页/共74页#includeconst int k=4, n=6;int sum(int k,int n), powers(int m,int n);void main( ) coutsum(k, n)endl;int sum(int k, int n) /求求n个数的个数的k次幂之和次幂之和 for(int i=1,sum=0; i=n; i+) sum+=powers(i,k); return sum;int powers(int i, int k) /求求

19、i的的k次幂次幂 for(int j=1,p=1; j=k; j+) p*=i; return p;第32页/共74页调用一个函数的过程中又调用一个函数的过程中又直接直接或或间接间接地地调调用该函数自身用该函数自身;1. 含义含义2. 特点特点1)每次分解出的每次分解出的新问题是原问题的简化新问题是原问题的简化的子问题;的子问题;2)最终分解出最终分解出的新问题是一个的新问题是一个已知解已知解;3)程序简洁清晰,可读性强;程序简洁清晰,可读性强;第33页/共74页3. 过程过程q回归回归:从已知条件出发,:从已知条件出发,逐一求值回归逐一求值回归, 最终达递推开始处;最终达递推开始处;q递推递

20、推:原问题不断:原问题不断分解为新的子问题分解为新的子问题, 最终达递归结束条件最终达递归结束条件( (已知已知) );0!=1(已知已知)3!=3*2!2!=2*1!1!=1*0!递推递推递推递推递推递推1!=1*1=12!=2*1!=2*1=23!=3*2!=3*2=6回归回归回归回归回归回归例:例:第34页/共74页 #include long int fac(int n); void main( ) int n; coutn; long fa=fac(n); coutn!=faendl; long int fac(int n) long int p; if(n=0) p=1; else

21、 p=n*fac(n- -1); return p; 第35页/共74页 #include const int N=8; long fibo(int n); void main( ) long f=fibo(N); coutfendl; long fibo(int n) if(n=1) return 0; else if(n=2) return 1; else return fibo(n- -1)+fibo(n- -2); 第36页/共74页1.标识符只能标识符只能在在其其说明或定义的范围内可说明或定义的范围内可见见,在该范围之外不可见!,在该范围之外不可见!2.“可见可见”即可以进行即可以进

22、行存取存取或或访问访问;3.标识符的标识符的说明和定义不完全一样说明和定义不完全一样;4.定义一个标识符总是在一定范围内定义定义一个标识符总是在一定范围内定义的,作用范围有大有小的,作用范围有大有小 ;第37页/共74页1. 程序级程序级(项目级最大)(项目级最大)作用域:作用域:组成程序的所有文件组成程序的所有文件;包括:包括:外部变量外部变量和和外部函数外部函数;2. 文件级文件级作用域:作用域:定义该标识符的文件内定义该标识符的文件内;包括:包括:外部静态类变量外部静态类变量和和内部函数内部函数;第38页/共74页3. 函数级函数级作用域:作用域:定义该标识符的函数体内定义该标识符的函数

23、体内;包括:包括:函数形参函数形参、函数内的自动类变量函数内的自动类变量、内部静态类变量内部静态类变量、语句标号语句标号;4. 块级块级(最小)(最小)定义在定义在分程序分程序中、中、if语句语句、switch语句语句中以及中以及循环体循环体中的中的自动类变量自动类变量和和内部静内部静态类变量态类变量。二、作用域的种类二、作用域的种类第39页/共74页1. 在标识符作用域的某个子范围内可以重新在标识符作用域的某个子范围内可以重新定义该标识符!定义该标识符! void fun( ) int a; /函数体内函数体内 float a; /分程序内分程序内 2. 原定义的标识符在子范围内不可见,原定

24、义的标识符在子范围内不可见,但但仍存在(暂时被隐藏);仍存在(暂时被隐藏);第40页/共74页#includevoid main( ) int a(5), b(7), c(10); couta b cendl; int b(8); float c(8.8); couta b cendl; a=b; int c=b; couta b cendl; couta b cendl; couta b cendl;5 7 105 8 8.88 8 88 8 8.88 7 10例例4.18第41页/共74页#include void main( ) int x(3); for(; x0; x-) int x

25、(5); /重新定义变量重新定义变量x, 作用域作用域: 块级块级coutx ; coutendlxendl; 5 5 5 0例例4.19第42页/共74页1. 局部变局部变量量1) 作用域:作用域:函数级函数级和和块级块级;2) 包括:包括:自动类变量自动类变量、内部静态变量内部静态变量和和函数形参函数形参;q自动类变量自动类变量 autoq寄存器类变量寄存器类变量registerv内部静态类变量内部静态类变量(static)定义在定义在函数体内函数体内或分程序内,定义时或分程序内,定义时有默认值有默认值; ;生存期长生存期长, ,可见性可见性与与存在性不一致存在性不一致( (作用域外不作用

26、域外不可见但仍存在,回到作用域仍保留原值可见但仍存在,回到作用域仍保留原值););第43页/共74页#include void other( );void main( ) int a(3); register int b(5); static int c; couta=a,b=b,c=cendl; other( ); other( );void other( ) int a(5); static int b(12); /内部静态类变量内部静态类变量 a+10; b+=20; couta=a,b=bendl; a=3, b=5, c=0 a=5, b=32 a=5, b=52第44页/共74页2

27、. 全局变量全局变量1) 作用域:作用域:程序级程序级和和文件级文件级;2) 包括:包括:外部变量外部变量和和外部静态类变量外部静态类变量;v外部变量的定义外部变量的定义 定义在函数体外定义在函数体外,定义时不加任何存储类说明;,定义时不加任何存储类说明;v外部变量的说明(声明)外部变量的说明(声明)用用说明符说明符“extern”对外部变量进行说明对外部变量进行说明使用后定义的外部变量,在使用前必须说明;使用后定义的外部变量,在使用前必须说明;在一个文件中使用另一个文件定义的外部变量,必在一个文件中使用另一个文件定义的外部变量,必须说明;须说明;一个外部变量只能定义一次,但可以说明多次。一个

28、外部变量只能定义一次,但可以说明多次。第45页/共74页int add(int a, int b) int s=a+b; return s; void main( ) extern int x, y; /外部变量说外部变量说明明 coutadd(x, y)endl; int x(20), y(5); /外部变量定外部变量定义义使用后定义的外部变量使用后定义的外部变量必须提前说明必须提前说明例:例:第46页/共74页#include void fun1( ), fun2( ), fun3( ); /函数说明函数说明int i(5); /外部变量:程序级外部变量:程序级void main( ) i

29、=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;文件:文件:main.cpp第47页/共74页#includestatic int i; /外部静态变量:文件级外部静态变量:文件级void fun1( ) i=50; coutfun1():i(static)=iendl;1)fun1():i(static)=50文件:文件:file1.cpp第48页/共74页3) fun2():i(auto)=154) fun2():i(extern)=20#includevo

30、id fun2( ) int i=15; /自动类变量:函数级自动类变量:函数级 coutfun2():i(auto)=iendl; if(i) extern int i; /声明外部变量:程序级声明外部变量:程序级 coutfun2():i(extern)=iendl; extern int i; void fun3( ) i=30; coutfun3():i(extern)=iendl; if(i) int i=10; coutfun3():i(auto)=iendl; 文件:文件:file2.cpp第49页/共74页第50页/共74页#include void fun1( ),fun2(

31、 ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl; 2)main():i=20文件:文件:main.cpp第51页/共74页#include void fun1( ),fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( )

32、; coutmain():i=iendl; fun3( ); coutmain():i=iendl;文件:文件:main.cpp第52页/共74页#include void fun1( ),fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;5)main():i=20文件:文件:main.cpp第53页/共74页#include void fun1( )

33、,fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;文件:文件:main.cpp第54页/共74页#includevoid fun2( ) int i=15; /自动类变量:函数级自动类变量:函数级 coutfun2():i(auto)=iendl; if(i) extern int i; /声明外部变量:程序级声明外部变量:程序级 coutfun2(

34、):i(extern)=iendl; extern int i; /声明外部变量:程序级声明外部变量:程序级 void fun3( ) i=30; coutfun3():i(extern)=iendl; if(i) int i=10; /自动类变量:块级自动类变量:块级 coutfun3():i(auto)=iendl; 6) fun3():i(extern)=307) fun3():i(auto)=10文件:文件:file2.cpp第55页/共74页#include void fun1( ),fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void ma

35、in( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;8)main():i=30文件:文件:main.cpp第56页/共74页#include void fun1( ),fun2( ),fun3( );int i(5); /外部变量:程序级外部变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=ie

36、ndl;8)main():i=30文件:文件:main.cpp第57页/共74页第58页/共74页第59页/共74页1. 内部函数内部函数内部函数只在定义它的文件中可用!内部函数只在定义它的文件中可用! static () 2. 外部函数外部函数extern () 外部函数的作用域是整个程序!外部函数的作用域是整个程序!第60页/共74页1.了解所用的了解所用的C+系统系统提供哪些系统函数提供哪些系统函数;2.知道某系统知道某系统函数的说明放在哪个头文件函数的说明放在哪个头文件中;中;3.调用一个函数时,要清楚其调用一个函数时,要清楚其功能功能、参数参数和和返回值返回值。第61页/共74页q调

37、用字符串处理函数时,要包含头文件调用字符串处理函数时,要包含头文件string.h1. 字符串长度函数字符串长度函数strlen( ) int strlen(const char *s);返回字符一个字符串的长度,空字符不计在内返回字符一个字符串的长度,空字符不计在内2. 字符串拷贝函数字符串拷贝函数strcpy( ) char * strcpy(char *s1, char *s2); char * strncpy(char *s1, char *s2, int n);实现字符串的复制,返回实现字符串的复制,返回s1的地址的地址第62页/共74页3. 字符串连接函数字符串连接函数strcat

38、( ) char * strcat(char *s1, char *s2); char * strncat(char *s1, char *s2, int n);4. 字符串比较函数字符串比较函数strcmp( ) int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, int n);返回值整数:大于返回值整数:大于0、等于、等于0、小于、小于0第63页/共74页 函数的定义和说明函数的定义和说明 函数的调用(函数的调用(传值传值、传址传址、引用引用) 嵌套调用和递归调用嵌套

39、调用和递归调用 函数的参数(函数的参数(默认值默认值) 内联函数(内联函数(inline) 函数重载(函数重载(参数个数、类型不同参数个数、类型不同) 作用域(作用域(4级级) C+系统函数(字符串处理函数)系统函数(字符串处理函数)第64页/共74页1.调试调试例例4.8、例例4.13,掌握参数默认值的设,掌握参数默认值的设置和函数重载;置和函数重载;2.编制程序,通过调用编制程序,通过调用引用作参数的函数引用作参数的函数,实现,实现两个字符串的交换。两个字符串的交换。测试:测试:char a50=“hello”; char b50=“how are you”;3.编写程序验证编写程序验证哥德巴赫猜想哥德巴赫猜想:任何一个充分大:任何一个充分大的偶数的偶数(=6)总可以表示成两个素数之和。总可以表示成两个素数之和。第65页/共74页#includevoid f(int j);void main( ) for(int i(1); i=4; i+) f( i );void f(int j) static int a(10); /内部静态类变量内部静态类变量 int b(1); /自动类变量自动类变量 b+; couta+b+j=a+b+jendl; a+=10;三三(3)10 + 2 + 1 = 1320 + 2 + 2 = 2430 + 2 +

温馨提示

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

评论

0/150

提交评论