




已阅读5页,还剩50页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019/7/24,1,第六章:函 数,6.1 概述,6.2 定义函数,6.3 函数参数和函数值,6.4 函数调用,6.5 宏定义,6.6 变量的作用域和存储类,6.7 函数的递归调用*,2019/7/24,2,一、模块化程序设计方法,6.1 概 述,函数是程序的基本组成单位,C程序从main()函数开始执行,用函数实现模块化程序设计的特点:,(1)将大的、复杂的问题分解成若干个小 的、简单问题。,(2)将需多次执行的计算/操作编成通用 的函数段。省时、省力。,(3)每个函数段完成一个特定的功能,2019/7/24,3,二、函数分类,1、按定义分:,标准函数、自定义函数,2、按调用分:,无参调用、有参调用,3、按功能分:,无值返回、有值返回,2019/7/24,4,6.2 定义函数,一、函数定义的一般形式为:,类型标识符 函数名(形式参数表) 形式参数说明 函数体 return() ,2019/7/24,5,说明:,1、若有值返回,则需标明类型,并一定有return。,2、若有值代入,则必须有形参表及形参说明。,3、形参说明的两种形式:,int max(int x,int y),或:,int man(x,y) int x,y;,max(x,y) int x;,max(int x,y),正确,或:,错误!,2019/7/24,6,4、形参说明与函数体内的说明一定要分别说明。,如:,int max(x,y) int x,y;,int z; z=xy?x:y; return(z); ,5、函数不可嵌套定义。,2019/7/24,7,6.3函数参数和函数值,一、形式参数和实际参数,main() /*主函数*/ int a,b,c; scanf(“%d,%d”, ,/*子函数*/ max(x,y) /* x , y是形式参数*/ int x,y; int z; z=xy?x:y; return(z); ,2019/7/24,8,说 明:,1、形参在调用前并不占有存储单元,2、实参可以为常量、变量或表达式,3、定义函数时,必须指定形参类型。,4、实参与形参要匹配,5、实参变量对形参变量的数据传递 分为“值传递”与“地址传递”,二、函数的返回值,1、函数的返回值由return语句完成。,2、函数值与返回值类型不同,以函数类型为准。,2019/7/24,9,三、参数传递,1、基本数据类型作参数,main() int a,b; printf(“a=“); scanf(“%d“, /*交换x和y的值*/ ,输入:,a=10,b=15,结果:,a=,b=,10,15,(单向、值传递),例:,2019/7/24,10,2、数组元素作函数参数,例:,用数组元素作实参,输出1 5的平方。,main() int a5,i; for(i=0;i5,i+) ai=i+1 sq(ai); sq(int n) printf(“%dn“,n*n); ,2019/7/24,11,3、数组名作参数,注意:实参和形参的类型都必须是数组,main() int a5,i; clrscr(); for(i=0;i=4;i+) ai=i+1; sq(a); ,sq(n) int n5; int i; for(i=0;i5;i+) printf(“%dn“,ni*ni); ,2019/7/24,12,说 明:,(1)调用sq()函数时,两个数组首地址完全相同。,(2)实、形参数组的类型必须一致,大小可不一致.,(3)通常形参数组大小不定。,如:,: int a10; : av(a); : av(int x ) :,2019/7/24,13,问题分析:,1、将数据送入数组,2、将所有数据累加求和,3、根据总成绩及人数求平均成绩,4、输出结果,一维数组score中存有10个学生的成绩。 求平均成绩。,应用举例:,例1:,2019/7/24,14,main() int score10,i; float aver(),av; printf(“输入成绩:n“); for(i=0;i10;i+) scanf(“%d“, ,float aver(stu); int stu10; int i,sum=0; float a; for(i=0;i10;i+) sum+=stui; a=sum/10.0; return(a); ,编程如下:,2019/7/24,15,例2:,交换两个数组元素的值。,main() int a2; scanf(“%d,%d“, ,2019/7/24,16,例3:,将一组学生成绩从高分到低分排序。,#difine STUDENT_NUM 10 main() int score11,i; void sort(); printf(“输入学生的成绩:n“); for(i=1;i=STUDENT_NUM;i+) scnaf(“%d“, ,主函数:,2019/7/24,17,void sort(num,n) int num ,n; int i,j,t; for(i=1;inumi) t=numj; numj=numi; numi=t; ,子函数:,2019/7/24,18,6.4函数调用,一、函数调用形式,二、函数调用方式,1、作为语句调用,调用无返回值函数,max(a,b);,2、作为表达式调用,c=2*max(a,b);,3、函数参数,m=max(a,max(b,c);,调用有返回值函数,2019/7/24,19,三、对被调函数的说明,main() : : long f(); scanf(“%d“, : ,long f(n) int n; int i; long a=1; for(i=1;i=n;i+) a*=i; return(a); ,调用函数求n!。,例:,2019/7/24,20,函数说明的一般形式为:,1、在主调函数中说明被调函数的类型。,说明:,2、几种情况除外:,(1)被调函数的返回值是int或char型时,(2)被调函数的定义出现在主调函数之前时,2019/7/24,21,long f() main() : t=f(); : ,如:,(3)在所有函数定义之前已说明了函数的类型,float a(); main() a(); float a() ,如:,2019/7/24,22,四、函数的嵌套调用,不可嵌套定义,但可嵌套调用,嵌套调用形式如下:,main() ,sub1() ,sub2() ,sub3() ,注意:,return();,return();,return();,sub1();,sub2();,sub3();,2019/7/24,23,编写一个判素数的程序,函数应用举例:,例1:,例2:,编程序求s=s1+s2+s3+s4的值。,其中:,s1=1+1/2+1/3+.+1/50 s2=1+1/2+1/3+1/100 s3=1+1/2+1/3+ .+1/150 s4=1+1/2+1/3+.+1/200,问题分析:,(1)原始数据可自动产生,(2)s1s4的计算方法相同(子函数中完成),(3)将s1s4的结果相加得到s,(4)输出s值,2019/7/24,24,6.5宏定义,一、不带参数的宏定义,说明:,1、宏名一般用大写字母表示。,2、使用宏可减少程序重写。,3、宏定义行不做语法检查。,4、宏定义不是语句,结尾不加分号。,5、宏定义时,可引用已定义的宏名。,2019/7/24,25,如:,#define R 3.0,#define PI 3.1415,#define L 2*PI*R,二、带参数的宏定义(类函数宏),例1:,#define S(a,b) a*b,area=S(3,2);,展开为:area=3*2;,2019/7/24,26,area=3.14159*3.6*3.6;,#define PI 3.14159 #define S(r) PI*r*r : a=3.6; area=S(a); :,例2:,展开为:,2019/7/24,27,如有 S(a)、S(a+b),则展开分别为:,3.14159*a*a,3.14159*a+b*a+b,注意:带参数宏与函数的区别,2019/7/24,28,6.6 变量的作用域和存储类,变量涉及到的问题:,1、先定义,后使用,2、定义语句出现的位置作用域问题(空间),3、是否保留变量值生存期问题(时间),4、定义和说明的区别:,定义:,给变量分配确定的存储单元,说明:,说明变量的性质(名称、类型),注意:,同一对象,可有多个说明,但仅有一个定义,2019/7/24,29,一、变量的作用域,作用域:,定义变量的位置及能被访问的范围。,变量的分类:,全局变量、局部变量,1、局部变量,在函数内部或符合语句内部定义的变量。,例:,2019/7/24,30,说明:,(1)局部变量只在定义它的函数内有效。,(2)不同函数中局部变量允许同名。,如:,2019/7/24,31,(3)可以在复合语句中定义局部变量。,(4)局部变量分为动态存储类别和静态存储方式。,如:,2019/7/24,32,2、全局变量,全局变量:,在函数之外定义的变量。,有效范围:,从定义位置开始到本源程序结束,int a,b;,main() : f() : ,如:,a、b的作用域,2019/7/24,33,说 明:,(1)全局变量可以被程序中的各函数所共用。,例:,2019/7/24,34,(2)函数可使用在该函数之后定义的全局变量。,例:,2019/7/24,35,(3)全局变量可与局部变量同名。,在局部变的作用域内,全局量不起作用。,例:,注意:,2019/7/24,36,(4)利用全局变量实现主调函数之间的数据 传递和返回。,用函数编程求一组学生成绩的最高分、最 低分和平均成绩。,例:,2019/7/24,37,主函数,2019/7/24,38,子函数,2019/7/24,39,注 意:,要限制使用全局变量。,原因:, 全局变量长久地占用内存。, 结构化程序设计方法要求各模块间应 尽量降低耦合度、尽量提高内聚度。, 全局变量的修改会影响另一个使用该 全局变量的函数。,(5)全局变量属于静态存储类,2019/7/24,40,二、变量的存储类型,供用户使用的存储空间:,程序区,静态数据区,动态数据区,变量的存储方式 :,静态存储:,固定存储单元,动态存储:,临时分配单元,四种存储类型:,自动变量,寄存器变量,静态变量,外部变量,auto,static,extern,register,2019/7/24,41,变量说明的完整形式:,1、自动变量,(auto),说明:,(1)自动变量属于动态存储方式。,(2)自动变量作用域和生存期都局限于定义它 的个体内。,例如:,2019/7/24,42,2019/7/24,43,2、静态变量(static),例1:读程序,写出程序运行结果。,输出结果:,1 1 1 1 1,2019/7/24,44,例2:读程序,写出程序运行结果。,输出结果:,1 2 3 4 5,2019/7/24,45,例3:读程序,写出程序运行结果。,输出结果:,7 8 9,2019/7/24,46,对静态局部变量的说明:,(1)静态局部量属静态存储类,在程序运行期间 不释放。,(2)静态局部量在编译时赋初值,仅赋一次。,(3)定义局部量时不赋初值,静态局部变量自动 赋初值,而自动变量为随机数。,(4)虽然静态局部变量在调用后仍存在,但其他 函数不可引用。,2019/7/24,47,3、外部变量(extern),作用:,说明在程序的其他地方用外部连接声明的对象。,例:,2019/7/24,48,4、寄存器变量(register),说明:,(1)寄存器型变量CPU的寄存器中。,(2)局部自动变量和形参数方可定为寄存器变量。,(3)要限制此类变量的个数。,(4)不可用&获取寄存器变量的地址。,2019/7/24,49,例:,2019/7/24,50,6 . 7 函数的递归调用,递归调用的方式:,直接、间接调用,直接调用,2019/7/24,51,间接调用,2019/7/24,52,采用递归方法解题,必须符合以下条件:,1、可把要解决的问
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 通讯维护半年度工作总结
- 试用期护士工作总结
- 慢性胃炎的护理业务查房
- 2025年股权质押合同5篇
- 护理病程录书写规范
- 河北招标采购从业人员考试(招标采购专业实务初级)测试题库及答案(2025年)
- 护理院老人走失预防体系
- 2025年:以下情况可能导致租赁合同终止
- 2025绿化景观维护合同书
- 2025节能减排合作协议合同范本
- 沟通能力培训课件x
- 半导体物理学全套课件
- 2024年09月2024秋季中国工商银行湖南分行校园招聘620人笔试历年参考题库附带答案详解
- 第一章-发型发展简史
- 智能计算系统:从深度学习到大模型 第2版课件 9、第九章-大模型计算系统
- 企业所得税汇算清缴政策培训会课件-于永勤
- 文物安全隐患排查整治工作总结
- 儿科静脉输液安全
- 阑尾炎快速康复护理
- DB64-266-2018:建筑工程资料管理规程-401-450
- 《北京市道路桥梁试验检测费用定额》
评论
0/150
提交评论