版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2000级统招,主 讲:,樊广军,第五章 函数,本章目标,1. 进一步理解多个函数构成一个C程序,2. 进一步了解和熟悉库函数,3. 学会编写自已的函数,4. 理解函数的调用关系,5. 理解函数中参数的传递机制,一、C程序模块,一个C程序可由一个main( )函数和多个其它函数构成。,5.1 C程序模块, 其它函数指的是:, 系统函数由系统提供,放在头文件中,自编函数由程序设计人员编写,二、函数的调用,如:, 所有的函数都 具有两种特征:, 返回值,参数,(返回值和参数都是可缺省的),5.2 库函数,一、库函数简介,系统自带的标准库函数根据不同的功能作用放在不同的头文件中。,如:stdio.h
2、用于标准输入/输出,math.h用于数学计算,ctype.h用于字符处理,string.h用于字串处理,time.h用于时间/日期的处理,dir.h用于控制目录和路径,graphics.h用于图形操作,dos.h,bios.h,用于接口处理,二、库函数的作用, 使程序更具有“ 独立性”和“ 可移植”性。, 使用时只需在程序的开头加上一条语句:,#include ,根据使用的函数来确定, 使程序具有“ 模块化”。,例1:求两个浮点型数值x/y的余数。,(注意:不能写成3.6%1.7),#include ,#include ,main( ), float x, y, z;,scanf(%f%f,
3、,z=fmod(x, y);,printf( z=%f, z);,例2:P119随机数,程序:P120 程序: P122,5.3 自定义函数,一、自定义函数的作用, 使程序具有“ 积木”功能。(模块化), 使程序具有“ 重构”功能。,二、 函数的定义及调用, 定义,存储类型符 返回值类型符 函数名(形参表列),形参说明, 说明部分,语句, 调用, 变量名=函数名(实参表列);,(变量名的类型必须与函数的返回值类型相同), 函数名(实参表列);,三、函数声明,一般情况下,函数被调用之前必须要有函数声明。,(函数声明的意义在于提供函数原型),函数声明的格式:,返回值类型符 函数名(形参类型);,例
4、1: 求二个数中的最大值 int max (x, y) int x, y; int z; z=xy? x:y; return (z); ,用return语句,返回函数的值。,或:int max (int x, int y) int z; z=xy? x:y; return (z); ,四、举例,通过函数调用求二个数中的最大值:,#include ,int max (int, int); /*函数原型*/,main( ), int a, b, t;,scanf(%d%d, ,t=max(a, b); /*函数调用*/,printf(value of maximize is: t=%d,t);,i
5、nt max(int x, int y) /*函数定义*/, int z;,z=xy? x:y;,return(z);,#include float add( ); /*函数说明*/main ( ) float a, b, c; scanf(%f, %f, ,float add( float x, float y); /*函数定义*/ float z; z=x+y; return z; ,例2: 求二实数之和,若函数的定义放在main( )函数之前可省略函数说明。,第五章 函数,#include float add( float x, float y); /*函数定义*/ float z; z
6、=x+y; return z; main ( ) float a, b, c; scanf(“ %f, %f”, ,例3: 求二实数之和(将例1程序改写如下:),例4. P113,第五章 函数,1. 形参与实参,函数被调用时,临时分配单元给形参,调用完毕, 这些单元被释放。,实参: 出现在调用函数中, 形参: 出现被调用函数中。,五、自定义函数中的几个重要特征, 实参可为表达式,只传递表达式的值。, 实参、形参类型一致。, 可在形参表列中对形参说明。,注:,! ?,2. 函数返回,或 return 变量的值;,通过return语句将流程返回主调函数。, return; 函数无返回值, retu
7、rn 表达式的值;,3. 函数名,要选择一个简洁的有意义的名字作为函数名。,从函数名可以反映出函数的功能。,六、传值调用和传引用(传址)调用,1. 传值调用,方式:函数的实参和形参的类型均为简单变量。,系统会建立一份实参的拷贝给形参。,当函数调用完毕,这份实参的拷贝消失。,特点:传值调用不会影响实参的值。,2. 传引用(传址)调用,形参变量和实参变量共同内存地址。,特点:形参变量的值的变化会影响实参的值的改变。,5.4 函数的存储类型,一、标识符的属性,一个标识符的属性除了前面已讲过的基本属性外,还具有一些其它的属性:, 存储类别, 存储期,二、存储类别,1. 存储类型和存储期, 自动型 (a
8、uto), 寄存器型(register), 外部型(extern), 静态型(static),自动存储期,静态存储期,2. 存储期的性质, 自动存储:只有变量才具有自动存储期,如函数中的变量说明:,auto float x, y;,auto int m, n;,作用:进入到函数块中,该变量存在,退出函数块后该变量消失。程序中大部分变量都具有自动存储期。, 静态存储:可用于变量和函数,如:static in t;,作用:从程序开始执行起就一直存在,始终占据内存单元,直到程序结束运行。, 对静态存储变量,若定义时赋初值,则程序运行中仅在第一次调用时赋初值,下一次调用不再赋初值,而是使用上一次调用的
9、值。,特别提醒:, 对静态存储变量,若定义时不赋初值,则系统置初值0,而动态变量不赋初值则值不确定。,#include int fac (n) /*函数定义*/ int n; static int f=1; f=fn; return(f); main ( ) int i; for (i=1; i=5; i+) printf (%d!=%dn, i, fac(i);,例:求n!,第五章 函数,1!1 2!2 3!6 4!24 5!120,每一次调用fac(i),打印一个i!,同时保留这个i!的值以便下次再乘(i+1)。,运行结果为:,5.5 标识符的作用域, 标识符可以具有四种作用域。, 函数作
10、用域, 文件作用域, 块作用域, 函数原型作用域,(作用域: 有效范围), 可根据标识符的作用域区分局部变量和全局变量。,一、局部变量,凡在函数(含main 函数)内部定义的变量称为局部变量。,局部性: 局部变量仅在函数内部有效。,2. 形参为局部变量。,3. 在复合语句中可定义仅在复合语句中有效的临时变量。,1. 不同的函数可有同名同类型的变量,它们占不同的内存单元, 互不影响。,二、全局变量,一个源文件中, 在所有函数之外定义的变量为全局变量。,有效性: 自定义位置开始至文件结尾全部有效。,例: int p=1, q=5; float f1(a) int a; int b, c; char
11、 c1, c2;,p,q的作用范围,c1, c2的作用范围,char f2(x,y); int x, y; int i, j; main ( ) ,第五章 函数,1. 全局变量所作用到的函数,相当于这些函数的公共变量。当一个函数对其值进行改变后,另一个函数使用该变量的值亦相应改变。好处: 函数之间值传递。,2. 不要随意使用全局变量。一是始终占据内存单元;二是由于函数依赖于外部定义的变量,减少了通用性。,注意,3. 不在作用域内函数。若使用全局(外部)变量,需在函数体内加上extern保留字。,4. 全局和局部变量同名时,局部变量有效。,float f1 (x) int x; extern i
12、nt a, b; int a0; b= 1 main ( ) ,a, b作用域,例:,例1:/*-exp81.c-*/,#include,int fun1(int x, int y);,int a, b, z;,main( ), int u, m=0;,a=24; b=42;,printf(1)-a=%d, b=%d, m=%dn, a, b, m);,m=m+10;,u=fun1(a, b);,printf(2)-a=%d, b=%d, u=%d, m=%dn, a, b, u, m);,m=m+10;,a=za; b=zb;,u=fun1(a, b);,printf(3)-a=%d, b=
13、%d, u=%d, m=%dn, a, b, u, m);,第五章 函数,int fun1(int x, int y), int m;,m=x+y;,printf(chang a,a=a+10; b=b+20;,z=x+y;,return (z);,第五章 函数,(1) -a=24, b=42, m=0,运行结果:,chang a if (n0) printf(input error!n); else if (n= = 0 n= =1)f =1; else f =nfac(n 1); return (f); ,2. 程序:,第五章 函数,main ( ) int n; long y; prin
14、tf(input a integer! ) scanf (%d, ,第五章 函数,3. 执行过程:,设: 输入 5 (n=5),第1次调用:y=fac(5) 返回:y=5fac(4),第2次调用:y=5*4fac(3),第3次调用:y=5*4*3fac(2),第4次调用:y=5*4*3*2fac(1),第5次调用:y=5*4*3*2*1*fac(0),例2: 汉诺塔(Hanoi)问题,问题: 将A塔上n个盘子移至C(借助于B)。 移动时,保证三个塔始终是大盘在下,小盘在上。,A,n个盘子,必须用递归方式解决,1) 先将A塔n 1个盘子借助于C移至B上,2) 将A上剩下的一个移至C上.,3) 将
15、B上n 1个盘子借助于A移至C上.,可以看到: 1)、3)为同一问题,都为n 1个盘子借助于一个 空塔移至另一塔上。,#include void move (char getone,char putone) /*函数定义*/ printf(“ %c %cn ”, getone, putone);void hanoi (int n, char one, char two, char three) /*将n个盘从one借助two,移到three*/ if (n= =1) move (one, three); else hanoi (n1, one, three, two); move (one,
16、three); /*函数调用*/ hanoi (n1, two, one, three); ,程序如下:,第五章 函数,main ( ) int m; printf ( input the number of diskes :); scanf( %d , /*函数调用*/ ,第五章 函数,input the number of diskes:3 The step to moving 3 diskes: A C A B C B A C B A B C A C,运行情况如下:, move (getone, putone) 表示从getone 塔移一个盘子至putone塔, hanoi(n, one, two, three) 表示n个盘子从one塔借助于two塔(空)移至t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 麻醉药品和精神药品的管理与使用
- 工匠精神赋能创新创业教育与实践
- 精神的三间小屋句子赏析
- 厨师长管理培训
- 检验科体液检查操作流程规范
- 工匠精神开学第一课
- 管理书籍设计展示
- 2026河北沧州任丘关爱精神病医院招聘备考题库附完整答案详解【必刷】
- 2026中煤财务有限责任公司招聘2人备考题库及答案详解(新)
- 2026广东东莞市望牛墩镇中心幼儿园招聘备考题库【夺分金卷】附答案详解
- 进入刘才栋教授示范教学 - 局部解剖学 - 复旦大学上海医学院
- 常用卧位摆放护理操作考核标准、流程与指引
- 2023年安徽省中学生生物学竞赛预赛试卷-完整版
- 基坑开挖风险评估报告
- 水生动物增殖放流技术规范
- 纪委办公室室内改造项目可行性研究报告
- GB/T 17880.6-1999铆螺母技术条件
- SB/T 11094-2014中药材仓储管理规范
- GB/T 23339-2018内燃机曲轴技术条件
- 实验12土壤微生物的分离及纯化课件
- 2022年4月自考00402学前教育史试题及答案
评论
0/150
提交评论