(C课件)第4章函数定义与调用函数.ppt

上传人:max****ui 文档编号:3263123 上传时间:2019-12-10 格式:PPT 页数:49 大小:493.50KB
返回 下载 相关 举报
(C课件)第4章函数定义与调用函数.ppt_第1页
第1页 / 共49页
(C课件)第4章函数定义与调用函数.ppt_第2页
第2页 / 共49页
(C课件)第4章函数定义与调用函数.ppt_第3页
第3页 / 共49页
点击查看更多>>
资源描述
在结构化程序设计中,函数是将任务进行模块划分的基本单位。一个函数实现一项功能。在面向对象程序设计中,函数是对数据的一项操作,也是实现一项功能。,第四章函数,要掌握函数的使用,必须理解函数调用时的内部实现机制,以及与此相关的内存分配机制、变量生命期和作用域。,本章还将介绍关于函数重载的概念,介绍递归算法、内联函数、默认参数函数以及编译预处理、工程文件的概念和运行库函数。,第4章函数,4.1函数的定义与调用,4.5作用域与标识符的可见性,4.4函数调用机制,4.3全局变量和局部变量,4.2函数的参数传递,返回值及函数声明,4.8编译预处理,4.6存储类型与标识符的生命期,4.7函数的递归调用,4.1函数的定义与调用,4.1.1函数概述,4.1.2函数的定义,4.1.3函数的调用,4.1.1函数概述,函数是C+程序的基本组成模块。,通过函数,可以把一个复杂任务分解成为若干个易于解决的小任务。充分体现逐步细化的设计思想。,组成C+程序的若干函数中,有一个称为main()(Winmain())函数,是程序执行的入口,它可以调用其他函数,但不可以被调用。而其他一般函数既可以调用也可以被调用。,函数概念的引入:,入口函数:,4.1.1函数概述,4.1.1函数概述,库函数和自定义函数:库函数或标准函数,是由编译系统预定义的,如一些常用的数学计算函数、字符串处理函数、图形处理函数、标准输入输出函数等。库函数都按功能分类,集中说明在不同的头文件中。用户只需在自己的程序中包含某个头文件,就可直接使用该文件中定义的函数。用户根据需要将某个具有相对独立功能的程序定义为函数,称自定义函数。,4.1.2函数的定义,无参函数定义格式为:数据类型函数名(void)函数体,说明:数据类型指函数返回值类型,可以是任一种数据类型,默认为返回整型值(但新标准要求写明,不用默认方式)。没有返回值应将返回值类型定义为void。函数名采用合法标识符表示。对无参函数,参数括号中的void通常省略,但括号不能省略。函数体由一系列语句组成。函数体可以为空,称为空函数。,1无参函数,4.1.2函数的定义,/打印一个表头voidTableHead()cout*endl;cout*example*endl;cout*xy;coutx和y中较大数为max(x,y)endl;return0;,4.2函数的参数传递、返回值及函数声明,4.21函数的参数传递及传值调用,4.23函数声明,4.22函数返回值,参数传递:函数调用首先要进行参数传递,参数传递的方向是由实参传递给形参。传递过程是,先计算实参表达式的值,再将该值传递给对应的形参变量。一般情况下,实参和形参的个数和排列顺序应一一对应,并且对应参数应类型匹配(赋值兼容),即实参的类型可以转化为形参类型。而对应参数的参数名则不要求相同。总而言之:参数要求位置匹配,4.2.1函数的参数传递及传值调用,传值调用和引用调用:按照参数形式的不同,C+有两种调用方式:传值调用和引用(传址)调用。传值调用传递的是实参的值,这里先介绍传值调用。,4.2.1函数的参数传递及传值调用,传值调用:将实参的值复制给形参,在函数中参加运算的是形参,而实参不会发生任何改变。传值调用起了一种隔离作用。,【例4.2】实参和形参对应关系的示例。,4.2.1函数的参数传递及传值调用【例4.2】,调用power(4.6,3),函数power(4.6,3),return97.336,主程序后续语句,【例4.2】实参和形参对应关系的示例。floatpower(floatx,intn)/求x的n次幂floatp=1;while(n-)p*=x;returnp;intmain()intn=3;floatx=4.6;charc=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)bc;area=TriangleArea(a,b,c);if(area=-1)cout(a,b,c)不能构成三角形!endl;elsecout三角形(a,b,c)面积为:areachoice;while(choice=4);switch(choice)case1:account_report();break;case2:engineering_report();break;case3:marketing_report();break;return0;,voidmenu_print()cout”系统功能:”endl;cout”1财务报表”endl;cout”2工程报表”endl;cout”3市场报表”endl;cout”选择业务序号:”;voidaccount_report()/生成财务报表voidengineering_report()/生成工程报表voidmarketing_report()/生成市场报表;,4.2.3函数声明,【例4.4】输出所有满足下列条件的正整数m:10m1000且m、m2、m3均为回文数。,分析:回文指左右对称的序列。如121、353等就是回文数。判断整数是否回文数用函数实现,其思想是将该数各位拆开后反向组成新的整数,如果该整数与原数相等则为回文数。,mm*mm*m*m111211331101102011030301111123211367631,运行结果:,4.3全局变量和局部变量,4.3.1变量的存储机制与C+的内存布局,4.3.2全局变量,4.3.3局部变量,4.3.1变量的存储机制与C+的内存布局,自由存储区(动态数据),操作系统为一个C+程序的运行所分配的内存分为四个区域,如图4.3所示:,存储区域说明:(1)代码区(Codearea):存放程序代码,即程序中各个函数的代码块;(2)全局数据区(Dataarea):存放全局数据和静态数据;分配该区时内存全部清零,结果变量的所有字节等效初始化为全。(3)栈区(Stackarea):存放局部变量,如函数中的变量等;分配栈区时不处理内存,即变量取随机值。(4)自由存储区(Freestorearea):存放与指针相关的动态数据。分配自由存储区时不处理内存。,4.3.1变量的存储机制与C+的内存布局,4.3.2全局变量,在所有函数之外定义的变量称为全局变量。,全局变量存放在全局数据区,因编译器自动将该区清为全0,如果用户在定义时不显式给出初始化值,则等效初始化为全0。,全局变量可定义在程序开头,也可定义在中间位置,该全局变量在定义处之后的任何位置都是可以访问的,称为可见的。,【例4.5】多个函数使用全局变量的例子。,全局变量引入:,4.3.2全局变量【例4.5】,打印200,调用func(),函数func(),200*2=400,打印400,n=100,n=100*2=200,【例4.5】多个函数使用全局变量的例子。intn=100;voidfunc()n*=2;intmain()n*=2;coutnendl;func();coutnendl;return0;,4.3.3局部变量,定义在函数内或块内的变量称为局部变量。,程序中使用的绝大多数变量都是局部变量。,局部变量在程序运行到它所在的块时建立在栈中,该块执行完毕局部变量占有的空间即被释放。故亦称为自动变量。,局部变量在定义时可加修饰词auto,但通常省略。局部变量在定义时若未初始化,其值为随机数。,局部变量引入:,【例4.6】使用局部变量的例子。,4.3.3局部变量,打印main()中的t=4.5,调用fun(),函数fun(),打印fun()中的t=5,打印main()中的t=4.5,t=5,【例4.6】使用局部变量的例子。voidfun()autointt=5;/fun()中的局部变量,auto可省略coutfun()中的t=tendl;intmain()floatt=4.5;/main()函数中的局部变量coutmain()中的t=tendl;fun();coutmain()中的t=tb;cout=a)intt;/具有块域t=a;a=b;b=t;/交换a,b的值couta=atb=bendl;return0;,上述程序若在最后一个cout语句处增加:couttb;cout调用前:实参a=a,b=bendl;swap(a,b);/传值cout调用后:实参a=a,b=bendl;return0;voidswap(inta,intb)/a,b作用域为swap()cout调用中endl;cout交换前:形参a=a,b=bendl;intt;t=a;a=b;b=t;/交换swap()中的a,b的值cout交换后:形参a=a,b=bendl;,块域,对于块中嵌套其它块的情况,如果嵌套块中有同名局部变量,服从局部优先原则,即在内层块中屏蔽外层块中的同名变量,换句话说,内层块中局部变量的作用域为内层块;外层块中局部变量的作用域为外层除去包含同名变量的内层块部分。,如果块内定义的局部变量与全局变量同名,块内仍然局部变量优先,但与块作用域不同的是,在块内可以通过域运算符“:”访问同名的全局变量。,【例4.9】显示同名变量可见性。,200300,内i=500,内j=600,内n=500+600=1100,1100500600,100,200+300=500,500,500200300,外部i=200,外部j=300,【例4.9】显示同名变量可见性。intn=100;#includeintmain()inti=200,j=300;coutntitjendl;/内部块inti=500,j=600,n;n=i+j;coutntitjendl;/输出局部变量ncout:nendl;/输出全局变量nn=i+j;/修改全局变量coutntitjendl;return0;,函数声明域,函数声明不是定义函数,在作函数声明时,其中的形参作用域只在声明中,即作用域结束于右括号。正是由于形参不能被程序的其他地方引用,所以通常只要声明形参个数和类型,形参名可省略。,3文件域,文件域也称全局域。定义在所有函数之外的标识符作用域为从定义处到整个源文件结束,即文件域。文件中定义的全局变量和函数的作用域为文件域。如果某个文件中说明了作用域为文件域的标识符,该文件又被另一个文件包含,则该标识符的作用域延伸到新的文件中。如cin和cout是在头文件iostream中说明的具有文件作用域的标识符,它们的作用域也延伸到嵌入iostream的文件中。,存储类型(storageclass)决定标识符的存储区域,即编译系统在不同区域为不同存储类型的标识符分配空间。由于存储区域不同,标识符的生命期也不同。所谓生命期,指的是标识符从获得空间到空间释放之间的期间,标识符只有在生存期中、并且在其自己的作用域中才能被访问。,4.6存储类型与标识符的生命期,4.6.1存储类型,4.4.2生命期,自动变量为用auto说明的变量,通常auto缺省。局部变量都是自动变量,生命期开始于块的执行,结束于块的结束,其原因是自动变量的空间分配在栈中,块开始执行时系统自动分配空间,块执行结束时系统自动释放空间。故自动变量的生命期和作用域是一致的。,4.6.1存储类型,为提高程序运行效率,可以将某些变量保存在寄存器中,即用register说明为寄存器变量,但不提倡使用。,C+中关于存储类型的说明符(storageclassspecifier)有四个:auto、register、static和extern。其中用auto和register修饰的称为自动存储类型,用static修饰的称为静态存储类型,用extern修饰的称为外部存储类型。,1自动存储类型,static说明的变量称为静态变量。根据定义的位置不同,还分为局部静态变量和全局静态变量,也称内部静态变量和外部静态变量。静态变量均存储在全局数据区,如果程序未显式给出初始化值,则等效初始化为全0;静态变量占有的空间要到整个程序执行结束才释放,故静态变量具有整个程序执行期间的生命期。,4.6.1存储类型,局部静态变量是定义在块中的静态变量,编译系统在全局数据区为其开辟空间并保存数据,该空间一直到整个程序结束才释放。局部静态变量具有局部作用域,但却具有整个程序执行期间的生命期。如果显式给出初始化值,则在该块第一次执行时完成,且只进行一次。,2静态存储类型,【例4.10】自动变量与局部静态变量的区别,4.6.1存储类型,3外部存储类型,一个C+程序可以由多个源程序文件组成。多文件程序系统可以通过外部存储类型的变量和函数来共享某些数据和操作。,在一个程序文件中定义的全局变量和函数缺省为外部的,即其作用域可以延伸到程序的其他文件中。其他文件如果要使用这个文件中定义的全局变量和函数,应该在使用前用“extern”作外部声明。外部声明通常放在文件的开头(函数总是省略extern)。,外部变量声明不同于全局变量定义,变量定义时编译器为其分配存储空间,而变量声明则表示该全局变量已在其他地方定义过,编译系统不再分配存储空间。,外部的全局变量或函数加上static修饰,就成为静态全局变量或静态函数。静态的全局变量和函数作用域限制在本文件,其他文件即使使用外部声明也无法使用该全局变量或函数。,【例4.11】外部存储类型的例子,4.6.2生命期,1.静态生命期,静态生命期(Staticextent或Staticstorageduration)指的是标识符从程序开始运行时就存在,具有存储空间,到程序运行结束时消亡,释放存储空间。具有静态生命期的标识符存放在全局数据区,如全局变量、静态全局变量、静态局部变量。具有静态生命期的标识符在未被用户初始化的情况下,系统会等效将其初始化为全0。函数驻留在代码区,也具有静态生命期。所有具有文件作用域的标识符都具有静态生命期。,4.6.2生命期,2.局部生命期,在函数内部或块中定义的标识符具有局部生命期(Automaticextent或Automaticstorageduration),其生命期开始于执行到该函数或块的标识符定义处,结束于该函数或块的结束处。具有局部生命期的标识符存放在栈区。具有局部生命期的标识符如果未被初始化,其内容是随机的,不可引用。具有局部生命期的标识符必定具有局部作用域;但反之不然,静态局部变量具有局部作用域,但却具有静态生命期。,4.6.2生命期,具有动态生命期(dynamicextent或dynamicstorageduration)的标识符存放在自由存储区,由特定的函数调用或运算来创建和释放,如用new运算符(或调用malloc()函数)为变量分配存储空间时,变量的生命期开始,而用delete运算符(或调用free()函数)释放空间或程序结束时,变量生命期结束。关于new运算符和delete运算符将在第七章中介绍。,4.动态生命期,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!