《四章函数和作用域学习教案》由会员分享,可在线阅读,更多相关《四章函数和作用域学习教案(75页珍藏版)》请在金锄头文库上搜索。
1、会计学1四章函数四章函数(hnsh)和作用域和作用域第一页,共75页。4.1 4.1 函数函数(hnsh)(hnsh)的的定义和说明定义和说明一、函数一、函数(hnsh)(hnsh)的定义的定义 () 函数返回值的函数返回值的类型类型第1页/共74页第二页,共75页。4.1 4.1 函数的定义函数的定义(dngy)(dngy)和说明和说明一、函数一、函数(hnsh)(hnsh)的定义的定义 () 函数的标识函数的标识第2页/共74页第三页,共75页。4.1 4.1 函数的定义函数的定义(dngy)(dngy)和说明和说明一、函数一、函数(hnsh)(hnsh)的定义的定义包括参数名和参数类型包
2、括参数名和参数类型(lixng)(无形参时,括号不可省)(无形参时,括号不可省) () 函数调用时的函数调用时的形式参数形式参数第3页/共74页第四页,共75页。4.1 4.1 函数的定义函数的定义(dngy)(dngy)和说明和说明一、函数一、函数(hnsh)(hnsh)的定义的定义 () 函数的具体实现函数的具体实现第4页/共74页第五页,共75页。例:例: int add( int x, int y ) int z; z=x+y; return z; void nothing( ) 第5页/共74页第六页,共75页。二、函数的说明二、函数的说明(shumng)(shumng)(声明)(声
3、明) 函数定义在后、调用在先,调用前必须说明;函数定义在后、调用在先,调用前必须说明; 函数定义在先、调用在后,可以不加说明;函数定义在先、调用在后,可以不加说明; 复杂复杂(fz)调用中,常在程序头对所有被调用调用中,常在程序头对所有被调用函数函数 一次性说明。一次性说明。 () ;例:例:int add(int x, int y);原型原型(yunxng)说明说明第6页/共74页第七页,共75页。 例例例例4.24.2 #include void fun1( ), fun2( ), fun3( ); void main( ) cout“It is in main.”endl; fun2(
4、); cout“It is back in main.”endl; void fun1( ) cout“It is in fun1.”endl; fun3( ); cout“It is back 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页第八页,共75页。4.2 4.2 函数函数(hnsh)(hnsh)的的调用调用()void main( ) int a=3
5、; int b=5; int c=add(a,b); /实参与形参个数相等,类型实参与形参个数相等,类型(lixng)相同相同实参实参函数调用表达式的值是函数调用表达式的值是 函数的返回值函数的返回值;函数调用表达式的类型是函数调用表达式的类型是 函数的类型函数的类型 ;v 函数调用通过一个表达式实现:函数调用通过一个表达式实现: 第8页/共74页第九页,共75页。return ; 或或 return;v 函数函数(hnsh)的返回值通过返回语句实现的返回值通过返回语句实现1)的值作为函数的值作为函数(hnsh)的返回值;的返回值;2)的类型自动转换为函数的类型自动转换为函数(hnsh)类型;
6、类型;3)程序执行的控制权转向调用函数程序执行的控制权转向调用函数(hnsh);注:无返回值的函数用注:无返回值的函数用“void”说明说明(shumng)类型!类型!第9页/共74页第十页,共75页。一、函数一、函数一、函数一、函数(hnsh)(hnsh)(hnsh)(hnsh)的传值调的传值调的传值调的传值调用用用用1. 传值调用传值调用(dioyng)将实参值拷贝一个副本给对应将实参值拷贝一个副本给对应(duyng)的形参的形参;形参值的改变不影响实参!形参值的改变不影响实参!实参实参:常量、变量值或表达式值:常量、变量值或表达式值形参形参:变量:变量变量的两种值:变量的两种值:变量本身
7、值变量本身值和和变量地址值变量地址值;传值调用分为:传值调用分为:传值调用传值调用和和传址调用传址调用;第10页/共74页第十一页,共75页。例例4.3 #include void swap1(int x, int y) int temp; temp=x; x=y; y=temp; /形参值交换形参值交换(jiohun) 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页第十二页,共75页。将实参的地址值赋给对应的形参指针,使形将实
8、参的地址值赋给对应的形参指针,使形参指针指向实参;参指针指向实参;通过通过(tnggu)(tnggu)改变形参所指向的变量值来改变形参所指向的变量值来影响实参!影响实参!实参实参:地址值(指针):地址值(指针)形参形参:指针:指针 2. 传址调用传址调用(dioyng)一、函数一、函数(hnsh)的传值调用的传值调用 1. 传值调用传值调用第12页/共74页第十三页,共75页。例例4.4 #include void swap2(int *x, int *y) int temp; temp=*x; *x=*y; *y=temp; /形参指针所指向形参指针所指向(zh xin)的变量值交换的变量值
9、交换 cout“x=”*x“y=”*yendl; void main( ) int a(5), b(9); swap2(&a, &b); cout“a=”a“b=”bendl; a=9, b=5x=9, y=5第13页/共74页第十四页,共75页。二、函数二、函数(hnsh)(hnsh)的引用调用的引用调用/C+/C+特色特色将实参变量名赋给对应将实参变量名赋给对应(duyng)的形参引用,的形参引用,相当于在被调用函数中使用了实参的别名相当于在被调用函数中使用了实参的别名;通过改变引用来直接改变对应通过改变引用来直接改变对应(duyng)的实参的实参值值;引用调用比传址调用更直接。引用调用比
10、传址调用更直接。形参形参:引用引用实参实参:变量名变量名q引用是变量的别名引用是变量的别名q对引用的操作对引用的操作(cozu)就是对被引用的变量的操作就是对被引用的变量的操作(cozu)第14页/共74页第十五页,共75页。例例4.5 #include void swap3(int &x, int &y) int temp; temp=x; x=y; y=temp; /形参引用形参引用(ynyng)值交换值交换 cout“x=”x“y=”yendl; void main( ) int a(5), b(9); swap3(a, b); cout“a=”a“b=”bendl; a=9, b=5x
11、=9, y=5形参形参:引用引用(ynyng)实参实参:变量变量(binling)第15页/共74页第十六页,共75页。4.3 4.3 函数函数(hnsh)(hnsh)的的参数参数一、函数参数的求值顺序一、函数参数的求值顺序一、函数参数的求值顺序一、函数参数的求值顺序(shnx)(shnx)(shnx)(shnx)C+没有规定函数调用时实参的求值顺序,各没有规定函数调用时实参的求值顺序,各编译器自行规定;编译器自行规定;当实参表达式中带有副作用的运算符时,可能当实参表达式中带有副作用的运算符时,可能产生产生(chnshng)由于求值顺序不同而造成的由于求值顺序不同而造成的二义性;二义性;第16
12、页/共74页第十七页,共75页。 例例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页第十八页,共75页。二、设置二、设置二、设置二、设置(shzh)(shzh)(shzh)(shzh)函数参数的默认值函数参数的默认值函数参数的默认值函数参数的默认值1.C+允许在函数说明或定义时为形参指定默认允许在函数说明或定义时为形参指定默认值;值;2.按从右至左的顺序设
13、置参数的默认值;按从右至左的顺序设置参数的默认值;3.函数调用,实参与函数调用,实参与(cny)形参结合时:形参结合时:a)若实参数目不足,则使用若实参数目不足,则使用(shyng)形参形参默认值;默认值;b)若给定实参值,则使用若给定实参值,则使用(shyng)给定的给定的实参值。实参值。第18页/共74页第十九页,共75页。例例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,
14、 c=5a=7, b=3, c=5a=7, b=9, c=5a=7, b=9, c=11默认值默认值函数函数(hnsh)定义定义第19页/共74页第二十页,共75页。例例4.8#include int 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; 函数函数(hnsh)声明声明函数函数(hnsh)定定义义28第20页/共74页
15、第二十一页,共75页。1)按自右至左的顺序设置按自右至左的顺序设置(shzh)参数参数的默认值;的默认值;2)默认参数在函数声明中提供;默认参数在函数声明中提供;3)既有函数声明又有函数定义时,定义既有函数声明又有函数定义时,定义中不允许默认参数;中不允许默认参数; 例例4.84)如果只有函数定义,默认参数才可以如果只有函数定义,默认参数才可以出现在函数定义中。出现在函数定义中。 例例4.7v 设置设置(shzh)参数默认值应注意的参数默认值应注意的问题:问题:第21页/共74页第二十二页,共75页。 三、使用三、使用三、使用三、使用(shyng)(shyng)数组作函数参数数组作函数参数数组
16、作函数参数数组作函数参数 1. 1. 形参和实参都用数组形参和实参都用数组形参和实参都用数组形参和实参都用数组 #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页第二十三页,共75页。 2. 形参和实参都用指针形参和实参都用指针(zhzhn)#includeint a8=1, 3, 5, 7, 9, 11, 13;voi
17、d 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页第二十四页,共75页。 3. 实参用数组名形参用引用实参用数组名形参用引用(ynyng)#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
18、 n) /为实参数组起为实参数组起别名别名b for(int i=0; in-1; i+) b7+=bi; /对对b操作即对实参数组操作操作即对实参数组操作void main( ) int m=8; fun(a, m); couta7endl;例例4.1149实参实参第24页/共74页第二十五页,共75页。4.4 4.4 内联函数内联函数(hnsh)(hnsh)一、内联函数一、内联函数一、内联函数一、内联函数(hnsh)(hnsh)(hnsh)(hnsh)的引入的引入的引入的引入1.引入内联函数是为了解决函数调用时的引入内联函数是为了解决函数调用时的效率问题;效率问题;2.编译时,用内联函数的
19、函数体替换内联编译时,用内联函数的函数体替换内联函数的调用表达式(一般函数在运行时函数的调用表达式(一般函数在运行时被调用);被调用);3.内联函数是以目标代码的增加为代价来内联函数是以目标代码的增加为代价来换取时间换取时间(shjin)的节省。的节省。第25页/共74页第二十六页,共75页。二、内联函数二、内联函数二、内联函数二、内联函数(hnsh)(hnsh)(hnsh)(hnsh)的定义的定义的定义的定义 inline () #include inline int power(int x) return (x)*(x); void main( ) for(int i=1; i=10; i
20、+) int p=power(i); couti“*”i“=”pendl; 例例4.12第26页/共74页第二十七页,共75页。1.内联函数的定义必须出现在内联函数内联函数的定义必须出现在内联函数第一次被调用前;第一次被调用前;2.内联函数体内不允许用循环语句和开内联函数体内不允许用循环语句和开关语句;关语句;3.类结构类结构(jigu)中所有在类说明内部中所有在类说明内部定义的函数都是内联函数。定义的函数都是内联函数。v 使用内联函数使用内联函数(hnsh)时应注时应注意:意:第27页/共74页第二十八页,共75页。4.5 4.5 函数函数(hnsh)(hnsh)重重载载函数重载是指同一函数
21、重载是指同一(tngy)函数名对应多函数名对应多个函数实现;个函数实现;函数重载时,要求同名函数在参数个数上函数重载时,要求同名函数在参数个数上不同,或参数类型上不同;不同,或参数类型上不同;函数调用时,系统根据调用函数的实参情函数调用时,系统根据调用函数的实参情况选择某个函数实现。况选择某个函数实现。第28页/共74页第二十九页,共75页。一、参数类型不同一、参数类型不同(btn)(btn)的函数重的函数重载载 #include int add(int, int); double add(double, double); void main( ) coutadd(5, 10)endl; co
22、utadd(5.0, 10.5)endl; int add(int x, int y) return x+y; double add(double a, double b) return a+b; 例例4.13第29页/共74页第三十页,共75页。二、参数二、参数二、参数二、参数(cnsh)(cnsh)(cnsh)(cnsh)个数不同的函数个数不同的函数个数不同的函数个数不同的函数重载重载重载重载 #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
23、 min(t, c); void main( ) coutmin(5, 4, 9)endl; coutmin(- -2, 0)endl; 例例4.14第30页/共74页第三十一页,共75页。4.6 4.6 函数函数(hnsh)(hnsh)的嵌套的嵌套和递归调用和递归调用一、函数一、函数一、函数一、函数(hnsh)(hnsh)(hnsh)(hnsh)的嵌套调用的嵌套调用的嵌套调用的嵌套调用 main函函数数调用调用a函数函数结束结束 b函数函数 a函数函数调用调用b函数函数q在调用在调用(dioyng)一个函数的过程中,又调用一个函数的过程中,又调用(dioyng)另一个函数另一个函数第31页/
24、共74页第三十二页,共75页。 例例例例4.154.15#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) /求求i的的k次幂次幂 for(int j=1,p=1; j=k; j+) p*=i; retu
25、rn p;第32页/共74页第三十三页,共75页。二、函数二、函数二、函数二、函数(hnsh)(hnsh)(hnsh)(hnsh)的递归调用的递归调用的递归调用的递归调用调用一个函数调用一个函数(hnsh)的过程中又直接或间的过程中又直接或间接地调用该函数接地调用该函数(hnsh)自身;自身;1. 含义含义(hny)2. 特点特点1)每次分解出的每次分解出的新问题是原问题的简化新问题是原问题的简化的的子问题;子问题;2)最终分解出最终分解出的新问题是一个的新问题是一个已知解已知解;3)程序简洁清晰,可读性强;程序简洁清晰,可读性强;第33页/共74页第三十四页,共75页。3. 过程过程(guc
26、hng)q回归:从已知条件回归:从已知条件 (tiojin)(tiojin) 出发,逐一求值回归,出发,逐一求值回归,q 最终达递推开始处;最终达递推开始处;q递推:原问题递推:原问题 (wnt)(wnt)不断分解为新的子问题不断分解为新的子问题 (wnt)(wnt),q 最终达递归结束条件最终达递归结束条件 ( (已知已知) );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页第三十五页,共75页。 例例例例4.164.16 #inclu
27、de 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 p=n*fac(n- -1); return p; 第35页/共74页第三十六页,共75页。 例例例例4.174.17 #include const int N=8; long fibo(int n); void main( ) long f=fibo(N); coutfendl; long fibo(int n) if(n=1) r
28、eturn 0; else if(n=2) return 1; else return fibo(n- -1)+fibo(n- -2); 第36页/共74页第三十七页,共75页。4.7 作用域作用域一、标识符的作用域规则一、标识符的作用域规则一、标识符的作用域规则一、标识符的作用域规则(guz)(guz)(guz)(guz)1.标识符只能在其说明或定义标识符只能在其说明或定义(dngy)的范围内的范围内可见,在该范围之外不可见!可见,在该范围之外不可见!2.“可见可见”即可以进行存取或访问;即可以进行存取或访问;3.标识符的说明和定义标识符的说明和定义(dngy)不完全一样;不完全一样;4.定
29、义定义(dngy)一个标识符总是在一定范围内定一个标识符总是在一定范围内定义义(dngy)的,作用范围有大有小的,作用范围有大有小 ;第37页/共74页第三十八页,共75页。二、作用域的种类二、作用域的种类二、作用域的种类二、作用域的种类(zhngli)(zhngli)(zhngli)(zhngli)1. 程序程序(chngx)级(项目级(项目级最大)级最大)作用域:组成作用域:组成(z chn)程序的所有文件;程序的所有文件;包括:外部变量和外部函数;包括:外部变量和外部函数;2. 文件级文件级作用域:作用域:定义该标识符的文件内定义该标识符的文件内;包括:包括:外部静态类变量外部静态类变量
30、和和内部函数内部函数;第38页/共74页第三十九页,共75页。3. 函数函数(hnsh)级级作用域:定义该标识符的函数作用域:定义该标识符的函数(hnsh)体内;体内;包括:函数包括:函数(hnsh)形参、函数形参、函数(hnsh)内内的自动类变量、内部静态类变量、语句标号;的自动类变量、内部静态类变量、语句标号;4. 块级块级(最小)(最小)定义在分程序中、定义在分程序中、if语句、语句、switch语句中语句中以及以及(yj)循环体中的自动类变量和内部循环体中的自动类变量和内部静态类变量。静态类变量。二、作用域的种类二、作用域的种类第39页/共74页第四十页,共75页。三、重新三、重新三、
31、重新三、重新(chngxn)(chngxn)(chngxn)(chngxn)定义标识符作用定义标识符作用定义标识符作用定义标识符作用域域域域1. 在标识符作用域的某个子范围在标识符作用域的某个子范围(fnwi)内可以内可以重新定义该标识符!重新定义该标识符! void fun( ) int a; /函数体内函数体内(t ni) float a; /分程序内分程序内 2. 原定义的标识符在子范围内不可见,原定义的标识符在子范围内不可见,但仍但仍存在(暂时被隐藏);存在(暂时被隐藏);第40页/共74页第四十一页,共75页。#includevoid main( ) int a(5), b(7),
32、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页第四十二页,共75页。#include void main( ) int x(3); for(; x0; x-) int x(5); /重新重新(chngxn)定义变量定义变量x, 作用域作用域: 块级块级coutx ; coutendlxendl; 5 5 5 0例例
33、4.19第42页/共74页第四十三页,共75页。四、局部变量和全局变量四、局部变量和全局变量四、局部变量和全局变量四、局部变量和全局变量1. 局部变量局部变量1) 作用域:函数作用域:函数(hnsh)级和块级;级和块级;2) 包括:自动类变量、内部静态包括:自动类变量、内部静态(jngti)变量和函变量和函数形参;数形参;q自动自动(zdng)(zdng)类变量类变量autoautoq寄存器类变量寄存器类变量registerv内部静态类变量内部静态类变量(static)定义在定义在函数体内函数体内或分程序内,定义时或分程序内,定义时有默认值有默认值; ;生存期长生存期长, ,可见性可见性与与存
34、在性不一致存在性不一致( (作用域外不可作用域外不可见但仍存在,回到作用域仍保留原值见但仍存在,回到作用域仍保留原值););第43页/共74页第四十四页,共75页。 例例例例4.204.20#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); /内部静态内部静态(jngti)类变量类变量 a+10; b+=20; couta=a,
35、b=bendl; a=3, b=5, c=0 a=5, b=32 a=5, b=52第44页/共74页第四十五页,共75页。2. 全局变量全局变量1) 作用域:程序作用域:程序(chngx)级和文件级;级和文件级;2) 包括包括(boku):外部变量和外部静态:外部变量和外部静态类变量;类变量;v外部变量的定义外部变量的定义v 定义在函数体外,定义时不加任何存储定义在函数体外,定义时不加任何存储(cn ch)类说明;类说明;v外部变量的说明(声明)外部变量的说明(声明)用用说明符说明符“extern”对外部变量进行说明对外部变量进行说明使用后定义的外部变量,在使用前必须说明;使用后定义的外部变
36、量,在使用前必须说明;在一个文件中使用另一个文件定义的外部变量,必在一个文件中使用另一个文件定义的外部变量,必须说明;须说明;一个外部变量只能定义一次,但可以说明多次。一个外部变量只能定义一次,但可以说明多次。第45页/共74页第四十六页,共75页。int add(int a, int b) int s=a+b; return s; void main( ) extern int x, y; /外部变量外部变量(binling)说明说明 coutadd(x, y)endl; int x(20), y(5); /外部变量外部变量(binling)定义定义使用后定义的外部变量使用后定义的外部变量必
37、须必须(bx)提前说明提前说明例:例:第46页/共74页第四十七页,共75页。 例例例例4.214.21#include void fun1( ), fun2( ), fun3( ); /函数说明函数说明int i(5); /外部变量外部变量(binling):程序级:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;文件文件(wnjin):main.cpp第47页/共74页第四十八页,共75页。#includestatic in
38、t i; /外部外部(wib)静态变量:文件级静态变量:文件级void fun1( ) i=50; coutfun1():i(static)=iendl;1)fun1():i(static)=50文件文件(wnjin):file1.cpp第48页/共74页第四十九页,共75页。3) fun2():i(auto)= 154) fun2():i(extern)=20#includevoid fun2( ) int i=15; /自动类变量:函数级自动类变量:函数级 coutfun2():i(auto)= iendl; if(i) extern int i; /声明外部变量:程序级声明外部变量:程序
39、级 coutfun2():i(extern)= iendl; extern int i; void fun3( ) i=30; coutfun3():i(extern)=iendl; if(i) int i=10; coutfun3():i(auto)=iendl; 文件文件(wnjin):file2.cpp第49页/共74页第五十页,共75页。第50页/共74页第五十一页,共75页。 例例例例4.214.21#include void fun1( ),fun2( ),fun3( );int i(5); /外部变量外部变量(binling):程序级:程序级void main( ) i=20;
40、fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl; 2)main():i=20文件文件(wnjin):main.cpp第51页/共74页第五十二页,共75页。 例例例例4.214.21#include void fun1( ),fun2( ),fun3( );int i(5); /外部外部(wib)变量:程序级变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl;
41、fun3( ); coutmain():i=iendl;文件文件(wnjin):main.cpp第52页/共74页第五十三页,共75页。 例例例例4.214.21#include void fun1( ),fun2( ),fun3( );int i(5); /外部外部(wib)变量:程序级变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;5)main():i=20文件文件(wnjin):main.cpp第53页/共74页第五
42、十四页,共75页。 例例例例4.214.21#include void fun1( ),fun2( ),fun3( );int i(5); /外部外部(wib)变量:程序级变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;文件文件(wnjin):main.cpp第54页/共74页第五十五页,共75页。#includevoid fun2( ) int i=15; /自动类变量:函数级自动类变量:函数级 coutfun2():i
43、(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; 6) fun3():i(extern)=307) fun3():i(auto)=10文件文件(wnjin):file2.cpp第55页/共74页
44、第五十六页,共75页。 例例例例4.214.21#include void fun1( ),fun2( ),fun3( );int i(5); /外部外部(wib)变量:程序级变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;8)main():i=30文件文件(wnjin):main.cpp第56页/共74页第五十七页,共75页。 例例例例4.214.21#include void fun1( ),fun2( ),fun3(
45、 );int i(5); /外部外部(wib)变量:程序级变量:程序级void main( ) i=20; fun1( ); coutmain():i=iendl; fun2( ); coutmain():i=iendl; fun3( ); coutmain():i=iendl;8)main():i=30文件文件(wnjin):main.cpp第57页/共74页第五十八页,共75页。第58页/共74页第五十九页,共75页。第59页/共74页第六十页,共75页。五、内部函数五、内部函数(hnsh)(hnsh)和外部函数和外部函数(hnsh)(hnsh)1. 内部内部(nib)函函数数内部函数内部
46、函数(hnsh)只在定义它的文件中可用!只在定义它的文件中可用! static () 2. 外部函数外部函数extern () 外部函数的作用域是整个程序!外部函数的作用域是整个程序!第60页/共74页第六十一页,共75页。4.8 C+4.8 C+的系统的系统(xtng)(xtng)函数函数一、一、一、一、C+C+C+C+系统函数系统函数系统函数系统函数(hnsh)(hnsh)(hnsh)(hnsh)概述概述概述概述1.了解所用的了解所用的C+系统提供哪些系统函数;系统提供哪些系统函数;2.知道某系统函数的说明放在哪个头文件中;知道某系统函数的说明放在哪个头文件中;3.调用一个调用一个(y )
47、函数时,要清楚其功能、函数时,要清楚其功能、参数和返回值。参数和返回值。第61页/共74页第六十二页,共75页。二、字符串处理函数二、字符串处理函数二、字符串处理函数二、字符串处理函数q调用调用(dioyng)(dioyng)字符串处理函数时,要包含头文件字符串处理函数时,要包含头文件string.hstring.h1. 字符串长度字符串长度(chngd)函数函数strlen( ) int strlen(const char *s);返回返回(fnhu)字符一个字符串的长度,空字符不计字符一个字符串的长度,空字符不计在内在内2. 字符串拷贝函数字符串拷贝函数strcpy( ) char * s
48、trcpy(char *s1, char *s2); char * strncpy(char *s1, char *s2, int n);实现字符串的复制,返回实现字符串的复制,返回s1的地址的地址第62页/共74页第六十三页,共75页。3. 字符串连接字符串连接(linji)函数函数strcat( ) char * strcat(char *s1, char *s2); char * strncat(char *s1, char *s2, int n);4. 字符串比较函数字符串比较函数strcmp( ) int strcmp(const char *s1, const char *s2);
49、 int strncmp(const char *s1, const char *s2, int n);返回值整数:大于返回值整数:大于0、等于、等于0、小于、小于0第63页/共74页第六十四页,共75页。小小结结函数的定义和说明函数的定义和说明函数的调用(传值、传址、引用)函数的调用(传值、传址、引用)嵌套调用和递归调用嵌套调用和递归调用函数的参数(默认值)函数的参数(默认值)内联函数(内联函数(inlineinline)函数重载函数重载(zhn zi)(zhn zi)(参数个数、类型不(参数个数、类型不同)同)作用域(作用域(4 4级)级)C+C+系统函数(字符串处理函数)系统函数(字符串
50、处理函数)第64页/共74页第六十五页,共75页。实实 验验 一一1.调试调试例例4.8、例例4.13,掌握参数默认值的设置,掌握参数默认值的设置和函数重载和函数重载(zhn zi);2.编制程序,通过调用引用作参数的函数,实现两编制程序,通过调用引用作参数的函数,实现两个字符串的交换。个字符串的交换。3.测试:测试:char a50=“hello”;4. char b50=“how are you”;5.编写程序验证哥德巴赫猜想:任何一个充分大的编写程序验证哥德巴赫猜想:任何一个充分大的偶数偶数(=6)总可以表示成两个素数之和。总可以表示成两个素数之和。第65页/共74页第六十六页,共75页
51、。作作 业业 题题#includevoid f(int j);void main( ) for(int i(1); i=4; i+) f( i );void f(int j) static int a(10); /内部静态内部静态(jngti)类变量类变量 int b(1); /自动类变量自动类变量 b+; couta+b+j=a+b+jendl; a+=10;三三(3)10 + 2 + 1 = 1320 + 2 + 2 = 2430 + 2 + 3 = 3540 + 2 + 4 = 46第66页/共74页第六十七页,共75页。三三三三(6) (6) (6) (6) 传址调用传址调用传址调用传
52、址调用(dioyng)(dioyng)(dioyng)(dioyng)#includevoid fun( int, int, int *);void main( ) int x, y, z; fun( 5, 6, &x); fun( 7, x, &y); fun( x, y, &z); coutx,y,zendl;void fun( int a, int b, int *c) b=b+a; *c=b- -a;666实参:实参:地址地址(dzh)形参:形参:指针指针(zhzhn)第67页/共74页第六十八页,共75页。三三三三(7) (7) (7) (7) 函数参数的默认值函数参数的默认值#in
53、cludeint add( int x, int y=8);void main( ) int a(5); coutsum1=add(a)endl; coutsum2=add(a, add(a)endl; coutsum3=add(a, add(a, add(a)endl;int add(int x, int y) return x+y;sum1=13sum2=18sum3=23函数函数(hnsh)声明声明第68页/共74页第六十九页,共75页。三三三三(10) (10) (10) (10) 引用引用引用引用(ynyng)(ynyng)(ynyng)(ynyng)作函数返回作函数返回作函数返回作
54、函数返回值值值值 #includeint &f(int n, int s ) /函数函数(hnsh)类型为类型为“引用引用” int &m=sn; return m; void main( ) int s =5, 4, 3, 2, 1, 0; f(3, s)=10; /返回值返回值“引用引用”作赋值语句左值作赋值语句左值 coutf(3, s)endl;10 s =5, 4, 3, 10, 1, 0引用引用(ynyng)第69页/共74页第七十页,共75页。 float & fun(float r) float temp; temp=r*r*3.14; return temp; void ma
55、in( ) fun(1.5)=12.4; v不是所有返回不是所有返回(fnhu)的引用都可以的引用都可以作为作为“左值左值”计算!计算!v返回返回(fnhu)不在作用域范围内的变不在作用域范围内的变量的引用,错误!量的引用,错误!问题:引用问题:引用(ynyng)(ynyng)作函数返作函数返回值回值局部变量局部变量第70页/共74页第七十一页,共75页。 float temp; float & fun(float r) temp=r*r*3.14; return temp; void main( ) fun(1.5)=12.4; /此处此处temp“可见可见(kjin)” 问题问题(wnt)
56、(wnt):引用作函数返:引用作函数返回值回值全局变量全局变量第71页/共74页第七十二页,共75页。三三三三(12) (12) (12) (12) 函数函数函数函数(hnsh)(hnsh)(hnsh)(hnsh)重载重载重载重载#includevoid ff(int), ff(double);void main( ) float a(88.18); ff (a); char b(a); ff (b); void ff(double x) coutff(double):xendl; void ff(int x) coutff(int):xn。1. 程序级(项目级最大)。1) 作用域:函数级和块级。1) 作用域:程序级和文件级。使用后定义的外部变量,在使用前必须(bx)说明。了解所用的C+系统提供哪些系统函数。temp=r*r*3.14。abcd第七十五页,共75页。