收藏 分销(赏)

四章函数和作用域省名师优质课赛课获奖课件市赛课一等奖课件.ppt

上传人:快乐****生活 文档编号:11700787 上传时间:2025-08-05 格式:PPT 页数:74 大小:257.54KB 下载积分:16 金币
下载 相关 举报
四章函数和作用域省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第1页
第1页 / 共74页
四章函数和作用域省名师优质课赛课获奖课件市赛课一等奖课件.ppt_第2页
第2页 / 共74页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本资料仅供参考,不能作为科学依据。谢谢。本资料仅供参考,不能作为科学依据。感谢您,第四章 函数和作用域,函数定义和说明,函数调用,函数参数,内联函数,函数重载,函数嵌套调用和递归调用,作用域,C+系统函数,第1页,4.1,函数定义和说明,一、函数定义,(),函数返回值,类型,第2页,4.1,函数定义和说明,一、函数定义,(),函数标识,第3页,4.1,函数定义和说明,一、函数定义,包含参数名和参数类型(无形参时,括号不可省),(,),函数调用时,形式参数,第4页,4.1,函数定义和说明,一、函数定义,(),函数详细实现,第5页,例:,int,add(,int x,int y,),int z;,z=x+y;,return z;,void nothing(),第6页,二、函数说明(申明),函数定义在后、调用在先,调用前必须说明;,函数定义在先、调用在后,能够不加说明;,复杂调用中,常在程序头对全部被调用函数,一次性说明。,();,例:,int add(int x,int y);,原型说明,第7页,例4.2,#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 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;,第8页,4.2,函数调用,(,),void main(),int a=3;,int b=5;,int c=,add(,a,b,),;,/实参加形参个数相等,类型相同,实参,函数调用表示式值是,函数返回值,;,函数调用表示式类型是,函数类型,;,函数调用经过一个表示式实现:,第9页,return,;,或,return;,函数返回值经过,返回语句,实现,值作为函数返回值;,类型自动转换为函数类型;,程序执行控制权转向调用函数;,注:无返回值函数用“,void,”说明类型!,第10页,一、函数传值调用,1.,传值调用,将实参值拷贝一个副本给对应形参;,形参值改变不影响实参!,实参,:常量、变量值或表示式值,形参,:变量,变量两种值:,变量本身值,和,变量地址值,;,传值调用分为:,传值调用,和,传址调用,;,第11页,例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=,9,x=,9,y=,5,第12页,将实参地址值赋给对应形参指针,使形参指针指向实参;,经过改变形参所指向变量值来影响实参!,实参,:地址值(指针),形参,:指针,2.传址调用,一、函数传值调用,1.传值调用,第13页,例4.4,#include,void swap2(,int,*,x,int,*,y,),int temp;,temp=,*x,;,*x,=,*y,;,*y,=temp;,/,形参指针所指向变量值交换,cout“x=”,*x,“y=”,*y,endl;,void main(),int a(5),b(9);,swap2(,cout“a=”a“b=”bendl;,a=,9,b=,5,x=,9,y=,5,第14页,二、函数,引用调用/C+特色,将实参变量名赋给对应形参引用,相当于在被调用函数中使用了实参别名;,经过改变引用来,直接,改变对应实参值;,引用调用比传址调用更直接。,形参,:,引用,实参,:,变量名,引用是,变量别名,对引用操作就是对被引用变量操作,第15页,例4.5,#include,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=,5,x=,9,y=,5,形参:引用,实参:变量,第16页,4.3,函数参数,一、函数参数求值次序,C+没有要求函数调用时实参求值次序,各编译器自行要求;,当实参表示式中带有副作用运算符时,可能产生因为求值次序不一样而造成二义性;,第17页,例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);,第18页,二、设置函数参数默认值,C+允许在,函数说明,或,定义,时为形参指定默认值;,按,从右至左次序,设置参数默认值;,函数调用,实参加形参结合时:,若实参数目不足,,,则使用形参默认值,;,若给定实参值,则使用给定实参值。,第19页,例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=5,a=7,b=3,c=5,a=7,b=9,c=5,a=7,b=9,c=11,默认值,函数定义,第20页,例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;,函数申明,函数定义,28,第21页,按,自右至左次序,设置参数默认值;,默认参数,在函数申明中提供,;,现有函数申明又有函数定义时,定义中不允许默认参数;,例4.8,假如只有函数定义,默认参数才能够出现在函数定义中。,例4.7,设置参数默认值应注意问题:,第22页,三、使用数组作函数参数,1.形参和实参都用数组,#include,int 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.9,49,实参,形参,第23页,2.形参和实参都用指针,#include,int a8=1,3,5,7,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.10,49,实参,第24页,3.实参用数组名形参用引用,#include,typedef int,array,8;,/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(int i=0;in-1;i+),b7+=bi;,/,对b操作即对实参数组操作,void main(),int m=8;,fun(,a,m);,couta7endl;,例4.11,49,实参,第25页,4.4,内联函数,一、内联函数引入,引入内联函数是为了处理函数调用时效率问题;,编译时,,用内联函数函数体,替换,内联函数调用表示式,(普通函数在运行时被调用);,内联函数是以目标代码增加为代价来换取时间节约。,第26页,二、内联函数定义,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,第27页,内联函数,定义,必须,出现在,内联函数,第一次被调用,前,;,内联函数体内,不允许,用,循环语句,和,开关语句,;,类结构中全部在类说明内部定义函数都是内联函数。,使用内联函数时应注意:,第28页,4.5,函数重载,函数重载是指,同一函数名,对应,多个函数实现,;,函数重载时,要求同名函数在,参数个数上不一样,,或,参数类型上不一样,;,函数调用时,系统,依据,调用函数,实参情况选择某个函数实现,。,第29页,一、参数类型不一样函数重载,#include,int add(int,int);,double add(double,double);,void main(),cout,add,(5,10),endl;,cout,add,(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,第30页,二、参数个数不一样函数重载,#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(),cout,min,(5,4,9),endl;,cout,min,(,-,2,0),endl;,例4.14,第31页,4.6,函数嵌套和递归调用,一、函数嵌套调用,main函数,调用a函数,结束,b函数,a函数,调用b函数,在调用一个函数过程中,又调用另一个函数,第32页,例4.15,#include,const int k=4,n=6;,int sum(int k,int n),powers(int m,int n);,void main(),cout,sum(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),/求ik次幂,for(int j=1,p=1;j=k;j+),p*=i;,return p;,第33页,二、函数递归调用,调用一个函数过程中又,直接,或,间接,地,调用该函数本身,;,1.含义,2.特点,每次分解出,新问题是原问题简化,子问题;,最终分解出,新问题是一个,已知解,;,程序简练清楚,可读性强;,第34页,3.过程,回归,:从已知条件出发,,逐一求值回归,,,最终达递推开始处;,递推,:原问题不停,分解为新子问题,,,最终达递归结束条件(已知);,0!,=,1,(已知),3!=3*,2!,2!=2*,1!,1!=1*,0!,递推,递推,递推,1!,=1*,1,=1,2!,=2*,1!,=2*,1,=2,3!,=3*,2!,=3*,2,=6,回归,回归,回归,例:,第35页,例4.16,#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 p=n*,fac(n,-,1),;,return p;,第36页,例4.17,#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),;,第37页,4.7,作用域,一、标识符作用域规则,标识符只能,在,其,说明或定义范围内可见,,在该范围之外不可见!,“,可见,”即能够进行,存取,或,访问,;,标识符,说明和定义不完全一样,;,定义一个标识符总是在一定范围内定义,作用范围有大有小;,第38页,二、作用域种类,1.,程序级,(项目级最大),作用域:,组成程序全部文件,;,包含:,外部变量,和,外部函数,;,2.,文件级,作用域:,定义该标识符文件内,;,包含:,外部静态类变量,和,内部函数,;,第39页,3.,函数级,作用域:,定义该标识符函数体内,;,包含:,函数形参,、,函数内自动类变量,、,内部静态类变量,、,语句标号,;,4.,块级,(最小),定义在,分程序,中、,if语句,、,switch语句,中以及,循环体,中,自动类变量,和,内部静态类变量,。,二、作用域种类,第40页,三、重新定义标识符作用域,1.在标识符作用域某个子范围内能够重新定义该标识符!,void fun(),int a;,/函数体内,float a;,/,分程序内,2.,原定义标识符在子范围内不可见,,但仍存在(暂时被隐藏);,第41页,#include,void main(),int a(5),b(7),c(10);,cout,a,b,c,endl;,int b(8);,float c(8.8);,cout,a,b,c,endl;,a,=,b,;,int c,=,b,;,cout,a,b,c,endl;,cout,a,b,c,endl;,cout,a,b,c,0,;,x-,),int x(5);,/重新定义变量,x,作用域:块级,cout,x,;,coutendl,x,endl;,5 5 5,0,例4.19,第43页,四、局部变量和全局变量,1.局部变量,1)作用域:,函数级,和,块级,;,2)包含:,自动类变量,、,内部静态变量,和,函数形参,;,自动类变量,auto,存放器类变量,register,内部静态类变量,(static),定义在,函数体内,或分程序内,定义时,有默认值,;,生存期长,可见性,与,存在性不一致,(作用域外不可见但仍存在,回到作用域仍保留原值);,第44页,例4.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),;,/内部静态类变量,a+10;,b+=20,;,couta=,a,b=,b,endl;,a=3,b=5,c=0,a=5,b=,32,a=5,b=,52,第45页,2.全局变量,1)作用域:,程序级,和,文件级,;,2)包含:,外部变量,和,外部静态类变量,;,外部变量定义,定义在函数体外,,定义时不加任何存放类说明;,外部变量说明(申明),用,说明符“,extern,”,对外部变量进行说明,使用后定义外部变量,在使用前必须说明;,在一个文件中使用另一个文件定义外部变量,必须说明;,一个外部变量只能定义一次,但能够说明屡次。,第46页,int add(int a,int b),int s=a+b;,return s;,void main(),extern int x,y;,/外部变量说明,cout,add(,x,y,),endl;,int x(20),y(5);,/外部变量定义,使用后定义外部变量,必须提前说明,例:,第47页,例4.21,#include,void fun1(),fun2(),fun3();,/函数说明,int i(5);,/外部变量:程序级,void main(),i=20;,fun1();,coutmain():i=iendl;,fun2();,coutmain():i=iendl;,fun3();,coutmain():i=iendl;,文件:,main.cpp,第48页,#include,static int i;,/外部静态变量:文件级,void fun1(),i=50;,coutfun1():i(static)=,i,endl;,1),fun1():i(static)=,50,文件:,file1.cpp,第49页,3),fun2():i(auto)=,15,4),fun2():i(extern)=,20,#include,void fun2(),int i=15;,/自动类变量:函数级,coutfun2():i(auto)=,i,endl;,if(i),extern int i;,/申明外部变量:程序级,coutfun2():i(extern)=,i,endl;,extern int i;,void fun3(),i=30;,coutfun3():i(extern)=iendl;,if(i),int i=10;,coutfun3():i(auto)=iendl;,文件:,file2.cpp,第50页,第51页,例4.21,#include,void fun1(),fun2(),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,第52页,例4.21,#include,void fun1(),fun2(),fun3();,int i(5);,/外部变量:程序级,void main(),i=20;,fun1();,coutmain():i=iendl;,fun2();,coutmain():i=iendl;,fun3();,coutmain():i=iendl;,文件:,main.cpp,第53页,例4.21,#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,第54页,例4.21,#include,void fun1(),fun2(),fun3();,int i(5);,/,外部变量:程序级,void main(),i=20;,fun1();,coutmain():i=iendl;,fun2();,coutmain():i=iendl;,fun3();,coutmain():i=iendl;,文件:,main.cpp,第55页,#include,void 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)=,i,endl;,if(i),int i=10;,/自动类变量:块级,coutfun3():i(auto)=,i,endl;,6),fun3():i(extern)=,30,7),fun3():i(auto)=,10,文件:,file2.cpp,第56页,例4.21,#include,void fun1(),fun2(),fun3();,int i(5);,/,外部变量:程序级,void main(),i=20;,fun1();,coutmain():i=iendl;,fun2();,coutmain():i=iendl;,fun3();,coutmain():i=iendl;,8),main():i=,30,文件:,main.cpp,第57页,例4.21,#include,void fun1(),fun2(),fun3();,int i(5);,/,外部变量:程序级,void main(),i=20;,fun1();,coutmain():i=iendl;,fun2();,coutmain():i=iendl;,fun3();,coutmain():i=iendl;,8),main():i=,30,文件:,main.cpp,第58页,第59页,第60页,五、内部函数和外部函数,1.内部函数,内部函数只在定义它文件中可用!,static,(),2.外部函数,extern,(),外部函数作用域是整个程序!,第61页,4.8,C+,系统函数,一、C+系统函数概述,了解所用C+系统,提供哪些系统函数,;,知道某系统,函数说明放在哪个头文件,中;,调用一个函数时,要清楚其,功效,、,参数,和,返回值,。,第62页,二、字符串处理函数,调用字符串处理函数时,要包含头文件,string.h,1.字符串长度函数strlen(),int,strlen,(const char *s);,返回字符一个字符串长度,空字符不计在内,2.字符串拷贝函数strcpy(),char*,strcpy,(char*s1,char*s2);,char*,strncpy,(char*s1,char*s2,int n,);,实现字符串复制,返回,s1,地址,第63页,3.字符串连接函数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);,int,strncmp,(const char*s1,const char*s2,int n,);,返回值整数:大于0、等于0、小于0,第64页,小 结,函数定义和说明,函数调用(,传值,、,传址,、,引用,),嵌套调用和递归调用,函数参数(,默认值,),内联函数(,inline,),函数重载(,参数个数、类型不一样,),作用域(,4,级,),C+,系统函数(字符串处理函数),第65页,实 验 一,调试例4.8、例4.13,掌握参数默认值设置和函数重载;,编制程序,经过调用,引用作参数函数,,实现两个字符串交换。,测试:char a50=“hello”;,char b50=“how are you”;,编写程序验证,哥德巴赫猜测,:任何一个充分大偶数(=6)总能够表示成两个素数之和。,第66页,作 业 题,#include,void 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+,j,endl;,a+=10,;,三(3),10,+2+,1,=,13,20,+2+,2,=,24,30,+2+,3,=,35,40,+2+,4,=,46,第67页,三(6),传址调用,#include,void 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;,6,6,6,实参:地址,形参:指针,第68页,三(7),函数参数默认值,#include,int 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=,13,sum2=18,sum3=23,函数申明,第69页,三(10),引用作函数返回值,#include,int,&,f(int n,int s),/函数类型为“引用”,int,&,m=,sn,;,return,m,;,void main(),int s=5,4,3,2,1,0;,f(3,s),=10;,/返回值“引用”作赋值语句左值,cout,f(3,s),endl;,10,s=5,4,3,10,1,0,引用,第70页,float&,fun(float r),float,temp,;temp=r*r*3.14;,return,temp,;,void main(),fun(1.5),=12.4;,不是全部返回引用都能够作为“左值”计算!,返回不在作用域范围内变量引用,错误!,问题:引用作函数返回值,局部变量,第71页,float,temp,;,float&,fun(float r),temp=r*r*3.14;,return,temp,;,void main(),fun(1.5),=12.4;,/此处temp“可见”,问题:引用作函数返回值,全局变量,第72页,三(12),函数重载,#include,void 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):xendl;,ff(double):,88.18,ff(int):,97,第73页,三 1.,5,8,11,14,三 2.,25,三 4.,6,11,三 5.,5!+4!+3!+2!+1!=,153,三 8.,720,三 9.,a=,5,b=,8,a=,8,b=,5,三 11.,u,1998,abcd,第74页,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服