第4章 函数(2)PPT课件_第1页
第4章 函数(2)PPT课件_第2页
第4章 函数(2)PPT课件_第3页
第4章 函数(2)PPT课件_第4页
第4章 函数(2)PPT课件_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

.,1,C+程序设计与数据结构基础,天津大学精仪学院生物医学工程系张宁Email:zhniQQ:1307573198,第4章(函数)(2)我和我的小伙伴从不吵架作用域和存储类别,.,2,复习函数的调用过程,.,3,本讲概要,6.小结,2.函数参数的缺省,3.函数重载,4.变量的作用域和存储类别,5.编译预处理,1)变量的作用域:全局变量、局部变量,2)变量的生存期:存储类别,3)含多个源程序文件的C+程序,1.函数的嵌套调用和递归调用,.,4,函数的嵌套调用,定义函数不允许嵌套,但调用函数可以嵌套,即在被调函数中又调用其它函数。,P82,例4.6,#includeintf1(),f2(),f3();voidmain()coutthisismain()n;coutf1()endl;intf1(void)coutthisisf1()n;coutf3()endl;return1;,intf2(void)coutthisisf2()n;return2;intf3(void)coutthisisf3()n;coutf2()n;coutn!=fact(n)0)r=n*fact(n-1);elser=1;returnr;,递归程序,结构简练,可读性强。但执行时其时间和空间上的开销都比较大。为防止自调用无休止地进行,在函数内必须设置调用终止的条件,否则程序将无法终止,被称为死递归。,fact(n-1);,r=n*,.,9,递归练习,书P115练习4.2(1),#includeintfunction(intx);main()coutfunction(7)0)p=p*a;n-;returnp;main()coutpower(3,4)endl;,自己编写的函数power(a,n),求an,不必#include,coutpower(3,4.5)endl;,an,81,#include#includemain()coutpow(3,4)endl;coutpow(3,4.5)endl;,81140.296,81,8181,.,12,#include,函数参数的缺省,3,n使用缺省值,n有缺省值2,9,9,main()intk=3;coutpower(k)endl;coutpower(k,4)0)p=p*a;n-;returnp;,.,13,#include,main()intk=3;coutpower(k)endl;coutpower(k,4)0)p=p*a;n-;returnp;,9,981,n有缺省值2,.,14,#include,main()intk=3;coutpower(k)endl;coutpower(k,4)0)p=p*a;n-;returnp;,函数参数的缺省,intpower(inta,intn=2);,函数的声明,函数参数的缺省,可为参数指定一个默认的初值;若有原型声明,缺省值只在声明中给出一次,定义时不能再给;当有的参数有缺省值,有的没有缺省值时,有缺省值的参数必须全部位于最右边;可以每个参数都有缺省值。,voidfunc(inty,intx=2,intz=10);voidfunc(intx=2,inty,intz=10);,coutpower()endl;,intpower(inta=3,intn=2);,直接求32=9,func(4,5);,.,15,本讲概要,6.小结,2.函数参数的缺省,3.函数重载,4.变量的作用域和存储类别,5.编译预处理,1)变量的作用域:全局变量、局部变量,2)变量的生存期:存储类别,3)含多个源程序文件的C+程序,1.函数的嵌套调用和递归调用,.,16,函数重载,#includeintadd(intx,inty)returnx+y;,整数加法,main()inta=3,b=4;doublem=3.8,n=2.7;coutadd(3,4)endl;,coutadd(m,n)endl;,7,75,5,7,.,17,7,函数重载,#includeintadd(intx,inty)returnx+y;,整数加法,main()inta=3,b=4;doublem=3.8,n=2.7;coutadd(3,4)endl;,coutadd(m,n)endl;,doubleadd2(doublex,doubley)returnx+y;,coutadd2(m,n)endl;,76.5,6.5,doubleadd(doublex,doubley)returnx+y;,浮点数加法,两个以上的函数使用相同的函数名,函数重载,根据实际调用时实参类型和个数的不同,系统自动选调对应参数的函数,coutadd(m,n)endl;,.,18,函数重载,#includeintadd(intx,inty)returnx+y;,doubleadd(doublex,doubley)returnx+y;,intadd(intx,inty,intz)returnx+y+z;,整数加法,浮点数加法,三个整数加法,main()inta=3,b=4,c=5;coutadd(3,4,5)endl;,doubleadd(intx,inty)return(double)(x+y);,形参必须有所不同。或者是形参个数不同,或者是形参类型不同。只有返回值类型不同是不可以的。,12,.,19,#includeintadd(intx,inty)returnx+y;floatadd(floatx,floaty)returnx+y;doubleadd(doublex,doubley)returnx+y;main()inti=100,j=200;floata=15.55,b=27.89;doublex=6.3e10,y=8.05e12;coutInteger:add(i,j)n;coutFloat:add(a,b)n;coutDouble:add(x,y)b?(ac?a:c):(bc?b:c);main()inta,b,c;coutabc;coutab;cout二个数的最大值:max(a,b)endl;,输入3个数:_,函数重载练习(2)参数个数不同,P96例4.20,输入3个数:23542,输入3个数:23542三个数的最大值:42,输入3个数:23542三个数的最大值:42输入2个数:,输入3个数:23542三个数的最大值:42输入2个数:129,输入3个数:23542三个数的最大值:42输入2个数:129二个数的最大值:12,以下关于重载函数的说法中,正确的是_。A)重载函数必须具有不同的返回值类型B)重载函数必须有不同的形参列表C)重载函数形参个数必须不同D)重载函数名可以不同,B,.,21,本讲概要,6.小结,2.函数参数的缺省,3.函数重载,4.变量的作用域和存储类别,5.编译预处理,1)变量的作用域:全局变量、局部变量,2)变量的生存期:存储类别,3)含多个源程序文件的C+程序,1.函数的嵌套调用和递归调用,.,22,变量的作用域,作用域,变量在何范围内有效;,局部变量,截止到目前,我们接触的变量都属局部变量。,intf1(inta)intb,c;intf2(intx)inty,z;main()intm,n;,全局变量,局部变量,abc有效xyzmn都无效,xyz有效abcmn都无效,mn有效abcxyz都无效,只在本函数内有效(本函数“块”内有效)若未赋初值,值为随机数不同函数中可使用同名变量,形参和实参也可同名(形参也是函数内的变量)在复合语句中定义变量,(只在复合语句“块”内有效),.,23,复合语句中的局部变量,在复合语句中定义变量也是局部的,它的范围更小(只在复合语句“块”内有效,有效范围是从定义它到复合语句的为止)。,#includemain()inti=2,j=3,k;k=i+j;intk=8;k=k+i;coutkendl;coutkendl;,10,105,.,24,全局变量(也称外部变量),在函数外定义的变量。,全局变量,在函数外定义的变量。作用域:从变量定义处开始,到本程序文件末尾均有效(其中所有函数都能用)。初始值自动为0。全局变量可在多个函数中同时起作用,应尽量少用或不用全局变量。,#includeintsum;voidfun1()sum+=20;inta;voidfun2()a=20;sum+=a;main()sum=0;fun1();a=8;fun2();coutsum=sum,a=a;,sum=40,a=20,不能使用a,都能使用a,都能使用sum,fun1如果要使用avoidfun1()externinta;a=1;sum+=20;,声明以后再定义全局变量a,extern指同一变量,不开辟新空间,.,25,全局变量练习,#includeconstintN=3;doublea;/定义全局变量avoidmain()for(inti=0;iN;i+)a=a+xi;couta=ab?a:b;returnc;main()inta=8;couta=aendl;coutb=bendl;coutmax=max(a,b)endl;,int,a=8,8,5,a=8b=5,8,a=8b=5max=8,.,27,全局变量屏蔽的屏蔽作用域分辨符(:),#includeinta;main()inta=10;inta=3;:a=5;a=:a+a;cout:a=:aa=aendl;:a+;cout:a=:aa=aendl;,:直接引用全局变量;不受同名局部变量屏蔽的影响。,:a=5a=8,:a=5a=8:a=6a=10,凡是:a,都指,其他a要分区域判断所指不同,.,28,作用域分辨符(:)练习,a=20b=40.5,书P116.(2),#includedoublea;voidmain()inta=10;inta=20;doubleb;:a=20.5;b=:a+a;couta=ab=bendl;couta=:aendl;couta=:aendl;,#includedoublea;voidmain()inta=10;inta=20;doubleb;:a=20.5;b=:a+a;couta=ab=bendl;couta=:aendl;couta=:aendl;,凡是:a,都指,其他a要分区域判断所指不同,a=20b=40.5a=20.5,a=20b=40.5a=20.5a=20.5,.,29,本讲概要,6.小结,2.函数参数的缺省,3.函数重载,4.变量的作用域和存储类别,5.编译预处理,1)变量的作用域:全局变量、局部变量,2)变量的生存期:存储类别,3)含多个源程序文件的C+程序,1.函数的嵌套调用和递归调用,.,30,变量的生存期,生存期,变量从空间被开辟,到该空间被释放所经历的期间。,作用域,空间,时间,变量在何范围内有效。,全局变量,局部变量,存储类别,(可见性),.,31,变量的存储类别,CPU寄存器,auto,内存静态存储区,内存动态存储区,变量有数据类型,还有存储类别存储类别指明了变量存储的位置,有3种,static,register,autointa;,inta;,或,autoa;,或,变量a位于内存动态存储区,staticintb;,staticb;,或,变量b位于内存静态存储区,registerintc;,registerc;,或,变量c位于CPU寄存器,auto指定变量位于内存动态存储区,static指定变量位于内存静态存储区,register指定变量位于CPU寄存器,都不写这三个关键字,就是auto;我们接触的变量大多是auto的,CPU寄存器数量有限,register只是建议,编译系统可能并不采纳,仍按auto型处理。实际没必要定义为register,因为编译系统有优化功能,当编译系统识别出某个变量要被频繁使用时,会自动按register处理。,(未在内存,没有地址),.,32,不同存储类别的变量的特点,register型变量的速度要远远快于其他存储类型的变量。,.,33,存储类别程序例(1),#includef(inta)autob=0;staticc=3;b=b+1;c=c+1;returna+b+c;main()inta=2,i;for(i=0;i3;i+)coutf(a);,7,7,8,78,9,789,.,34,全局变量和局部变量的存储类别,全局变量:只能是static型的,即只能位于内存静态存储区;函数中,或中的局部变量:可以是auto、static或register型的;函数的形参:可以是auto或register型的,不能为static型。,.,35,本讲概要,6.小结,2.函数参数的缺省,3.函数重载,4.变量的作用域和存储类别,5.编译预处理,1)变量的作用域:全局变量、局部变量,2)变量的生存期:存储类别,3)含多个源程序文件的C+程序,1.函数的嵌套调用和递归调用,.,36,一个C+程序可包含多个源程序文件(.cpp),main().函数1();.int函数1().float函数2().void函数3().,一个程序(不是3个程序)只能有一个main函数,每个文件都可被单独编译,但不一定能单独运行。,.,37,多文件共用同一全局变量和函数,extern,是声明,不是定义,不开辟空间声明要使用其他文件中的全局变量或其他文件中的函数。,要使用其他文件中的全局变量或函数,需要先声明!,#includemain()a=10;coutmain中a=aendl;fun();coutfun后main中a=a;,#includea=20;coutfun中a=aendl;,定义全局变量a,开辟a的空间,声明要使用其他文件中的全局变量a,不开辟新空间,main中a=10,声明要使用其他文件中的函数fun,main中a=10fun中a=20,main中a=10fun中a=20fun后main中a=20,inta;/全局变量,voidfun(),externvoidfun();,externinta;,.,38,不允许其他文件使用的全局变量和函数,#includeexternvoidfun();main()fun();,#includeexterninta;a=20;,inta;/全局变量,voidfun(),全局变量:只能是static型的,加不加static都是static型的。但加static有另外的含义:它不允许被其他文件使用。,static,不允许使用file1的a,file2.cpp,file1.cpp,函数:定义前加static也表示:它不允许被其他文件使用。若定义前不加static或加extern,表示函数可被其他文件使用。,static,不允许使用file2的fun,static,局部变量定义前加static,表示静态变量;全局变量定义前或函数定义前加static,表示不允许被其他文件使用。,.,39,static和extern总结,static,局部变量定义前加static,表示静态变量;全局变量定义前或函数定义前加static,表示不允许被其他文件使用。,extern,全局变量的声明或函数声明前加extern,表示该全局变量或函数是其他文件中定义的,或是本文件后面定义的,用于扩大作用范围(不开辟新变量空间);函数定义前加extern或不写,表示该函数允许被其他文件使用。,声明:不分配内存,可出现多次定义:分配内存、写出执行语句,只能出现一次。,声明和定义,尽量不要使用全局变量,否则会破坏函数的独立性;并可能导致变量值意外被其他函数所改变。,.,40,练习,设在某函数的函数体内有以下语句inta;staticintb;则变量a,b的初值分别为_。A)0、0B)0、不确定C)不确定、0D)不确定、不确定,C,以下叙述中,错误的是_。A)函数的形参、函数内部的变量都只具有块作用域;B)当函数内的局部变量和某全局变量发生命名冲突时,在函数内部应遵循局部优先的原则;C)用static修饰的变量,具有静态的生存期,因此一定是全局变量;D)所有全局变量的生存期都与整个程序运行期一致。,C,.,41,本讲概要,6.小结,2.函数参数的缺省,3.函数重载,4.变量的作用域和存储类别,5.编译预处理,1)变量的作用域:全局变量、局部变量,2)变量的生存期:存储类别,3)含多个源程序文件的C+程序,1.函数的嵌套调用和递归调用,.,42,编译预处理(预编译处理),以#开头的行,是编译预处理命令行(不是语句)。,#includemain()inta,b,c;a=10;b=20;c=a+b;coutc;,#includemain()inta,b,c;a=10;b=20;c=a+b;coutc;,C+源程序,可执行程序,编译(compile),链接(link),目标程序,编译预处理,编译预处理命令单独占一行,前有#,后无;先预处理,再编译:预处理是在编译之前的工作预处理部分不编译,编译(compile),编译器一般都是把两个阶段一起完成,我们感觉不到预处理阶段的存在,包含文件(#include),宏定义(#define),条件编译(#if,#ifdef),.,43,包含文件(#include),也可写作,我的程序.cpp,#includemain().couthello!endl;.,编译运行,表示计算机只到C+系统目录(C+安装目录下的include目录)中找此文件;表示计算机先到用户目录中找此文件,若没找到,再到C+系统目录中找。系统提供的头文件一般用(但也可用);用户自定义头文件一般用。,将某文件(一般是.h头文件)嵌入到当前文件中,#include,#include头文件名.h,.,44,宏定义(#define),#define宏名替换文本,文本替换,不会计算,#include#include#definePI3.14159main()doubler=2;doubles;s=PI*r*r;coutPIendl;couts=sendl;coutsin(30*PI/180);,#include#includemain()doubler=2;doubles;s=3.14159*r*r;cout3.14159endl;couts=sendl;coutsin(30*3.14159/180);,3.14159s=12.56640.5,编译运行,预处理完毕,不再有#define,编译预处理,宏展开,.,45,宏定义(#define)练习,若有定义:#defineM(y*y+3*y),则语句:s=3*M+4*M;宏展开(预编译处理)后变为,s=3*(y*y+3*y)+4*(y*y+3*y);,若有定义:#defineMy*y+3*y,则语句:s=3*M+4*M;宏展开(预编译处理)后变为,s=3*y*y+3*y+4*y*y+3*y;,文本替换,不会计算,.,46,宏定义(#define)练习,#include#defineN3+5main()cout2*Nendl;,编译预处理,#includemain()cout2*3+5endl;,文本替换,不会计算,#include#defineN3+5;main()cout2*Nendl;,编译预处理,#includemain()cout2*3+5;endl;,#include#definePRINTcout*;main()PRINT,编译预处理,#includemain()cout*;,11,*,.,47,带参宏定义,#include#defineF(x,y)3*x+ymain()coutF(1,2);,F(,),3*x*y,编译预处理,#includemain(),x,1,y,2,cout3*x+y;,cout3*1+2;,#include#defineS(x)4*(x)*x+1main()intk=5,j=2;coutS(k+j);,编译预处理,#includemain()intk=5,j=2;,s(),4*(x)*x+1,x,k+j,cout4*(x)*x+1;,cout4*(k+j)*k+j+1;,文本替换,不会计算,143,5,4*(k+j)*(k+j)+1错误!,.,48,条件编译,#includemain()inta=1;#ifdefRUNcouta=aendl;#endifcouta+1=a+1endl;,a=1a+1=2,#defineRUN1,如果没

温馨提示

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

评论

0/150

提交评论