已阅读5页,还剩67页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数,1. 什么是函数?,2. 函数的定义和说明,3. 函数的参数和返回值,主要内容,4. 函数的参数和返回值,5. 函数的调用方式,6. 函数的嵌套调用和递归调用,2,什么是函数,编写函数,计算并打印若干给定整数(1、3、4)的阶乘,要求每次打印数据后打印一行星号(10个)。 1 * 6 * 24 * ,3,什么是函数,void main() int a=1,b=3,c=4; int v=1; while(a0) v*=a; a-; coutv; for(int i=0;i10;i+) cout“*“; coutendl;,v=1; while(a0) v*=a; a-; coutv; for(int i=0;i10;i+) cout“*“; coutendl;,4,什么是函数,int getfact(int m) int v=1; while(m0) v*=m; m-; return v; void coutstar( ) for(int i=0;i10;i+) cout“*“; coutendl;,void main() int a=19,b=123,c=67; coutgetfact(a); coutstar(); coutgetfact(b); coutstar(); coutgetfact(c); coutstar(); ,5,参数类型 参数名,函数名,返回类型,函 数 体,函数调用(参数传递),什么是函数,为什么需要函数 提高效率,减少重复编写程序的工作量。 一个较大的程序不可能完全由一个人完成,更不可能把所有代码放在一个主函数中。 什么是函数 函数(function)就是一段实现某个功能的代码。,6,什么是函数,一个程序包含若干个函数(但只有一个主函数),程序从主函数开始执行。 执行过程中,主函数调用其它函数,其他函数相互调用。 实际应用中,主函数一般比较简单,作用就是调用其它函数,而程序的功能全部都是由函数实现的。,7,函数的定义和说明,1、函数的定义格式 () 若干条语句(函数体) 返回类型包含存储类型和数据类型,存储类型省略为外部函数,数据类型不能省略。 参数列表由若个参数组成,参数间用逗号分隔,给出参数名时还要给出参数的数据类型。,8,函数的定义和说明,注意: 1、函数的类型即函数返回值的类型,如果函数没有返回值则返回类型为void。 void coutstar() 2、参数定义方式 int getfact(int m) ,9,什么是函数,void coutstar () for(int i=0;i10;i+) cout“*“; coutendl; ,int getfact(int m) int v=1; while(m0) v*=m; m-; return v; ,10,什么是函数,void main() int a=1,b=3,c=4; coutgetfact(a); coutstar(); coutgetfact(b); coutstar(); void coutstar() int getfact(int m) ,void coutstar() int getfact(int m) void main() int a=1,b=3,c=4; coutgetfact(a); coutstar(); coutgetfact(b); coutstar(); ,11,函数说明 int getfact(int); void coutstar();,函数的定义和说明,2、函数的说明 如果函数定义在前,调用在后,调用前可以不说明。如果函数定义在调用之后,则必须在调用前说明函数的类型,名称和参数。 说明格式: () 例如,有函数定义如下:int getfact(int m) 原型说明:int getfact(int),要与定义时顺序和类型相一致,可省略参数名,12,函数的定义和说明,void main() int a=1,b=3,c=4; void coutstar(); int getfact(int m); coutgetfact(a); coutstar(); void coutstar() int getfact(int m) ,void coutstar(); int getfact(int m); void main() int a=1,b=3,c=4; coutgetfact(a); coutstar(); void coutstar() int getfact(int m) ,13,函数的参数和返回值,1、函数的参数 在定义函数时,函数名后括号中的变量名为形式参数(形参)。 定义函数时,必须写出形参的个数、类型和名字。 当调用一个有参数的函数时,直接写函数名调用函数,函数名后括号中的参数为实际参数(实参)。 实参不加数据类型,可以是常量、变量、表达式。,14,函数的参数和返回值,1、函数的参数 在未被调用时,形参没有确定值,只是形式上的参数,只有被调用时才从调用函数中获得实际参数。,void fun(int m) coutm; void main() int a=100; fun(a); fun(10); fun(10+a); ,m,100,15,函数的参数和返回值,函数参数的求值顺序 参数的求值顺序因编译系统不同而不同,一般来说不会引起参数值不同,但在具有副作用的表达式中可能会造成二义性。 int a=5; fun(a+,a); 编写程序要避免实参表达式中出现具有副作用的表达式,16,6.1,#include int fun(int a,int b) return a+b; void main() int a(13),b(25); int sum=fun(a-1,a-b); coutsumendl; ,17,函数的参数和返回值,函数参数的默认值 在定义或说明函数时通过设置参数的默认值,可以方便函数在调用时只写出部分参数。 例如 double fun(double a=1.5,double b=2.6) 在函数被调用时,如果对应实参无值,则用形参的默认值,如对应实参有值,则用实参值,默认值无效。 fun(); /a=1.5,b=2.6 fun(1.0) /a=1.0,b=2.6,18,函数的参数和返回值,如,double fun(double a,double b=2.6),则以下调用函数语句有无错误? fun(); fun(1.2); fun(1, 3); 又如double fun(double a=1.5,double b),则以下调用语句有无错误? fun(1.2);,19,函数的参数和返回值,注意 设置形参的默认值要求从参数的右端开始,在指定了默认值的参数右端不允许出现没有指定默认值的参数。 如果一个函数需要说明时,设置参数默认值应放在说明函数的语句中,不放在定义函数的语句中。 参数默认值可以只用表达式,20,6.2,#include void main() void fun(int i=1,int j=2,int k=3); fun(); fun(4); fun(5,6); fun(7,8,9); void fun(int i,int j,int k) couti+j+kendl; ,21,函数的参数和返回值,函数返回值的实现 函数可以有返回值也可以没有返回值。没有返回值的函数类型为void,return语句可以省略。 在函数中实现返回值的方法是使用带有表达式的return语句:return表达式; 一个函数可以有一个以上return语句,执行到哪一个return语句,哪一个return语句起作用。 return后的表达式可以加括号,可以不加,22,函数的参数和返回值,return 表达式;的执行过程; 先计算表达式值; 当表达式值同函数返回类型不一致时,应将表达式值转换为返回类型; 将表达式值返回给调用函数,作为调用函数的值 将程序的控制权返回到调用函数语句,执行调用函数下面的语句。,23,6.4,#include int fun(double a,int b) return a-b; void main() double x(11.5); int y(10); double z=fun(x,y); coutzendl; ,24,函数的调用方式,函数根据调用方式分为传值调用和引用调用。 传值调用 函数调用时,将实参的值传递给形参的调用方式。传值调用中有个分为传值和传地址两种。 传值是指传递变量或表达式的值 传地址是指传递变量的地址值,25,函数的调用方式,1、传值调用 实参为表达式,形参为变量 实参复制一个副本给形参,在被调用函数中形参的值被改变时,实参不会受到影响。,26,传值调用,27,回顾,注意: 当形参是普通变量时,实参可以是变量、常量、表达式,这时形参收到的是实参的值。 传参的过程就是初始化形参的过程(开辟空间+赋值) 传值方式不能通过改变形参来改变实参,28,函数的嵌套调用和递归调用,函数的嵌套调用 嵌套调用是指在一个函数体中调用另一个函数。 注意,函数可以嵌套调用,但是不能嵌套定义!,29,函数的嵌套调用和递归调用,#include void fun1(),fun2(),fun3(); void main() cout“It is in main().“endl; fun2(); cout“Ti is back main().“endl; void fun1() cout“It is in fun1().“endl; fun3(); cout“It is back in fun1().“endl; ,30,函数的嵌套调用和递归调用,void fun2() cout“It is in fun2().“endl; fun1(); cout“It is back in fun2().“endl; void fun3() cout“It is in fun3().“endl; ,31,函数的嵌套调用和递归调用,函数的递归调用 递归调用是指在一个函数体中直接或间接调用自己。,32,递归调用,采用递归调用可以解决的问题是有限的,这些问题具有以下特点: 能够将原有问题分解为一个新问题,而这个新问题又要用原有问题的解决方法。按这一特点将问题分解下去,每次出现的新问题都是原有问题的简化的子问题;(规模变小,形式不变) 最终分解出来的新问题是具有已知解的问题。(有限),33,递归,从键盘输入一个正整数,编程求出该函数的阶乘,要求使用递归调用的方法。 0!=1 1!=1 2!=1*2 3!=1*2*3 n!=1*2*3*n,=1!*2 =2!*3 =(n-1)!*n,34,递归,long fact(int n) int c; if(nn; coutfact(n)endl; ,35,主函数 void main( ) int fact(int n) fact(n),主函数 void main( ) int fact(int i) fact(n),递归,long fact(int n) int c; if(nn; coutfact(n)endl; ,重载函数,请编写绝对值函数,函数返回参数的绝对值。 1、参数为int类型 2、参数为double类型 3、参数为long类型 int abs(int i) return (i0?i,-i); double abs1(double i) return (i0?i,-i); ,long abs2(long i) return (i0?i,-i); void main() coutabs(-10); coutabs1(-2.5); ,37,重载函数,为什么要重载函数 具有相同功能的函数如果不能用一个函数名,会给编写和使用带来不变。 C+运行多个函数具有相同的函数名,但其中任意两个函数的参数个数、参数类型、类型顺序不能完全相同。,38,重载函数,int fun( ); int fun(int ); int fun( double); int fun(int , double); int fun( double, int ); float fun( int );,int a=1;double d=2.5; coutfun(d); coutfun(d,a); coutfun(a,d); coutfun(a);,39,重载函数,重载和函数的默认参数可能会冲突,如果有冲突,不能同时使用。 int fun(int ); int fun(int a=10 , double d=100); int main() coutfun(1); ,40,重载函数,int max(int,int),max(int,int,int),max(int,int,int,int); void main() coutb?a:b; int max(int a,int b,int c) int t=max(a,b); return max(t,c); ,int max(int a,int b,int c,int d) int t1=max(a,b); int t2=max(c,d); return max(t1,t2); ,41,例题:输入两个数,求最大数并输出。,1)如果是输入的是整数 int max(int x,int y); return(xy)?x:y ; 2)如果是输入的是单精度数 float max( float x,float y) return (xy)? x:y ; 3)如果是输入的是字符 char max(char x,char y) return (xy)? x:y ;,T max(T x,T y) return (xy)? x:y ;,函数模版,函数模版,函数模版的一般格式为: template (形式参数表) /函数体 ;,模版关键字,class和typename必选其中之一,函数模版是用来定义个通用的函数,以支持不同类型参数使用。,函数模版是一种不指定某些参数的数据类型的函数,在函数模版被调用时根据实际参数的类型决定这些函数模版的类型。,函数模版实例1:求两个数的最大值并输出。,# include template T MAX (T x,T y) return (xy)? x:y; void main() int a(4),b(6); char m(a),n(b); coutMAX(a,b)endl; coutMAX(m,n)endl; ,函数模版 (仅仅是个说明,不能执行),模版参数实例化,编译器通过实参的类型推导出函数模版的类型参数。,函数模版实例2,题目:定义一个函数模版,实现对两个数的求和功能。 解:定义一个函数模版Add(),它的功能是对传来的两个参数进行求和运算。这两个参数可以是任何类型的参数。,#include void main() int x=3, y=5; float x1=12.3, y1=3.4; double x2=0.8, y2=23.5; cout”整数型:x+y=”Add(x, y)endl; cout”浮点型:x+y=”Add(x1, y1)endl; cout”双精度:x+y=”Add(x2, y2)endl; ,函数模版,template T Add(T x, T y) return x+y; ,函数模版练习,使用函数模板实现任意两个同类型的数的交换。,# include void main() int a(10),b(20); swap(a,b); cout“swap a,b“a“ “bendl; ,template void swap(T ,函数模版含有两个以上其不同参数。,定义函数模版时可以使用多个类型参数,每个类型参数前面只需加上关键字class,用逗号分割: template 例如: template T1 Max(T1 x, T2 y) return x=y ? x: (T1) y;,内联函数,调用函数需要一定的时间和空间开销: void main( ) a( ); ,void a( ) ,49,内联函数,C+提供了一种高效方式:在编译时将所调用函数的代码直接嵌入到调用函数中,而不是流程转出去,这种被调用函数叫内联函数。 指定内联函数只需在函数首行的左端加一个“inline”关键字。,50,内联函数, inline int max(int, int); int main() int i=1, j=20; coutmax(i, j); inline int max(int a, int b) if(ab) a=b; return a; , int main() int i=1, j=20; int m; int a, b; a=i;b=j if(ab) a=b; m=a; coutm; ,51,内联函数,对函数进行内联声明,可以看成是程序设计者对编译系统提出一个建议,而不是强制命令。编译系统会自己决定是否采用内联形式编译源文件。 只有规模比较小(5个语句以下),调用比较频繁的简单函数适合作为内联函数。 内联函数可以有选择语句,不能包含复杂控制语句,如循环和开关语句。,52,标识符的作用域和生命期,标识符:变量名、常量名、函数名、 标识符的作用域 作用域就是变量的有效范围,在作用域以外是无法访问这些变量的。 变量只能在说明它和定义它的范围是可见的。 根据作用域不同,变量分为全局变量和局部变量两种。,53,变量的作用域和生命期,局部变量: 在一个函数(或复合语句)内部定义的变量是局部变量,它只在函数(或复合语句)内有效,函数(或复合语句)外是不能访问这些变量的。 全局变量: 在函数外部定义的变量是全局变量,它的有效范围从定义开始到文件结束。,54,变量的作用域和生命期,int a=0; /全局 int main( ) int b, c int i, j; ,for(int i=0;i6;) int i=7; float a=5f; coutiendl; i+; coutiendl; /coutaendl; ,55,变量的作用域和生命期,注意: 形式参数属于局部变量,相当于定义在函数内。 不同函数中可以使用相同的变量名,使用不同内存单元,互不干扰。 作用域重叠的变量,取最近定义有效。 全局变量不宜定义过多,为降低程序的清晰性和通用性。 全局变量有默认值:char型变量为空,int型变量为0,浮点型变量为0.0。,56,变量的作用域和生命期,int i(0); void main() int i=10; for(int j(1);j=2;j+) int i=100; j+; couti,jendl; couti,jendl; i=fun(); couti,jendl; ,int fun() return i; ,57,变量的作用域和生命期,变量的生命期 变量有诞生到消亡的过程。 生命期就是变量从开始在内存中占用存储单元到撤销所占内存单元的一段时间。 变量的生命期同它的存储类型有关。根据存储类型的不同,变量分为动态变量和静态变量两种。,58,变量的作用域和生命期,动态存储方式是指在程序运行期间,系统对变量动态地分配存储空间。 动态存储区存放以下变量: 1、函数的形参,在函数调用时分配单元 2、函数中的自动变量(未加static的局部变量) 系统在函数调用开始时分配动态空间,函数结束时,释放这些空间。由于是动态分配的,两次调用同一个函数时,函数中的变量所占存储单元可能不一样。,59,变量的作用域和生命期,静态存储方式是指在程序运行期间,系统对变量分配固定的存储空间。 全局变量,在程序开始执行时,为他们分配固定的存储单元,程序结束释放这些空间。 静态局部变量(函数中加static的局部变量),第一次被调用时分配空间,此后一直存在静态存储区,直到程序运行结束。,60,void fun(); void main() for(int i(0);i4;i+) fun(); void fun() int a(0); a+; static int b; b+; cout“a=“a,“b=“bendl; ,61,变量的作用域和生命期,注意: 静态局部变量(函数中加static的局部变量),具有默认值,与全局变量一样。char型变量为空,int型变量为0,浮点型变量为0.0。,62,int fac(int); void main() int s(0); for(int i(1);i=5;i+) s+=fac(i); cout“result=“sendl; int fac(int n) static int b=1; b*=n; cout“b=“bendl; return b; ,63,函数的存储类,外部函数,可以在定义它的程序文件和外部程序文件调用。 extern (参数列表) 其中,extern可以省略。 P112 例5.20,体会多源程序文件。,64,函数的存储类,内部函数,只能在定义它的程序文件中使用。 static (参数列表) ,65,练习观察程序有无错误,#include void main() fun(); cout “not funy!“endl; void fun() cout “so funy!“endl; ,66,void fun();,void fun();,#include void fun(); void main() fun(); cout “not funy!“endl; void fun(int a) cout “so funy! “aendl; ,#include void fun(); void main() fun(); cout “not funy!“endl; void fun(int a) cout “so funy! “aendl; ,#include void fun(); void main() fun(); cout “not funy!“endl; void fun(int a) cout “so funy! “aendl; ,观察程序有无错误,#include void fun(); void main() fun(); cout “not funy!“endl; void fun(int a) cout “so funy! “aendl; ,67,void fun(int a100 );,void fun(int );,fun(100);,观察程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025云南临沧市消防救援局招聘政府专职消防员46人备考题库附答案详解(精练)
- 2025浙江宁波贵驷街道招聘编外工作人员5人备考题库及答案详解(有一套)
- 2025重庆永川区胜利路街道办事处招聘公益岗2人备考题库及参考答案详解一套
- 2026重庆农村商业银行校园招聘180人备考题库附答案详解(b卷)
- 北京市门头沟区人民政府东辛房街道办事处城市协管员招聘10人备考题库含答案详解
- 2026中国邮政集团有限公司吉林省分公司校园招聘备考题库含答案详解(典型题)
- 个性化正畸数字化流程的成本控制策略
- 个性化医疗方案在跨境旅游服务中的定制化策略
- 2026中国建设银行北京市分行校园招聘备考题库附答案详解(b卷)
- 2025黑龙江绥化海伦市招聘社区工作者10人备考题库及1套完整答案详解
- 初始理论课件 CHAPTER4自动飞行
- GB/T 8642-2002热喷涂抗拉结合强度的测定
- GB/T 38145-2019高含量贵金属合金首饰金、铂、钯含量的测定ICP差减法
- GB/T 18894-2016电子文件归档与电子档案管理规范
- 计量基础知识培训 课件
- 超星网络课隋唐史答案
- 9tomo临床应用3年汇报
- 《风景名胜区条例》解读课件
- 统编版六年级道德与法治上册《期末测试卷》测试题教学课件PPT小学公开课
- 四年级数学上册计算题专项竞赛题
- 热拌沥青混合料路面施工机械配置计算(含表格)
评论
0/150
提交评论