函数市公开课一等奖省赛课微课金奖课件_第1页
函数市公开课一等奖省赛课微课金奖课件_第2页
函数市公开课一等奖省赛课微课金奖课件_第3页
函数市公开课一等奖省赛课微课金奖课件_第4页
函数市公开课一等奖省赛课微课金奖课件_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第4章函数学习目标掌握函数申明和定义、函数调用及函数参数传递过程了解关键字inline含义与使用掌握递归函数定义及使用掌握函数重载定义及使用掌握函数模板定义及使用了解各类系统函数,掌握惯用系统函数使用1/38程序模块结构化程序设计,要求采取自顶向下方法,将功效复杂程序分解为若干个功效单一模块功效单一即软件理论中提及低耦合、高内聚,即各个模块之间没有交叉功效,这么一个模块错误不会涉及到其它模块,同时修改一个模块功效也不会影响其它模块将程序进行模块化,降低了大型程序编制难度,提升了程序复用度,同时也使编程人员之间分工、协作成为可能2/38函数概述C/C++语言中程序模块经过“函数”来实现。函数是一个命名程序代码块,是程序完成其操作场所,是将功效重复程序段抽象出来所形成一个独立、可重复使用功效单元一个完整C/C++语言程序由若干个函数组成,其中有且只有一个main函数,main函数是程序入口,由操作系统调用在main函数中能够调用其它函数,以完成指定功效,其它函数之间能够相互调用,但不能调用main函数3/38简单示例#include<iostream>usingnamespacestd;intadd(inti1,inti2){ inti; i=i1+i2; returni;}intmain(){inta,b,c;cout<<"pleaseinputtowintegers:";cin>>a>>b;c=add(a,b);cout<<a<<"+"<<b<<"="<<c<<endl;return0;}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<iostream>usingnamespacestd;voidexchange(inti,intj){ inttemp; temp=i; i=j; j=temp;}intmain(){inta=10,b=20;cout<<"Beforeexchange:"<<a<<","<<b<<endl;exchange(a,b);cout<<"Afterexchange:"<<a<<","<<b<<endl;return0;}14/38函数嵌套调用C/C++语言中,函数定义是相互独立,即函数和函数之间没有隶属关系,在一个函数内部不能嵌套定义另一个函数不过,在一个函数内部能够调用另外一个函数(不能调用主函数),被调用函数又能够调用其它函数,甚至能够调用函数本身,即函数调用能够嵌套嵌套调用练习:录入、调试、运行教材P76[例4-3]15/38函数递归调用在调用一个函数过程中又直接或间接地调用该函数本身现象,叫做函数递归调用。递归调用分为直接递归调用和间接递归调用两种直接递归调用:在一个函数内部直接调用函数本身间接递归调用:在一个函数内部调用其它函数,其它函数又反过来调用该函数16/38递归方法分析递归方法是从未知结果出发,依据递推关系,依据某个性质相同、规模较小结果计算该结果,假如小规模结果也未知,重复递推,直到小规模结果已知为止;然后,经过递推关系,反推出最终结果初值(递推终止条件)+递推关系是设计递归函数关键递归函数定义普通形式为:

函数类型递归函数名f(规模参数x,其它参数)

{

if(x==初值)

结果=初值;

else

结果=含f(x-1)表示式;//x-1表示相邻较小规模

返回结果;

}17/38递归函数练习录入、调试、运行教材P77[例4-4]问题:教材中程序能计算0!吗?假如不能怎么改?该问题递推终止条件是什么?递推关系表示式是什么?由已知结果反推最终止果,编程时需要编写与该过程对应代码吗?递归函数执行分哪两个阶段?18/38作业教材P921.填空题之(1)(2)(3)(6)19/38汉诺塔问题有三根针A、B、C,A针从上到下穿有从小到大n个盘,B、C两针为空。要求借助B针,把A针上盘移到C针上。规则是:每次只能移动一个盘,且在移动过程中,每个针上必须保持盘从上到下、从小到大状态例解:n=1时,A->Cn=2时,A->B,A->C,B->Cn=3时,A->C,A->B,C->B,A->C,B->A,B->C,A->Cn=4时,?分析:对于n个盘,假如n-1个盘移动步骤已知,则只要借助C将上面n-1个盘从A移动到B,接着将最大盘从A移动到C,最终再借助A盘,将n-1个盘从B移动到C20/38汉诺塔递归方案图解21/38汉诺塔递归实现//a为原始位置,b为辅助位置,c为目标位置voidhanoi(intn,chara,charb,charc){if(n==1)cout<<a<<"->"<<c<<endl;else{hanoi(n-1,a,c,b);cout<<a<<"->"<<c<<endl;hanoi(n-1,b,a,c);}}22/38汉诺塔递归函数测试//从‘A’借助‘B’到‘C’intmain(){ intn; cout<<"Pleaseinputthenumber:"; cin>>n; hanoi(n,'A','B','C'); return0;}23/38内联函数在定义函数时,在函数首部前面加上关键字inline,则该函数就为内联函数

inline函数类型函数名(形式参数列表)

{

语句序列

}对于内联函数,编译器将函数体代码插入到函数调用处,将调用函数方式改为直接执行方式,这叫内联函数扩展内联函数节约了程序调用时间开销,所以实际上是一个以空间换时间方案从函数使用者角度看,调用内联函数和普通函数没有任何区分24/38内联函数说明一个函数定义为内联函数,只是请求而不是命令编译器对它进行扩展,是否对一个内联函数进行扩展,完全由编译器自行决定。假如将一个较复杂函数定义为内联函数,大多数编译器会自动地将其作为非内联函数处理假如仅在申明函数原型时加上关键字inline,并不能到达内联效果内联函数定义必须出现在对该函数调用之前25/38带默认形参值函数C/C++语言允许在函数说明或函数定义中为形参预赋一个默认值,这么函数就叫做带有默认形参值函数在调用带有默认参数值函数时,若为对应形参指定了实参,则形参将使用实参值;不然形参将使用其默认值比如:

intsub(intx=8,inty=3)

{

returnx-y;

}

voidmain()

{

sub(20,15);//传递给形参x,y值分别为20和15

sub(10);//传递给形参x,y值分别为10和3

sub();//传递给形参x,y值分别为8和3

}26/38带默认形参值函数说明(一)假如函数是先使用后定义,则必须在使用前进行申明。这种情况下,只能在申明时使用带默认值参数假如需要屡次申明函数,则每次申明能够对参数指定不一样默认值申明时指定参数默认值,一样能够省略变量名。比如:

intsub(int=8,int=3);27/38带默认形参值函数说明(二)若函数含有多个形参,则缺省形参值必须自右向左连续地定义,即在一个带默认值形参右边,不能有未指定默认值形参调用一个函数时,假如省去了某个实参,则直到最右端实参都要省去28/38函数重载(overload)函数重载就是两个以上函数,取相同函数名,不过它们形参个数或类型不一样编译时依据实参和形参类型及个数最正确匹配,自动决定调用哪一个函数比如:

intmax(int,int);

intmax(int,int,int);

floatmax(float,float);

floatmax(float,float,float);函数重载练习:阅读、录入、运行教材P85[例4-7]29/38函数重载说明各个重载函数返回类型能够相同,也能够不一样。但假如函数名相同、形参表也相同,仅仅是返回类型不一样,则是非法确定调用哪个重载函数过程称为绑定(binding)。绑定优先次序为:准确匹配、对实参类型向高类型转换后匹配、实参类型向低类型及相容类型转换后匹配有两个重载函数,编译器不知道进行哪种类型转换、与哪个函数绑定,这种现象就叫绑定二义性(应该防止)30/38函数模板函数模板能够用来创建一个通用函数框架,以支持参数个数相同,参数类型、返回类型不一样函数函数模板定义后,使用前需要实例化该模板,以生成一个详细函数(称为模板函数)。实例化过程实际上就是将模板参数表中参数化类型替换成指定详细类型31/38函数模板定义函数模板定义形式为:

template<class

类型名1,class

类型名2,...>//class也能够是typename

返回类型函数名(形参表)

{

语句序列

}比如

//将add函数定义成了一个函数模板

template<classT>

Tadd(Tx,Ty)

{

returnx+y;

}32/38函数模板使用函数模板使用前必须进行实例化,实例化有两种形式显式实例化——调用时明确传递类型参数。比如:

add<double>(8,9)//将模板中全部T类型替换为double隐式实例化——调用时不传递类型参数,只是经过实际参数类型来确定类型参数。比如:

add(8.0f,9.0f)//依据“8.0f,9.0f”推断模板中全部T类型为float,并进行替换33/38函数模板完整示例#include<iostream>usingnamespacestd;template<classT1,classT2>T1plus(T1x,T2y){cout<<sizeof(T1)

温馨提示

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

评论

0/150

提交评论