第07章-函数与变量作用域.ppt
《第07章-函数与变量作用域.ppt》由会员分享,可在线阅读,更多相关《第07章-函数与变量作用域.ppt(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7 7章章 函数与变量作用域函数与变量作用域C语言是通过函数函数来实现模块模块化程序设计的。教学目的教学目的:掌握掌握函数的定义与调用,变量的作用域;了了解解函数的嵌套与递归调用,内部、外部函数特点,以及变量的存储特性。1/24/20231教学内容教学内容:7.1*函数的定义与调用函数的定义与调用7.2 函数的嵌套调用与递归调用函数的嵌套调用与递归调用7.3 内部函数与外部函数内部函数与外部函数7.4*内部变量与外部变量内部变量与外部变量7.5 变量的变量的存储特性存储特性 本章要点本章要点本章作业与上机实践本章作业与上机实践1/24/202327.17.1*函数定义与函数调用函数定义与函
2、数调用7.1.1 7.1.1 函数定义函数定义任何函数函数都是由函数说明函数说明和函数体函数体两部分组成。1分类分类根据函数有无参数,将函数分为无无参参函数和有有参参函数。1/24/20233(1)无参函数函数类型 函数名(void)说明语句部分;可执行语句部分;(2)有参函数函数类型 函数名(数据类型数据类型 参数参数,数据类型,数据类型 参数参数2)说明语句部分;可执行语句部分;形参形参表。调用有参函数时,由调用函数为形参提供实际值,简称为实参实参。在新标准中,函数不可缺省参数表;用“void”表示不需要参数。1/24/202342 2函数的返回值与函数类型函数的返回值与函数类型语言的函数
3、,还可分为有有返返回回值值函数和无无返返回回值值函数两种。(1)有返回值函数与return语句语句一般格式:return(返回值表达式返回值表达式);功能:返回调用函数,并将“返回值表达式”的值带给调用函数。注意注意:函数中无return语句,返回1个不确定的值。可用“void”定义成“无(空)类型”,明确表示不返回值。括号可以缺省1/24/20235(2)函数类型函数类型函数类型应与return语句中“返回值表达式返回值表达式”的类型一致。如果不一致,则以函数类型函数类型为准。如果缺省函数类型,则系统一律按int型型处理。良好的程序设计习惯良好的程序设计习惯:为了使程序具有良好的可读性并减少
4、出错,将无返回值函数定义为空类型空类型void;同时,也不使用系统对函数类型的缺省缺省处理。1/24/20236案例案例7.1 定义一个求两个整数中极大值的max()函数。/*功能:求2个整数中的较大数 */*形参:2个,整型 */*返回值:2个整数中的较大数*/int max(int n1,int n2)/*函数定义*/return(n1 n2?n1:n2);/*/void main(void)int max(int n1,int n2);/*对被调用函数进行说明*/int num1,num2;printf(input two numbers:);scanf(%d%d,&num1,&num2
5、);printf(max=%dn,max(num1,num2);对函数的注释1/24/202373、说明说明(1)函数定义不允许嵌套不允许嵌套。一个函数的定义,可以放在程序中的任意位置,但不能在另一个函数的函数体内,即不能嵌套定义。例如:main()int max()(2)空函数函数体为空的无参函数:函数类型函数类型 函数名函数名(void void)1/24/202387.1.2 函数调用与返回函数调用与返回1 1、对被调用函数的说明和函数原型、对被调用函数的说明和函数原型(1)函数说明的一般格式 在新标准中,采用函函数数原原型型方式,对被调用函数进行说明:函数类型函数类型 函数名函数名(形
6、参表形参表);1/24/20239(2)函数说明的两种方式 谁调用谁说明:谁调用谁说明:函数说明语句放在调用函数的函数体中。例如,在案例案例7.1主函数main()中:void main(void)int max(int n1,int n2);对被调用函数进行说明1/24/202310预先统一说明预先统一说明函数说明通常放在所有函数定义体之前。在这种方式下,所有调用函数都无需再对自定义函数进行说明。例如,在案例案例7.1中,可以将对max()函数的说明放在程序文件开始处:void main(void)int max(int n1,int n2);1/24/202311显然,对于被多个函数调用的
7、自定义函数而言,采用预先统一说明方式进行说明,可以有效地减少函数说明次数。注意注意:如果被调用函数的定义体,出现在调用函数之前,可以缺省说明。1/24/2023122 2、函数调用、函数调用 函数名函数名(实参表实参表)例如,在案例案例7.1的主函数中:printf(,max(num1,num2);注意注意:调用有参函数,必须提供实参(常量/变量/表达式/函数)。调用时,实参必须具有确定的值,且与形参个数相等、类型匹配。1/24/202313(1)调用方式调用方式 语句语句方式无返回值函数的调用,可作为一条独立的语句。例如,printf()、scanf()等库函数的调用,均作为一条独立的语句。
8、表达式表达式方式有返回值函数作为表达式的一项,以函数返回值参与表达式的运算。例如,“max=max(x,y)”是一个赋值表达式,把max()函数的返回值赋予变量max。1/24/202314(2)断点与函数调用的返回断点与函数调用的返回断点断点被调用函数执行完毕,返回调用函数后继续执行的位置。调用函数中的断点位置分两种情况:语句语句调用方式:断点为函数调用语句的下一条语句。例如,案例案例7.1中的语句调用“printf();”,其断点为该语句的下一条语句“getch();”。1/24/202315 表达式表达式调用方式:断点为函数调用所在的表达表达式式。例如,在案例案例7.1中,“printf
9、(,max(num1,num2);”语句中的表达式调用“max(num1,num2)”:其断点为该表达式调用所在的表达式“max(num1,num2)”(在本例中,“max(num1,num2)”函数调用既是表达式调用,本身又构成一个简单表达式)。1/24/2023167.1.3 参数传递参数传递发生函数调用时,根据参数值的性质不同,将参数传递分为两种:(1)值值传递参数值是一个一般数据一般数据(整形、实型、字符型数据等)。系统把实参值复制1份给形参;被调用函数结束时,形参值不能传回给实参。(2)地址地址(引用引用)传递参数值是一个地址地址。1/24/202317执行案例案例7.1时的参数传递
10、:int max(int n1,int n2)return(n1 n2?n1:n2);main()int max(int n1,int n2);int num1,num2;printf(input two numbers:);scanf(%d%d,&num1,&num2);printf(max=%dn,max(num1,num2);1/24/202318(1)形形参参变量只有在被调调用用时,才分分配配内存单元;调用结束结束时,立即被释放释放。因此,形参只有在该函数内有效。调用结束,返回调用函数后,则不能再使用该形参变量。(2)实参和形参占占用用不不同同的的内内存存单单元元,即使同名也互不影响。
11、1/24/2023197.1.4 小结小结1函数定义不允许嵌套不允许嵌套。2调用有参函数时,实参实参的个数个数和类型类型,必须与形参形参匹配。3 函数调用的两种方式与断点位置(1)语句语句方式:断点为函数调用语句的下一条下一条语句。(2)表达式表达式方式:断点为函数调用所在的表达式表达式。1/24/2023204参数传递分两种:(1)值值传递:单向单向传递。(2)地址地址(引用引用)传递。返回返回1/24/2023217.2 7.2 函数的嵌套调用和递归调用函数的嵌套调用和递归调用7.2.1 函数的嵌套调用函数的嵌套调用 案例案例7.3 计算=1!+2!+n!(n1,20的整数,从键盘输入)。
12、算法设计要点:算法设计要点:本案例可以设计2个函数:factor()用于求n!;sum()通过调用factor()来实现求。程序框架如下(完整程序详见教材7.2.1):1/24/202322void main()sum(num);/*调用函数sum()*/void sum(int num)sum+=factor(loop);/*求累计和*/long factor(int num)/*求num的阶乘*/1/24/202323在案例案例7.3中,主函数main()调用求和函数sum(),sum()又循环调用求阶乘的函数factor()。一般地说,函数的嵌套调用嵌套调用是指,在执行被调用被调用函数函
13、数时,该函数又调用其它函数其它函数的情形。注意注意:被调用函数执行完毕后,将返回到调用函数的断点继续执行。简言之,谁调用,返回到谁的断点继续执行。1/24/2023247.2.2 函数的递归调用函数的递归调用案例案例7.4 用递归法计算n!(1!=1,n!=(n-1)!*n (n2))。算法设计要点:算法设计要点:(1)根据计算n!的递归定义可知,为了计算n!,必须首先计算(n-1)!;以此类推,直至1!(1!=1)。(2)依据1!求2!=1!*2,再依据2!求3!=2!*3;同理,依据(n-1)!求n!=(n-1)!*n。1/24/202325long factor(int num)long
14、 fact;if(num 1)fact=factor(num 1)*num;else fact =1;return(fact);以num=5为例,其执行过程详见教材7.2.2。递归调用自己1/24/202326语言允许函函数数直接(或间接)地调调用用它自自己己,称为递归调用;这种函数称为递归函数递归函数。例如,案案例例7.4中的函数factor()就是一个递归函数。防止递归调用无终止地进行的常用办法:添加1个继续(或终止)递归调用的条件判断。例如,案案例例7.4中函数factor()中的“if(num 1)”。返回返回1/24/2023277.3 7.3 内部函数和外部函数内部函数和外部函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 07 函数 变量 作用
限制150内