C++课件C++_第五章_第1页
C++课件C++_第五章_第2页
C++课件C++_第五章_第3页
C++课件C++_第五章_第4页
C++课件C++_第五章_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1,第5章 函数,5.1 函数的定义 5.2 函数的调用与参数传递 5.3 函数的嵌套与递归 5.4 带默认形参值的函数,5.5 内联函数 5.6 指针型函数 5.7 函数重载 5.8 C+库函数及其使用,2,思考: 1、为什么要用函数? 2、函数都应该有哪些要素呢?,判断当前变量x的值是否为偶数 简单的选择结构即可实现: if (x%2= =0) cout“Yes.n“; else cout“No.n”; 如果要多次应用呢? 以一个名字来代替:IfEven(),3,5.1 函数的定义,5.1.1 函数的作用 整个程序划分为若干个功能较为单一的程序模块,然后分别予以实现,这些模块就是一个个的函数。 函数的本质有两点: (1) 函数由能完成特定任务的独立程序代码块组成,如有必要,也可调用其它函数,来产生最终的输出。 (2) 函数内部工作对程序的其余部分是不可见的。,4,5.1 函数的定义,5.1.2 函数的定义 C+中函数定义的格式为: 函数类型 函数名(形式参数列表) 函数体 其中: 函数类型用来限定该函数执行的结果,即返回值的类型,若函数不需要返回值,则可以用void来说明。 函数名是任意合法的C+标识符,并以能代表该函数所执行的功能为宜。,5,5.1 函数的定义,形式参数列表用以声明该函数得以实现所需的数据支持,形式为:类型1 形参1,类型2 形参2,类型n 形参n 以上三部分共同构成函数首部。 函数体是完成该功能所需要的语句序列,以一对大括号“”包围。 此外,有返回值的函数,其return语句的形式为: return (表达式);,6,5.1 函数的定义,5.1.3 函数原型声明 原型声明的语法形式为: 函数类型 函数名(形参列表); 其中形参列表的形式为: 类型1 形参名1, 类型2 形参名2, 类型n 形参名n 注:在原型声明时,仅给出该函数的首部,并且形参的名字可以省略。,7,【例5-1】完善判断任意正整数是否为偶数的函数,并在主函数中调用它,反复对输入数据进行判断,直到输入是0为止。 方法一:函数先定义,再调用。 第一步:定义函数 void IfEven(int x) if(x%2=0) cout“Yes.n“; else cout“No.n“; ,8,第二步:调用 int main() int n; cout=0):t“; cinn; while(n!=0) IfEven(n); /函数调用 cout=0):t“; cinn; cout“Finished.n“; return 0; ,9,方法二:函数先声明,定义在调用之后。 void IfEven(int ); /函数声明,可省略形参名 int main() int n; cout=0):t“; cinn; while(n!=0) IfEven(n); /函数被调用 cout=0):t“; cinn; cout“Finished.n“; return 0; ,10,/定义函数 void IfEven(int x) if(x%2=0) cout“Yes.n“; else cout“No.n“; ,11,5.2 函数的调用与参数传递,主调函数:调用其它函数的函数称为 被调函数:相应的被调用的函数称为 5.2.1 函数调用形式 C+中函数调用时的语法形式为: 函数名(实参列表) 注:实参列表中要给出与函数定义时所声明的相同个数和类型的实参,如果函数定义时没有声明形参,实参列表为空。,12,5.2 函数的调用与参数传递,5.2.1 函数调用形式 函数调用可以有三种表现形式: 函数调用语句 函数调用表达式 函数调用作参数 注:后两种方式仅适用于具有返回值的函数。,13,void fun1( ) cout“Test“endl; int fun2(int a) return +a; void main() fun1( ); int b=fun2(1); int c=fun2( fun2(b)+5 ); ,14,5.2 函数的调用与参数传递,5.2.2 函数调用执行过程,15,5.2 函数的调用与参数传递,5.2.3 函数的参数传递 1. 形式参数 形式参数是指在函数的定义或原型声明时函数名后的一对圆括号中所列的参数。 2. 实际参数 实际参数是指在调用函数时函数名后的一对圆括号中所列的参数。在函数被调用时,形式参数被创建并由实际参数完成其初始化工作。,16,5.2 函数的调用与参数传递,5.2.3 函数的参数传递 参数传递方式有两种,一种是值传递,另一种是址传递。 1. 值传递 当形参是指针、数组、引用以外的基本变量时,形实结合为值传递,实参将自己的值传递给形参,这种方式也称单向传递,即形参的变化不会影响到实参。 2. 址传递 与值传递相对,当形参是指针、数组或引用时,形实结合为址传递,实参将自己的地址传递给形参,这种方式也称双向传递,形参的变化会直接影响到实参。,17,void f(int a,int ,18,引用作参数时与指针作参数有如下的比较关系: (1)传递引用给函数与传递指针的效果是一样的。 (2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作。 如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。,19,5.3 函数的嵌套与递归,5.3.1 嵌套调用 函数的嵌套调用指的是一个函数在被调用执行的过程中,又调用了另一个函数。 【例5-8】求圆环的面积。 double area(double r) return 3.1416*r*r; double sub(double a,double b) return area(a)-area(b); ,20,void main( ) double x,y; coutx; couty; cout“Area of the Ring: “sub(x,y)endl; ,21,5.3.2 递归调用 函数的递归调用是指函数直接或间接地调用它自身 递归函数如何定义和使用? long Fac(long n) if (n=1) return 1; return n*Fac (n-1); int x =Fac(3);/ 如何调用?,22,int x = Fac(3) = 6,Return 3*Fac(2) ,Return 2*Fac(1) ,Return 1 ,23,【例5-11】猴子吃桃问题。有一天猴子在桃子园中摘了若干桃子,当即吃了一半,觉得不过瘾又吃了一个,第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第天早上想再吃吃,见只剩个桃子了。求第一天摘了多少桃子。 程序分析: 已知条件是第天有个桃子,以及猴子吃桃子的规律。用n来表示天数,peach(n)表示第n天有的桃子数,则peach(1)为所求。,24,int peach(int n) if(n=10) return 1; else return 2*(peach(n+1)+1); void main() for(int i=10;i1;i-) cout“Day “i“ left peaches: “peach(i)endl; cout“The first day pick peach: “peach(1)endl; ,25,程序运行结果: Day 10 left peaches: 1 Day 9 left peaches: 4 Day 8 left peaches: 10 Day 7 left peaches: 22 Day 6 left peaches: 46 Day 5 left peaches: 94 Day 4 left peaches: 190 Day 3 left peaches: 382 Day 2 left peaches: 766 The first day pick peach: 1534,26,5.4 带默认形参值的函数,函数在定义时,可以预先声明默认的形参值。在调用该函数时,如果给出了实参则用实参初始化形参,否则用默认形参值初始化。例如: int sum(int a=1,int b=2,int c=3) return a+b+c; void main( ) coutsum()endl; /6 coutsum(10)endl; /15 coutsum(10,20)endl; /33 coutsum(10,20,30)endl; /60 ,27,5.4 带默认形参值的函数,声明默认形参值时应注意的问题: 1. 默认形参值要么全部声明,要么必须从右向左连续声明。这是由于函数调用时实参是按从左向右的顺序依次初始化形参。相应地,在调用函数时,实参值要么全部指定,要么必须从左向右连续指定。 int sum(int a=1,int b=2,int c=3); /正确 int sum(int a,int b=2,int c=3); /正确 int sum(int a,int b=2,int c); /错误 int sum(int a=1,int b=2,int c); /错误,28,5.4 带默认形参值的函数,声明默认形参值时应注意的问题: 2. 如果函数调用出现在定义之前,则默认形参要在函数原型中给出。如: int add(int x=5,int y=6); void main(void) add(); /调用在定义前 int add(int x,int y) return x+y; 3. 在相同的作用域内,默认形参值应唯一。但如果在不同的作用域内,允许说明不同的默认形参。,29,5.5 内联函数,1. 内联函数的定义 inline 函数类型 函数名(形参列表)函数体 注: (1)当函数既有原型声明又有定义时,仅在原型声明时修饰一次 (2)编译时内联函数在调用处用函数体进行替换,节省了参数传递、控制转移等开销。 2. 定义内联函数时应该注意: (1)内联函数体内不能有循环语句和switch语句。 (2)内联函数的声明必须出现在内联函数第一次被调用之前。 (3)对内联函数不能进行异常接口声明。,30,#include using namespace std; inline double CalArea(double radius) return 3.14*radius*radius; int main( ) double r(3.0); double area; area=CalArea(r); coutareaendl; return 0; ,31,5.6 指针型函数,指针型函数的声明形式为: 数据类型* 函数名(形参表); 当函数的返回值是地址时,该函数就是指针形函数。 通常返回不能是局部变量的地址,32,int* findmax(int x,int n) int *pmax=x; for(int i=1;i*pmax) pmax= ,33,程序运行结果: Each item located in: 0x0012FF58 0x0012FF5C 0x0012FF60 0x0012FF64 0x0012FF68 0x0012FF6C 0x0012FF70 0x0012FF74 0x0012FF78 0x0012FF7C max value locate in :0x0012FF74,34,5.7 函数重载,5.7.1 什么是函数重载 在C+程序中,可以将语义、功能相似的几个函数用同一个名字表示,称为函数重载。这样便于记忆,使函数更接近它功能抽象的本质,提高了程序的可读性,这是C+语言采用重载机制的一个理由 实质是函数名相同,参数不同的多个函数,35,int add(int a,int b) cout“int add .“endl; return a+b; float add(float a,float b) cout“float add .“endl; return a+b; double add(double a,double b) cout“double add .“endl; return a+b; ,36,void main( ) coutadd(1,2)endl; coutadd(1.1f,2.2f)endl; coutadd(1.1,2.2)endl; 程序运行结果: int add . 3 float add . 3.3 double add . 3.3,37,5.7.2 函数重载的应用 在使用重载机制前首先应注意以下问题: 1. 编译器根据同名函数的形参表中参数个数和(或)类型不同自动匹配函数体。 int fun(); int fun(int a); /形参个数不同,重载 int fun(double a); /形参类型不同,重载 double fun(double a); /仅函数类型不同,不能构成重载,38,2. 不要将功能不同的函数定义为重载函数。重载机制不会认为这样做是错误的,但这样做只会为编程人员自己带来误解和混淆。如: int fun(int a,int b,int c) return a+b+c; float fun(float a,float b,float c) return a-b-c;,39,3. 避免默认形参值造成的歧意 int fun(); int fun(int a=3); void main() fun( ); 将报告歧意错误,因为2个函数都可以不接受参数,编译器无法辨别调用哪一个函数 。,40,#include #include “math.h“ int area(int a,int b) cout“计算矩形面积,结果为:“; return a*b; double area(double a) cout“计算圆形面积,结果为:“; return 3.141

温馨提示

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

评论

0/150

提交评论