收藏 分销(赏)

函数市公开课一等奖省赛课微课金奖课件.pptx

上传人:丰**** 文档编号:12582562 上传时间:2025-11-06 格式:PPTX 页数:38 大小:239.52KB 下载积分:10 金币
下载 相关 举报
函数市公开课一等奖省赛课微课金奖课件.pptx_第1页
第1页 / 共38页
函数市公开课一等奖省赛课微课金奖课件.pptx_第2页
第2页 / 共38页


点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,4,章 函数,学习目标,掌握函数申明和定义、函数调用及函数参数传递过程,了解关键字,inline,含义与使用,掌握递归函数定义及使用,掌握函数重载定义及使用,掌握函数模板定义及使用,了解各类系统函数,掌握惯用系统函数使用,1/38,程序模块,结构化程序设计,要求采取自顶向下方法,将功效复杂程序分解为若干个功效单一模块,功效单一即软件理论中提及低耦合、高内聚,即各个模块之间没有交叉功效,这么一个模块错误不会涉及到其它模块,同时修改一个模块功效也不会影响其它模块,将程序进行模块化,降低了大型程序编制难度,提升了程序复用度,同时也使编程人员之间分工、协作成为可能,2/38,函数概述,C/C+,语言中程序模块经过“函数”来实现。函数是一个命名程序代码块,是程序完成其操作场所,是将功效重复程序段抽象出来所形成一个独立、可重复使用功效单元,一个完整,C/C+,语言程序由若干个函数组成,其中有且只有一个,main,函数,,main,函数是程序入口,由操作系统调用,在,main,函数中能够调用其它函数,以完成指定功效,其它函数之间能够相互调用,但不能调用,main,函数,3/38,简单示例,#include,using namespace std;,int add(int i1,int i2),int i;,i=i1+i2;,return i;,int main(),int a,b,c;,coutab;,c=add(a,b);,couta+b=cendl;,return 0;,4/38,函数定义,C/C+,语言中函数,必须先定义,后使用。在一个函数内部能够调用其它函数,但在一个函数内部不能嵌套地定义另一个函数,定义函数普通格式为:,返回类型 函数名(数据类型1 参数1,数据类型2 参数2,)语句序列,5/38,关于函数定义(一),函数首部,包含:返回类型、函数名称、参数列表,返回类型,为函数返回值类型,能够是系统任一基本数据类型或用户自定义一个数据类型,它要求了函数执行既定功效后,return,语句返回类型,又称为该,函数类型,。当一个函数不需要经过,return,语句返回一个值时,称为无返回值函数或无类型函数,此时需要使用,void,作为类型名,函数名称,是用户为函数所起名字,它是一个标识符,应符合,C/C+,标识符普通命名规则,用户经过使用这个函数名传递参数以调用该函数,6/38,关于函数定义(二),参数列表,能够包含任意多项(能够没有),当多于一项时,前后两个参数之间必须用逗号分开,用花括号括起来语句序列组成了,函数体,,即函数所完成详细操作,普通分为3部分:,第1部分为定义部分,定义函数执行过程中所需要一些常量或变量,第2部分为函数功效部分,完成函数功效,第3部分为返回值部分,返回函数结果,注意:每个函数都是一个功效独立模块,绝不允许在一个函数体内定义另一个函数,7/38,函数申明,函数必须先定义后使用,假如需要在定义前使用函数,则必须在使用前申明该函数,函数申明格式为(两种):,返回类型 函数名(数据类型1 参数1,数据类型2 参数2,.),;,返回类型 函数名(数据类型1,数据类型2,.),;注意:1)函数申明不包含函数体,最终必须以分号结束2)函数定义只能够一次,但申明能够屡次3)返回类型、函数名称、参数类型列表组成了函数原型(,prototype),8/38,函数调用,函数定义/申明之后就能够在需要时加以使用,即调用。函数调用格式为:,函数名(,实际,参数1,实际,参数2,.),形式参数函数定义中参数,用来接收主调函数传递数据,必须是,左值,。在调用前,并没有给它们分配内存,实际参数主调函数向被调函数传递数据,能够是,右值,,必须与形式参数一一对应,即个数相等且数据类型,相容,函数调用是一个表示式。表示式值就是被调函数返回值,它类型就是函数定义中指定函数返回值类型,即函数类型。假如函数返回值为,void,,说明该函数没有返回值,9/38,调用过程与数据传递,调用过程:,主调函数调用被调函数,执行流程转入被调函数函数体,执行指定功效,被调函数执行完之后,返回到主调函数,继续执行主调函数后续语句,数据传递,主调函数经过参数向被调函数传递数据,被调函数经过,return,语句向主调函数返回结果,10/38,函数调用底层开销,在系统内部,函数调用需要借用一个叫做“栈”数据结构来进行(栈显著特征是数据入出次序:先进后出),主调函数发出调用指令后,系统将主调函数中将要执行下一条语句地址保留到栈中,同时还要保留主调函数中其它相关数据保护现场,被调函数执行完成后,系统从栈中取出主调函数相关数据值、下一条语句地址恢复现场,使用栈能够确保函数逐层嵌套调用、逐层依次返回,11/38,定义/申明/调用练习,定义一个函数,用以实现数学上符号函数,并在主函数中调用以测试它,问题:假如函数定义代码在,main,函数代码之前、之中、之后会有什么情况?,12/38,参数值传递方式,前述把实参表示式值传送给对应形参变量传递方式称为,按值传递,,简称值传递(另外还有地址传递,在下一章介绍),使用值传递方式,即使实际参数是“左值”形式,形式参数值改变也不会造成实际参数所对应变量值改变(在地址传递中,实际参数必须是“左值”形式,形式参数改变必会造成实际参数所对应变量值改变),13/38,值传递示例,#,include,using namespace std;,void exchange(int i,int j),int temp;,temp=i;,i=j;,j=temp;,int main(),int a=10,b=20;,coutBefore exchange:a,bendl;,exchange(a,b);,coutAfter exchange:a,bC,n=2,时,,A-B,A-C,B-C,n=3,时,,A-C,A-B,C-B,A-C,B-A,B-C,A-C,n=4,时,?,分析:对于,n,个盘,假如,n-1,个盘移动步骤已知,则只要借助,C,将上面,n-1,个盘从,A,移动到,B,,接着将最大盘从,A,移动到,C,,最终再借助,A,盘,将,n-1,个盘从,B,移动到,C,20/38,汉诺塔递归方案图解,21/38,汉诺塔递归实现,/a,为原始位置,,b,为辅助位置,,c,为目标位置,void hanoi(int n,char a,char b,char c),if(n=1),couta,cendl;,else,hanoi(n-1,a,c,b);,couta,cendl;,hanoi(n-1,b,a,c);,22/38,汉诺塔递归函数测试,/,从,A,借助,B,到,C,int main(),int n;,coutn;,hanoi(n,A,B,C);,return 0;,23/38,内联函数,在定义函数时,在函数首部前面加上关键字,inline,,,则该函数就为内联函数,inline,函数类型 函数名(形式参数列表)语句序列,对于内联函数,编译器将函数体代码插入到函数调用处,将调用函数方式改为直接执行方式,这叫内联函数扩展,内联函数节约了程序调用时间开销,所以实际上是一个以,空间,换,时间,方案,从函数使用者角度看,,,调用内联函数和普通函数没有任何区分,24/38,内联函数说明,一个函数定义为内联函数,只是请求而不是命令编译器对它进行扩展,是否对一个内联函数进行扩展,完全由编译器自行决定。假如将一个较复杂函数定义为内联函数,大多数编译器会自动地将其作为非内联函数处理,假如仅在申明函数原型时加上关键字,inline,,并不能到达内联效果,内联函数定义必须出现在对该函数调用之前,25/38,带默认形参值函数,C/C+,语言允许在函数说明或函数定义中为形参预赋一个默认值,这么函数就叫做带有默认形参值函数,在调用带有默认参数值函数时,若为对应形参指定了实参,则形参将使用实参值;不然形参将使用其默认值,比如:,int sub(int x=8,int y=3)return x-y;void main()sub(20,15);/,传递给形参,x,y,值分别为20和15,sub(10);/,传递给形参,x,y,值分别为10和3,sub();/,传递给形参,x,y,值分别为8和3,26/38,带默认形参值函数说明(一),假如函数是先使用后定义,则必须在使用前进行申明。这种情况下,只能在申明时使用带默认值参数,假如需要屡次申明函数,则每次申明能够对参数指定不一样默认值,申明时指定参数默认值,一样能够省略变量名。比如:,int sub(int=8,int=3);,27/38,带默认形参值函数说明(二),若函数含有多个形参,则缺省形参值必须自右向左连续地定义,即在一个带默认值形参右边,不能有未指定默认值形参,调用一个函数时,假如省去了某个实参,则直到最右端实参都要省去,28/38,函数重载(,overload),函数重载就是两个以上函数,取相同函数名,不过它们形参个数或类型不一样,编译时依据实参和形参类型及个数最正确匹配,自动决定调用哪一个函数,比如:,int max(int,int);int max(int,int,int);float max(float,float);float max(float,float,float);,函数重载练习:阅读、录入、运行教材,P85,例4-7,29/38,函数重载说明,各个重载函数返回类型能够相同,也能够不一样。但假如函数名相同、形参表也相同,仅仅是返回类型不一样,则是非法,确定调用哪个重载函数过程称为绑定(,binding)。,绑定优先次序为:准确匹配、对实参类型向高类型转换后匹配、实参类型向低类型及相容类型转换后匹配,有两个重载函数,编译器不知道进行哪种类型转换、与哪个函数绑定,这种现象就叫绑定二义性(应该防止),30/38,函数模板,函数模板能够用来创建一个通用函数框架,以支持参数个数相同,参数类型、返回类型不一样函数,函数模板定义后,使用前需要实例化该模板,以生成一个详细函数(称为模板函数)。实例化过程实际上就是将模板参数表中,参数化类型,替换成指定,详细类型,31/38,函数模板定义,函数模板定义形式为:,template,/,class,也能够是,typename,返回类型 函数名(形参表)语句序列,比如,/将,add,函数定义成了一个函数模板,template T add(T x,T y)return x+y;,32/38,函数模板使用,函数模板使用前必须进行实例化,实例化有两种形式,显式实例化调用时明确传递类型参数。比如:,add(8,9)/,将模板中全部,T,类型替换为,double,隐式实例化调用时不传递类型参数,只是经过实际参数类型来确定类型参数。比如:,add(8.0f,9.0f)/,依据“,8.0f,9.0f”,推断模板中全部,T,类型为,float,并进行替换,33/38,函数模板完整示例,#include,using namespace std;,template,T1 plus(T1 x,T2 y),coutsizeof(T1),sizeof(T2)endl;,return x+y;,int main(),coutplus(9,8)endlendl;,cout(9,8)endlendl;,coutplus(9.5,8.0)endlendl;,cout(9.5,8.0)endlendl;,return 0;,34/38,系统函数介绍,C,+,不但允许我们依据自己需要定义函数,同时还提供了大量标准库函数,作为系统组成部分,以处理大多数常见问题,这些函数原型在对应头文件中,使用时需要包含对应头文件,对于惯用数学函数包含在,cmath,头文件中,能够经过系统函数手册查阅。其它函数一样能够查阅,35/38,综合练习(一),使用函数计算两个或三个整型数和,有哪些方案?试编制对应程序,使用函数计算两个数之乘积,两个数类型均为整型或实型,或者前一个整型后一个实型,有哪些方案?试编制对应程序,将输出100(不含100)以内素数程序进行模块化,改进,36/38,综合练习(二),将教材,P69(10),处理方案划分为多个模块,重新编制,程序,将教材,P69(11),处理方案划分为多个模块,重新编制,程序,对于计算机能够表示、任意大小正整数,按次序从左到右输出各个数字。试将该问题处理方案模块化,并编制对应,程序,37/38,课堂练习,教材,P95 5.,编程题(5),38/38,
展开阅读全文

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


开通VIP      成为共赢上传

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

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

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

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

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

gongan.png浙公网安备33021202000488号   

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

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

客服