![C语言程序设计第7章-函数_第1页](http://file4.renrendoc.com/view/d627403a7c55e12401af9b6e1e0df72e/d627403a7c55e12401af9b6e1e0df72e1.gif)
![C语言程序设计第7章-函数_第2页](http://file4.renrendoc.com/view/d627403a7c55e12401af9b6e1e0df72e/d627403a7c55e12401af9b6e1e0df72e2.gif)
![C语言程序设计第7章-函数_第3页](http://file4.renrendoc.com/view/d627403a7c55e12401af9b6e1e0df72e/d627403a7c55e12401af9b6e1e0df72e3.gif)
![C语言程序设计第7章-函数_第4页](http://file4.renrendoc.com/view/d627403a7c55e12401af9b6e1e0df72e/d627403a7c55e12401af9b6e1e0df72e4.gif)
![C语言程序设计第7章-函数_第5页](http://file4.renrendoc.com/view/d627403a7c55e12401af9b6e1e0df72e/d627403a7c55e12401af9b6e1e0df72e5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计主编:连卫民何樱第7章函数本章主要内容:7.1函数概述7.2函数的定义与调用(重点)7.3函数的嵌套与递归(重点)7.4局部变量与全局变量7.5变量的存储类型7.6内部函数与外部函数本章教学要求:了解函数的基本概念和分类
熟悉变量存储属性的概念及其应用
掌握函数的定义形式、函数的参数和函数的返回值、函数的嵌套调用和递归函数的设计方法
7.1函数概述7.1.1函数的概念C语言的函数与数学的函数十分相似。数学函数“y=f(x)”表示:对于自变量x的每个给定值,总是按照一定的规律f给出它的结果y。例如:对于函数式y=x2+3x+4,C语言可定义为:函数就是具有一定功能的可以单独命名的程序段。
一个函数一般完成单一的功能。函数是C程序的基本模块,通过对函数模块的调用实现特定的功能。第7章函数7.1函数概述7.1.2函数分类在C语言中,可以从不同的角度对函数分类。1.根据函数自身形式划分(1)无参函数:函数名后括号中没有参数(调用时无数据传送)。(2)有参函数:函数名后括号中有参数(调用时有数据传送)。2.从用户角度划分(1)标准函数(即库函数):是C语言的系统软件为用户提供的无需定义就可以直接使用的函数。
(2)自定义函数:是由用户按照需要编写的函数。第7章函数7.1函数概述7.1.2函数分类3.C语言程序总体结构C语言程序是由一个或多个函数模块组成,每个函数都具有相对独立的单一功能。所以,我们说C语言程序是函数的集合体。有且只有一个函数称为主函数,程序的执行总是从主函数开始。
主函数中的所有语句执行完,则程序执行结束。假设某个程序由main函数和其它五个函数组成,如图7-1所示。
第7章函数7.2函数的定义及调用C语言中的标准函数用户可以直接使用,而自定义函数需要用户先定义后使用。
7.2.1函数的定义1.函数定义的格式定义格式:图。说明:任何函数都是由函数首部和函数体两部分组成。函数首部由函数类型、函数名和函数参数组成,函数体由说明部分和执行部分组成。
【例7-1】定义一个求两个整数和的函数。【例7-2】定义输出一串字符的函数。注意:在函数定义时,函数名要反映函数的功能;每一个函数要完成一个具体的功能;函数定义不能嵌套,也就是说在函数体内不能再定义函数。第7章函数7.2函数的定义及调用7.2.1函数的定义2.函数参数函数参数分为形参和实参两种,作用是实现数据传送。定义函数时的参数称为形式参数,简称形参。因为该参数在该函数被调用之前是没有确定值的,只是形式上的参数,这种参数只有在函数被调用时通过实参来获取值。调用函数时的参数称为实际参数,简称实参。强调:函数的参数表示实现该函数功能所必需的已知条件,在定义函数时以形参的形式给出。【例7-3】定义一个求n个整数和的函数。说明:数组作为形参时其长度可省略。第7章函数7.2函数的定义及调用7.2.1函数的定义3.函数的类型和返回值函数的类型在函数名前面给出,表明该函数返回值的类型。函数返回值是指函数被调用之后,用return语句返回主调函数的值。return语句的格式:
return表达式;
或
return(表达式);
或
return;一般地,函数的类型应与return语句后表达式的类型一致。当函数体没有return语句或return后没有表达式,表示函数没有明确的返回值,此时函数的类型一般定义为空类型,即void类型。如例7-2的hello函数。return控制程序流程返回主调函数,宣告函数调用结束。第7章函数7.2函数的定义及调用7.2.2函数的调用1.函数调用方式
一般形式:
函数名(实参表列)三种方式:(1)函数语句:函数调用的一般形式加上分号。例如:hello();(2)函数表达式:函数出现在一个表达式中,这种表达式称为函数表达式。例如:x=max(a,b)+2;
(3)函数参数:函数作为另一个函数调用的实际参数出现。
例如:m=max(a,max(b,c));说明:三种调用方式中后两种要求函数必须有明确的返回值。第7章函数7.2函数的定义及调用7.2.2函数的调用2.函数调用中的参数参数是函数调用时进行信息交换的载体,其传递方式是单向传送,即数据由实参传给形参。要求实参与形参个数相等、类型对应一致,并且实参的值必须确定。
参数之间的数据传递一般有两种形式:
(1)传值(普通变量作为函数参数)函数调用时,系统给形式参数分配存储空间,按数据复制的方式,实参把数据传递给形参。数据传递是单向的值传送,形参与实参分别占用不同的存储空间。调用结束后,被调函数中所有变量(包含形参)的存储空间释放,不能再被使用,其值也不会再传回给实参。例如:调用例7-2中sum函数的完整程序第7章函数7.2函数的定义及调用7.2.2函数的调用2.函数调用中的参数(2)传地址(数组名作为函数参数)当需要把数组的全部元素传递到另一函数中处理时使用。数组名作参数,实参和形参都应使用数组名,并且在主调函数和被调函数中分别进行定义。例如:调用例7-3中sumn函数的完整程序当执行“s=sumn(x,10)”语句时,将数组x的首地址(假设为1020)传送给形参数组a,从而形参数组a与实参数组array共用相同的一组存储单元,如图7-2所示。值得强调:在被调函数中并没有为形参数组另外开辟存储单元,也没有进行复制式传递数组元素的值,而是通过与实参数组共享存储单元而达到目的。第7章函数7.2函数的定义及调用7.2.2函数的调用3.被调函数的声明若函数定义放在调用它的函数之前,主调函数中可以直接使用该函数。否则要在主调函数中先声明该函数。函数声明的一般格式为:类型标识符函数名(函数参数表);函数声明的内容就是函数定义的首部内容,也称函数模型(或函数原型)。向编译系统提供函数名、函数类型、函数参数的个数、类型等信息。【例7-4】函数声明可以省略形参名,仅有形参类型,也可二者均省略。如:
floatmax(float,float);
或floatmax();函数声明可以函数定义的外部。省略函数声明:整型函数、被调函数放在主调函数之前,在程序开头对定义的所有函数进行声明。第7章函数7.3函数的嵌套和递归7.3.1函数的嵌套调用在调用一个函数的过程中又调用了另一个函数,称为函数的嵌套调用。
【例7-5】求组合数。分析:由于运算式中,多次用到阶乘运算,所以把阶乘运算定义成一个函数,供多次使用。
C语言中函数的定义是平行的、独立的,不允许在一个函数体内定义另一个函数,但是C语言允许在一个函数的定义中调用另一个函数。这样就出现了函数的嵌套调用,如图7-3所示。函数嵌套的级数是不受限制的。但是,函数嵌套的级数越多,执行效率就越低。第7章函数7.3.2函数的递归调用函数的递归调用是在调用一个函数的过程中又直接或间接地调用该函数本身。在调用函数的过程中又调用了本函数,这称为直接递归调用。而在调用函数中通过调用其他函数调用本函数,这称为间接递归调用。【例7-6】设计一个递归函数计算n!。(1)递归调用的条件:原问题化为新问题,新问题与原问题的解决办法相同;经过有限次数的划分,最终获得解决。
(2)递归调用的特点:程序简洁清晰,可读性强,但开销比较大。
(3)递归调用的过程:“递推”阶段;“回归”阶段。图第7章函数7.3函数的嵌套和递归7.4局部变量和全局变量定义一个变量后,只有在该变量的作用域内才能使用这个变量。在C语言中,按作用域可以把变量分为局部变量和全局变量。7.4.1局部变量在函数体内定义的变量称为局部变量,也称内部变量局部变量只在定义它的函数体内有效。在不同的函数体内可以定义同名的变量,这些变量互不干扰。【例7-8】阅读下列程序,注意同名的局部变量的使用。说明:
(1)主函数中定义的变量只在主函数中有效。(2)不同函数中可以使用相同变量名,不会发生冲突。(3)形参也是局部变量。(4)在一个函数内部可以使用复合语句来定义变量,这样的变量只在本复合语句中有效。
第7章函数7.4局部变量和全局变量7.4.2全局变量在函数体外定义的变量称为全局变量,也称外部变量。全局变量可以被本文件中的函数所共用,它的有效范围是从定义变量的位置开始到本源文件结束。
【例7-9】用函数实现两个变量值的交换
普通变量作函数参数时是单向的“值”传递,形参和实参都是局部变量,各自作用域不同。此时用全局变量实现(修改程序)说明:(1)全局变量可以为多个函数共用,降低函数的独立性。
建议只有在必要时才设置全局变量。(2)当全局变量名与局部变量名相同时,在局部变量的有效范围内全局变量不起作用。(3)全局变量的作用域是从定义处开始到整个程序结束。若想在定义点之前引用,需要用关键字“extern”作引用说明。第7章函数7.5变量的存储类型变量是对程序中数据存储空间的抽象,完整的变量定义应该确定它的两种属性:存储类型和数据类型。数据类型是变量的操作属性,表明变量的取值范围和可以执行的操作。存储类型是变量的存储属性,表明变量在内存中的存储方法。7.5.1存储空间的划分计算机的存储器:内存储器、外存储器和寄存器。
计算机的内存可以分为程度区、静态存储区和动态存储区静态存储是指在程序运行期间分配固定的存储空间,该存储空间直到程序运行结束后才被释放;动态存储是在程序运行期间根据需要进行动态的分配存储空间,该存储空间不需要时立即释放。变量的存储方式实质上描述了变量的时间特性。第7章函数7.5变量的存储类型在C语言中,变量的存储类型有四种:自动的(auto)、静态的(static)、寄存器的(register)、和外部的(extern)。7.5.2局部变量的存储类型1.自动(auto)局部变量定义局部变量时,如果没有指定存储类型或使用了auto说明符,系统就认为所定义的变量具有自动存储类型。自动存储类型用关键字auto表示,其中“auto”也可以省略。
int
a,b;
等价于
autoint
a,b;自动变量的存储单元被分配在内存的动态存储区。自动变量“用之则建,用完即撤”。强调:自动变量定义后如果没有赋值,其初始值是不确定的。第7章函数7.5变量的存储类型7.5.2局部变量的存储类型2.静态(static)局部变量定义局部变量时,指定存储类型为static的变量,称该变量为静态局部变量。静态变量的存储单元分配在静态存储区。函数调用结束后,静态局部变量所占的存储单元不释放。在下一次函数调用时,该变量可以保存上次函数调用后的值。【例7-10】编程计算1!、2!、3!、4!和5!说明:(1)静态变量是在编译时赋初值一次。如定义静态变量时没有赋值,系统会自动赋初值0或空字符。(2)静态局部变量在函数调用后仍然存在,但其它函数不能用。(3)静态局部变量降低了程序的可读性,尽量少用。第7章函数7.5变量的存储类型7.5.2局部变量的存储类型3.寄存器(register)局部变量定义局部变量时,指定存储类型为register的变量,称该变量为寄存器变量。寄存器变量具有与自动变量完全相同的性质。区别在于:寄存器变量的值保存在CPU的寄存器中,这样执行速度更快。通常把使用频率较高的变量(如循环次数较多的循环变量)定义为register类型。
如:registerint
i,j
;说明:(1)计算机系统中的寄存器数目不等,寄存器的长度也不同。当不能实现时,系统会自动处理成自动(auto)变量。。(2)只有局部变量(包括形参)才能定义为寄存器类型,全局变量不可定义为该存储类型。第7章函数7.5变量的存储类型7.5.3全局变量的存储类型
全局变量是在函数外面定义的,它的存储单元在编译时被分配在内存的静态存储区。
当一个程序由多个源文件组成时,全局变量可分为静态(static)全局变量和非静态全局变量。1.静态(static)全局变量所谓静态全局变量是指在定义全局变量的前面加static,从而限定该全局变量只在本文件中使用。如:好处:当多人编写一个程序的不同文件时,可以按照需要命名变量,而不必考虑因与其他文件中的变量同名而导致错误发生,以保证文件的独立性。第7章函数7.5变量的存储类型7.5.3全局变量的存储类型2.非静态全局变量所谓非静态全局变量是指在定义全局变量的前面不加static(相当于省略extern),使该全局变量可被别的文件使用。非静态全局变量在使用它的文件中要用extern作声明。如:说明:(1)全局变量(静态、非静态)都是在编译时分配存储单元的,其存储单元分配在静态存储区,生存期是整个程序的运行周期。(2)使用外部的全局变量应十分慎重,尽量少用。(3)多文件C程序的执行方法之一:用include命令在一个文件中把其它文件包含进来一起进行编译。第7章函数7.6内部函数和外部函数
函数的本质是全局的,它可以被本文件中的其他函数任意调用。当一个程序由多个源文件组成时,函数可分为内部(static)函数和外部(extern)函数。7.6.1内部函数用static声明的函数为内部函数,也称为静态函数。使用内部函数,可以使函数只局限于所在文件。
通常把只能由同一文件使用的函数和外部变量放在一个文件中,在它们前面都冠以static使之局部化,其他文件不能引用。
7.6.2外部函数用extern声明的函数为外部函数。在定义函数中,凡是不加存储类型说明的函数都为外部函数。
【例7-12】编程计算学生考试的平均分(分析)。第7章函数7.6内部函数和外部函数7.6.3程序的分割编译源程序由多个源文件组成,可以按照一个个的源文件为单位对它们进行分别编译,然后再把分别编译后生成的目标文件链接成一个可执行文件。这样的编译过程称为分割编译。
分割编译处理方式为大型软件的集体开发提供了有力的支持,为软件的维护和扩充提供了便利。在VC++环境下,实现分割编译的步骤:第一步:创建各个源程序文件。第二步:建立工作区。选择:文件→新建→工作区,建空白工作区第三步:建立工程文件。选择:文件→新建→工程→Win32ConsoleApplication第四步:将源程序文件添加到工程。选择:工程→增加到工程→文件第五步:像一个文件程序一样编译、连接运行程序。第7章函数7.7函数的程序设计举例【例7-13】求20以内的素数,要求编写一个判断素数的函数。分析:素数是指只能被1和自身整除的自然数。设计一个判断素数的函数,它从主函数得到一个
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 代际支持模式对已婚育龄女性劳动参与的影响研究
- 三种粘接剂粘接脱落金属托槽的剪切粘接强度比较研究
- 纳税信用评级对企业经营绩效的影响研究
- 2025年燃煤发电机组项目项目风险识别与评估综合报告
- 柴油相关法规与申请流程解读
- 学校设备维护人员的职责与要求
- 工业园区环卫保洁应急管理方案
- 2025年度高端写字楼室内植物养护与景观美化合同
- 咨询公司展厅装修合同范本
- 课外活动辅导措施安排
- 消化道大出血的鉴别诊断和处理原则课件
- 员工调整薪酬面谈表
- 北师大版五年级上册数学教学课件第5课时 人民币兑换
- 工程回访记录单
- 住房公积金投诉申请书
- 辅警报名登记表
- 外研版英语五年级下册第一单元全部试题
- 检验科生物安全风险评估报告
- 京颐得移动门诊产品输液
- 部编版四年级语文下册课程纲要
- 药物非临床研究质量管理规范(共113页).ppt
评论
0/150
提交评论