




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章用函数实现模块化程序设计,7.1函数是什么7.2函数的定义和调用7.3函数的嵌套调用和递归调用7.4数组作为函数参数7.5变量的作用域和生存期,7.1函数是什么,1函数就是功能每一个函数都用来实现一个特定的功能,即程序模块(功能模块)。较大的程序都要化分成若干功能。函数是C程序的基本单位一个C程序是由一个或多个函数组成的,其中一定包含一个主函数(main函数),除了main函数外,还可以有若干个一般的函数。即模块化程序设计的思想。如:例7.1(p169)包含三个函数;例1.3(p4)包含两个函数;,函数的分类从用户使用角度分:库函数和用户自定义函数。从函数的形式分:无参函数和有参函数。4函数的定义及调用函数的定义是分别进行的,是相互独立。一个函数并不从属于另一个函数,即函数的定义是平行的,不能嵌套。一般函数只有被调用才能执行,函数间可以相互调用,但不能调用main函数,main函数是系统调用的。函数调用可以嵌套,还可以直接递归或间接递归。,7.2函数的定义和调用,7.2.1为什么要定义函数C程序中的所有函数必须“先定义,后使用”。定义函数可以将相关信息通知给编译系统。定义函数包括以下内容:1指定函数名,以便以后按名调用。2指定函数的类型,即函数值的类型。3给出函数的形参表,其中包括形参的名字及类型。(注:以上3部分组成函数的首部)4指定函数应完成的功能,即变量声明和相应操作的实现语句。(注:第4部分为函数体)注意:函数由函数首部及函数体组成。,7.2.2定义函数定义函数的一般形式:类型名函数名(形参表)函数体注:1当无形参表时,为无参函数。2形参表中包含形参的类型和形参名(用“,”分隔)例:intmax(intx,inty)intz;z=(xy)?x:y;return(z);/*可简化为returnz;*/注:return语句的作用是将z的值作为函数值返回的主调函数中,即函数返回值。函数的类型即返回值的类型。,7.2.3函数的调用定义函数的目的是为了使用它,通过调用来完成。1调用的形式:函数名(实参表)注意:(1)当无实参表时,为无参函数的调用。(2)实参与形参可以同名,但占用内存单元不同。例7.1:利用函数,求出2个数中大的。intmax(intx,inty)intz;z=(xy)?x:y;return(z);/*可简化为returnz;*/voidmain()inta,b,c;scanf(“%d%d”,函数调用过程(1)实参与形参必须一一对应(个数、类型、意义)(2)执行函数调用时,首先按照定义的类型给形参分配存储单元,并将实参的值传递给相应的形参,即“单向传值”。然后执行函数体。(3)在执行函数体中的语句时,只有形参参加各种操作即使形参的值发生改变,也不影响实参的值,即“单向传值”(4)通过return语句将函数值带回到主调函数,亦称返回值。函数体中可以出现多个return语句,但只能执行其中一个当无返回值(无return语句)时,函数定义为void类型。(5)函数调用结束,形参单元被释放(值就不存在了),而实参单元仍保留并维持原值,即“单向传值”。思考:“单向传值”的概念?,3调用函数的方式按函数出现在程序中的位置来分,有3种调用方式:(1)函数语句调用没有返回值的函数,函数可以单独作为一个语句。例:scanf(“%d”,7.2.4对被调函数的声明和函数原型1为什么要进行函数声明函数的使用也必须满足“先定义,后使用”的原则。当被调函数的定义出现在主调函数之后时,必须对被调函数进行声明,以此通知编译系统,便于进行程序的正确性检查。2函数声明的形式在主调函数的声明部分写上函数原型。3函数原型有两种形式(1)类型名函数名(形参表);即函数的首部后加一个“;”(常用此形式)(2)类型名函数名(参数类型1,参数类型2,);即将形参表中的参数名省略。,例7.2:(题同例7.1)voidmain()intmax(intx,inty);/*函数原型*/inta,b,c;scanf(“%d%d”,*/,7.3函数的嵌套调用和递归调用,7.3.1函数的嵌套调用在被调用的函数中,又调用另一个函数,称为嵌套调用。例7.3输入4个数,找出其中最大的。设计算法:1定义函数max,求出2个数:a,b中大的(同例7.1)。2定义函数max_4,求4个数:a,b,c,d中大的,其中调用max函数:m=max(a,b);/*把a、b中大的放到变量m中*/m=max(m,c);/*把m、c中大的放到变量m中*/m=max(m,d);/*把m、d中大的放到变量m中*/3在main函数中输入a,b,c,d的值,调用max-4求出最大者。,编程序:#includevoidmain()intmax_4(inta,intb,intc,intd);/*函数原型*/inta,b,c,d,max;scanf(“%d%d%d%d”,7.3.2函数的递归调用在调用一个函数的过程中,又出现直接或间接的调用该函数本身,称为递归调用。例7.4定义函数fac,求出n的阶乘(n!)值。设计算法:由数学知识可知:n!=n(n-1)!,当n=0时,n!值为1。因此,求n的阶乘值的时,又用到求阶乘的过程:(n-1)!,数学中称为递归定义,n=0时为递归出口。可以用递归函数实现求阶乘值:intfac(intn)intx;if(n=0)x=1;elsex=n*fac(n-1);/*直接递归调用函数fac*/returnx;,编程序:#includeintfac(intn)intx;if(n=0)x=1;elsex=n*fac(n-1);/*直接递归调用函数fac*/returnx;voidmain()intn,x;scanf(“%d”,思考:如何定义函数用递推法(循环累乘)求n!,7.4数组作为函数参数,数组元素可以作为函数的参数,其用法与变量相同;数组名也可以作为函数的参数,传递的是数组首元素的地址。7.4.1数组元素作函数参数数组元素可以作为调用函数时的实参,传值给形参。数组元素不能作为函数的形参。例如:inta10;x=max(a1,a2);/*求元素a1、a2中大的*/intmax(intx,inty)不能写成:intmax(inta1,inta2)例7.6(P185),7.4.2数组名作函数参数数组名也可以作为函数调用时的实参,传递的是数组首元素的地址(即数组的首地址),不是将数组中的所有元素传递给形参。此时,对应的形参应当是数组名或指针变量(见第8章)。例7.7(P186)例7.8(P188)#includevoidmain()floataverage(floatarray);/*函数原型*/floatscroe10,aver);aver=average(score);/*调用函数,数组名为实参*/floataverage(floatarray)/*数组名为形参*/,例7.9(P189)用一个函数实现选择法对10个数排序。#includevoidsort(inta,intn)/*定义函数,数组名为形参*/inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(ajak)k=j;t=ai;ai=ak;ak=t;voidmain()inta10=12,6,3,7,4,9,13,2,10,8;sort(a,10);/*调用函数,数组名为实参*/,7.5变量的作用域和生存期,7.5.1变量的作用域局部变量和全局变量变量的作用域亦称有效范围。若程序中只包含一个main函数,则在函数中定义的变量在整个函数中都有效。当一个程序中包含多个函数时,在A函数中定义的变量在B函数中能否使用?这就是作用域问题。1局部变量在函数中定义的变量,只在本函数中有效,成为局部变量或内部变量。作用域只为本函数内。注:(1)不同函数中的局部变量可以使用相同的名字,他们有各自的有效范围,互不影响。(2)main函数中定义的变量也是局部变量。(3)函数的形参也是局部变量,函数外不能引用。(2)复合语句中可以定义变量,只在本语句中有效。,2全局变量一个程序包含多个文件,一个文件可以包含多个函数。在函数外定义的变量是外部变量或全局变量。有效范围为从定义的位置开始,到文件的结束。当一个文件中全局变量与局部变量重名时,在局部变量的有效范围内,全局变量被“屏蔽”起来,即不起作用。当局部变量出了有效范围后,全局变量继续有效。例7.10请看下列程序的输出结果。intm=13;intfun2(intx,inty)intm=3;return(x*y-m);voidmain()inta=7,b=5;printf(%dn“,fun2(a,b)/m);,7.5.2变量的存储方式和生存期除了作用域以外,变量还有一个重要的属性:生存期,即变量的存在时间。有些变量在程序运行的整个过程中都存在,而有些变量只在调用函数时才临时分配存储单元,函数调用结束马上就释放了,变量不再存在。即变量分为:静态存储方式和动态存储方式两种,亦称存储类别。由此可知,变量有两个属性:数据类型和存储类别。C语言中有4种存储类别:1auto自动变量前面用过的函数中,定义的形参和局部变量都是自动变量,存储类别定义的关键字auto省略,属于动态存储方式。有效范围和生存期均为本函数。2static静态变量函数中定义的局部变量静态变量,属于静态存储方式。有效范围为本函数,生存期为整个程序。,例7.12分别求出15的阶乘值,并输出。(p196)#includeintfac(intn)staticintf=1;/*f为静态局部变量*/f=f*n;return(f);voidmain()inti;for(i=1;i=5;i+)printf(“%d!=%dn”,i,fac(i);注:静态局部变
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年专业服务行业共享经济市场前景分析报告
- 2025年电子游戏行业虚拟现实技术应用前景预测报告
- 2025年零售行业移动支付应用前景研究报告
- 2025年金融行业区块链数字货币应用前景研究报告
- 2025年人类基因编辑行业伦理风险与医疗应用前景研究报告
- 商场全员安全培训制度课件
- 2025年区块链技术在金融行业应用前景分析研究报告
- 宁波市2025浙江宁波市交通运输局局属事业单位招聘3人笔试历年参考题库附带答案详解
- 国家事业单位招聘2025中国文联所属单位招聘拟聘用人员笔试历年参考题库附带答案详解
- 吉林省2025年度柳河县事业单位域外人才回引笔试历年参考题库附带答案详解
- 2025年全国中小学校党组织书记网络培训示范班在线考试题库及答案
- 2025年全国中小学校党组织书记网络培训示范班在线考试题库及答案
- 我国军兵种介绍课件
- 2025全国农业(水产)行业职业技能大赛(水生物病害防治员)选拔赛试题库(含答案)
- 饮食营养与健康课件
- Unit 4 Reading and Thinking 学案-高中英语人教版(2019) 选择性必修第一册
- 广告及宣传印刷品制作服务方案
- 安全评价工作程序框图流程图
- 医共体成员单位人力资源工作制度
- 如何建立高效学习小组
- 汽车系统动力学与控制 教学大纲
评论
0/150
提交评论