版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章函数教案教学任务1.函数的概述2.函数的定义与调用3.函数的调用与参数传递4.数组作为函数参数5.函数的递归调用6.变量的作用域及其存储类型7.内部函数和外部函数8.编译预处理授课课时总时长:学时包括:课堂讲授学时;实训学习学时一、教学分析教学重点函数定义、调用的一般形式,局部变量和全局变量、变量的存储类别教学难点函数形式参数和实际参数,变量的作用域和生存期教学方法讲授法+导例教学二、教学基本内容(一)函数的概念结构化程序设计是自顶向下、逐步细化和模块化的程序设计方法,结构化设计是将一个大程序分解为一些规模较小的、功能简单的、更易于实现的模块,每个模块完成特定的功能。C语言中,模块是通过函数来实现的。关于函数,需要注意:(1)函数是规定格式书写的、能完成特定功能的一段程序。(2)C语言是以源文件为单位进行编译的,一个源程序文件由一个或多个函数组成。(3)一个程序由一个或多个源程序文件组成。(4)函数与函数之间是平等独立的。(5)函数不能嵌套定义,但可以相互调用,包括嵌套调用。(6)主函数可以调用任何函数,但其它函数不能调用主函数。(6)一个函数可以多次被调用。如果同一程序段出现多次,应该把这个程序段构造成一个函数。(7)程序从主函数开始执行,在主函数中结束。调用其它函数后,再返回到主函数。主函数在程序中的位置没有要求。程序的函数调用关系如下图所示。函数调用示意图函数由函数名、参数和函数体组成,函数定义的一般形式:类型说明符函数名(形式参数声明){[说明与定义部分]语句;}函数的参数用来接收调用函数传递给它的数据;函数体则是函数实现自身功能的一组语句。说明:(1)类型说明符用来说明函数返回值的类型。(2)其中函数名是用户为函数起的名字,用来唯一标识一个函数;其命名规则与变量的命名规则相同。为便于识别,通常将函数名定义为函数体完成的功能的概括性单词,且在同一个编译单元中不能有重复的函数名。函数名本身也有值,它代表了函数的入口地址。(3)形式参数声明,又称为形参表,用于调用函数和被调用函数之间的数据传递,关于形式参数需要注意:=1\*GB3①传递给函数的参数可以有多个,也可以没有。=2\*GB3②函数参数声明中必须对每一个参数进行类型说明,形参之间用逗号隔开。=3\*GB3③形参的主要作用是接收来自函数外部的数据,每个形参存放一个数据。若函数没有参数,则形参表为空,但是形参括号不能省略。函数体是指用{}(一对大括号)括起来的部分,它是函数定义的主体,由说明部分、定义部分以及语句组成。在函数体中,可以有变量定义,也可以没有,在函数体中定义的变量只有在执行该函数时才起作用。函数体中的语句描述了函数的功能。函数体中可以既无变量又无语句,但是不可以省略包含函数体的一对花括号,此时构成空函数,空函数不产生任何操作。(二)函数调用函数调用是指一个函数暂时中断本函数的运行,转去执行另一个函数的过程。被调用函数执行完后,返回到调用原本执行的函数中断处继续运行,这是一个返回过程。函数的一次调用必定伴随着一个返回过程。在调用和返回两个过程中,两个函数之间通常发生信息的交换。函数调用的一般形式:函数名(实际参数列表);或函数名(实际参数列表)1.关于函数调用需要注意:(1)第一种调用格式是以语句(以“;”结束)的形式调用函数,用于调用有返回值的函数。(2)第二种调用格式是以表达式的形式调用函数,用于调用有返回值的函数,通过调用函数的表达式接收被调用函数送回的返回值。(3)实参类型与形参类型相对应,对应有三层意思:=1\*GB3①实参个数必须与形参个数相同,=2\*GB3②并且顺序一致,=3\*GB3③必须符合赋值兼容的规则。(4)当有多个实参时,参数之间用逗号隔开。(5)实参可以是常量、已经赋值的变量、表达式以及函数。当函数调用时,系统计算出实参的值,然后按顺序传给相应的形参。2.函数参数的传递方式在C语言中进行函数调用时,有两种不同的参数传递方式,即值传递方式和地址传递方式。(1)值传递在函数调用时,实参将其值传递给形参,这种传递方式即为值传递。实参对形参的数据传递是“值传递”,即单向传递,只能由实参传递给形参,而不能直接由形参传回来给实参。注意:在调用函数时,给形参分配存储单元并将实参对应的值传递给形参,但是当函数调用结束后形参单元被释放,而实参单元仍保留并维持原值。因此,函数调用时,形参的值不管如何变化都不会影响实参的值。(2)地址传递地址传递指的是调用函数时,实参将变量或数组等的地址传递给形参,这样实参和形参就指向同一个内存空间。地址传递的函数调用时,形参的变化会带来实参内容的改变。通常指针和数组是按地址传递的。3.函数的返回值函数调用结束时一般需要得到一个确定的值,C语言中是通过return语句来实现的,其一般形式:return(表达式);或return表达式;说明:(1)return语句有双重作用:=1\*GB3①从函数中退出;=2\*GB3②返回到调用函数中并向调用函数返回一个确定的值。return语句也可以没有表达式,此时它的作用仅是使执行的流程返回到调用函数的调用位置继续执行调用函数。(2)当函数有返回值时,在允许表达式出现的地方,都可以调用函数。例如:a=myfunciton1(2,3)+myfunciton2(“hello”);(3)一个函数中可以有多个return语句,程序执行到那一个return语句,那一个语句起作用,其它不起作用。例如:intfun(intx){if(x>0)return1;elsereturn-1;}(4)return语句表达式类型必须与函数定义类型兼容,当二者不一致时,由函数类型决定返回值的类型,即自动进行类型转换。(5)若函数无return语句,则函数类型只能是void类型,即无返回值。(三)函数原型声明C语言要求先定义后使用,函数也不例外。因此如果被调用函数的定义位于调用函数之后,则必须声明函数,反之则不用。函数原型声明的一般形式:类型说明符函数名(参数表);例如,在主函数中调用func2函数时,可进行如下声明:intmain(){voidfunc2();//对被调用函数的声明func2();return0;}voidfunc2(){printf(“函数2被调用”);}说明:(1)“定义”和“声明”的区别。函数“定义“是指对函数功能的确定,包括指定函数名、函数返回值类型、形参及其类型、函数体等。而“声明”则是对已定义函数的函数名、函数类型以及形参的类型、个数及顺序进行说明。(2)函数声明中函数名后的圆括号中可以只给出形参类型,省略形参的变量名字,但是不建议如此做。(3)函数原型声明也可以在函数的外部(#include语句后边),则在各个调用函数中不必再对所调用的函数进行声明。(4)当被调用的函数与调用函数不在一个文件中时,必须使用函数声明。(5)可以将多文件编译的函数声明放在自定义的.h文件中,然后在调用函数头部包含该.h文件。1)函数的嵌套调用函数的嵌套调用是指一个函数在被调用的过程中可以调用其它函数。比如main函数调用了a函数,然后a函数又调用了b函数,如下图所示。其执行过程为主函数调用函数a,函数a又调用函数b,函数b执行完毕返回函数a,函数a执行完后返回主函数,主函数继续执行函数调用下面的语句直至结束。程序的函数调用示意图2)函数的递归调用函数的递归调用是指在调用一个函数的过程中又直接或间接地调用该函数本身。例如:在函数fun1执行过程中,又调用到了自身函数,这是直接递归调用,如图:图7-13程序的函数调用示意图再比如:intfun1(intx){inty;……y=fun2(n);returny;}intfun2(inta){intb;…b=fun1(a);returnb;…}执行函数fun1的过程中,函数fun1要调用函数fun2,而在执行函数fun2的过程中又要调用函数fun1,这就是间接递归调用,如图所示。递归函数结构简练,但是其存在着自调用语句,如果没有控制好,将出现死循环。因此在函数内必须有终止递归调用的条件。因此,函数递归调用方法必须具备两个要素:递归调用公式和结束条件。图7-14程序的函数调用示意图(一)数组元素作为实参数组元素作为实参时,形参通常为普通变量。数组元素作为实参使用与普通变量是完全相同的,在函数调用时,作为实参的数组元素的值传递给形参,实现单向的值传递。(二)数组作为函数参数数组名作为函数参数时,则实参和形参都应该是数组名。用数组名作函数实参时,向形参传递的数组首地址,是地址传递。1.一维数组作为函数参数一维数组作为函数参数时,形参的写法为:类型说明符形参数组名[数组长度]例如:floataverage(floatarray[10]){…}一维数组作为形参时可以不指定数组的长度,但方括号不能省略。通常,需要用另一个参数来告诉被调用函数参数数组的长度,以便程序处理数组。2.二维数组作为函数参数二维数组作为函数参数时,形参的写法为:类型说明符形参数组名[数组长度1][数组长度2]二维数组作为函数参数时,可以不指定第一维的长度,但是第二维的长度不能省略。3.数组作为参数的函数调用数组作为函数参数进行函数调用时,实参应当采用数组名。例如:s=min(a,10)+max(b,10);(一)变量的作用域变量定义后,变量就具有了数据长度、存储形式等属性,另外变量还有其它一些重要的属性,如何时有效、在内存何时被释放等。变量的这些属性都与变量的作用域与生存期有关。变量的作用域是指变量能够起作用的程序范围。如果一个变量在某个文件或函数范围内有效,则该文件或函数为该变量的作用域,在此作用域内可以引用该变量,称变量在此作用域范围内可见。变量的生存期指的是变量值存在时间的长短,即从给变量分配内存,至所分配的内存被系统收回的那段时间。如果一个变量在某一时刻是存在的,则认为这一时刻属于该变量的生存期。按作用域角度划分,有局部变量和全局变量;按变量存在的时间划分,有静态存储变量和动态存储变量。1.局部变量和全局变量在无特殊说明的情况下,一个函数的代码对于程序的其它部分来说是隐藏的,它既不会影响程序的其它部分,也不会受程序的其它部分影响,或者是因为不同函数的变量分别有自己的作用域。变量根据作用域的不同分为两种类型:局部变量和全局变量。(1)局部变量在函数内部或复合语句中定义的变量称为局部变量。局部变量的作用域仅仅局限于定义它的函数和复合语句。局部变量需要注意:=1\*GB3①在一个函数内部定义的变量只在本函数范围内有效,只有在本函数内才能引用,主函数中定义的变量也是局部变量,其它函数不能使用,同时主函数也不能使用其它函数定义的变量。=2\*GB3②形式参数也是局部变量,只在定义它的函数中有效,其它函数不能使用。=3\*GB3③不同函数中定义的变量可以同名,它们的作用域不同,并不冲突。=4\*GB3④复合语句中定义的变量的作用域为本复合语句,复合语句之外也不能使用。(2)全局变量在函数体外定义的变量称为全局变量,全局变量的作用域是从它的定义点开始到本源文件结束,即位于全局变量定义后面的所有函数都可以使用此变量。全局变量从程序运行起即占据内存,在整个程序运行过程中可随时访问。但是如果要在定义全局变量之前的函数中使用该变量,则需在该函数中关键字extern对全局变量进行外部说明。因此为了使用方便,一般把全局变量的定义放在所有使用它的函数之前。注意:=1\*GB3①在同一个源文件中,当局部变量与全局变量同名时,在局部变量的作用范围内,全局变量不起作用。=2\*GB3②设置全局变量可以增加函数之间的联系。由于同一源文件中所有函数都能使用全局变量,如果在一个函数中改变了全局变量的值,其它函数就可以共享。=3\*GB3③全局变量使得函数的执行依赖于外部变量,降低了程序的通用性。=4\*GB3④模块化程序设计要求各模块之间的关联性要小,函数应尽可能是封闭的。因此外部函数不利于模块化。=5\*GB3⑤全局变量降低了程序的清晰性。各个函数执行时都可能改变全局变量的值,因此很难清楚地判断出每个瞬时各个全局变量的值。(二)变量的存储方法用户存储空间分为三部分:程序区、静态存储区和动态存储区。其中,程序区存放的是可执行程序的机器指令;静态存储区存放的是程序运行期间需要占用固定内存单元的变量,如全局变量;动态存储区存放的是在程序运行期间根据需要动态分配存储空间的变量,如局部变量和形参变量等。变量的存储属性就是数据在内存中的存储方法。存储方法可分为两大类:动态存储和静态存储,具体分为四种:自动型、静态型、寄存器型和外部型。下面分别介绍它们的特性和应用。1.局部变量的存储方法局部变量可有三种存储类型:自动型、静态型和寄存器型。(1)自动变量函数中的局部变量,如果不进行专门的说明,则对它们分配和释放存储空间的工作由系统自动处理,这类局部变量称为自动变量。自动变量定义的一般形式:auto类型说明符变量名;因为变量默认存储类型为自动型,所以关键字auto通常省略。自动变量是在动态存储区分配存储单元的。函数开始调用时,系统为其分配临时存储单元,函数调用结束后,这些存储单元立即被收回,自动变量中存放的数据也随之丢失。每调用一次函数,自动变量都被重新赋一次初值。(2)局部静态变量局部静态变量在函数调用结束后仍然保留其中定义的局部变量的值,其定义的一般形式:static类型说明符变量名;注意:=1\*GB3①局部静态变量是在静态存储区分配存储单元的,在整个程序运行期间都不释放。因此其值能够保持连续性。=2\*GB3②局部静态变量是在编译过程中赋初值的,并且只赋一次初值。当第二次运行赋值语句时,不再执行。=3\*GB3③局部静态变量如果没有赋值,则采用默认初值,整型变量为0,字符串变量为空字符。(3)寄存器变量寄存器变量保存在CPU的通用寄存器中,用关键字“register”进行说明。例如:registercharch;使用寄存器变量可以缩短存取时间,通常将使用频率较高的变量设定为寄存器变量,如循环控制变量等。说明:=1\*GB3①只有局部变量和形参可以作为寄存器变量。=2\*GB3②只有int、char和指针类型变量可定义为寄存器型。寄存器变量定义符register对编译器来说,是一种请求,而不是命令。编译器可能在不具备的条件下自动地将某些寄存器变量改为非寄存器变量。2.全局变量的存储方法全局变量是在静态存储区分配存储单元的,其默认的初值为0。全局变量的存储类型有两种,即外部类型和静态类型。(1)外部全局变量外部全局变量是指在其它源文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 服装加工厂服装检验质量标准流程指南
- 酒店大堂经理宾客满意度与服务效率绩效衡量表
- 投资顾问市场分析预测能力绩效评定表
- 对销售订单修改的申请回复函(4篇)
- 资本运营与财务管理的策略分析
- 神经外科出科考试试题(含答案)
- 职业病防护单位检修员检修维修安全操作规程
- 物业小区盗窃事件应急预案演练脚本
- 智能化仓储系统安装专项施工方案
- 汽车维修技师混合动力系统检修手册
- 2026年齐齐哈尔市总工会工会社会工作者招聘备考题库含答案详解
- 车辆爆胎安全教育
- 2025版 全套200MW800MWh独立储能项目EPC工程概算表
- 2025上海松江国有资产投资经营管理集团有限公司下属公司招聘4人考试笔试模拟试题及答案解析
- 公需科目2023年度数字经济与驱动发展考试题库及答案
- 投资组合-银行业财富管理专题系列报告之一居民资产配置方向:现状、复盘及展望-国泰海通证券
- 中国软件行业协会:2025中国软件行业基准数据报告 SSM-BK-202509
- 现代农业玉米种植技术推广资料
- 2025年甘肃省预防接种技能竞赛理论考试题库(含答案)
- DB61-T5126-2025 陕西省建设工程工程量清单计价标准
- 小升初数学几何专项训练题集
评论
0/150
提交评论