信息科学与工程学院1C语言程序设计信息科学与工程学院2上一章内容回顾循环结构的两个要素?while语句如何组合这两个关键要素?dowhile语句如何组合这两个关键要素?for结构中的三个表达式运算方式break语句的作用continue语句的作用什么叫循环的嵌套穷举算法迭代算法信息科学与工程学院3第5章函数本章需要掌握的知识点:函数定义函数说明函数调用形参和实参的关系变量的存储类别信息科学与工程学院4内容安排5.1问题的提出5.2函数基础5.3函数的定义5.4函数调用5.5参数传递5.6函数说明5.7变量的存储类别*5.8递归调用信息科学与工程学院55.1问题的提出C语言程序是由什么构成的?函数什么是函数?能完成特定功能的功能块;一般有输入参数和返回值;一次定义,可以调用多次。一个C语言程序为什么需要不同的函数?一个函数过大难于编写和维护;一个函数的程序不利于协作;代码和功能共享的需要。信息科学与工程学院65.2函数基础函数的应用涉及到3个环节:(1)函数定义(2)函数声明(说明)(3)函数调用信息科学与工程学院75.3函数的定义C函数的定义由函数头与函数体两部分组成,形式如下:函数返回值的数据类型说明函数名称(形式参数列表){函数内部数据说明;执行语句;}函数头函数体信息科学与工程学院例1计算两个整数的平均值的函数intAverage(intx,inty){intresult;result=(x+y)/2;returnresult;}函数头函数体返回值类型函数名,说明函数的功能形参列表,函数入口定义内部变量返回值作为函数调用表达式的值信息科学与工程学院9return语句注意事项在函数体中遇到return,函数结束,同时将return后面所带的值作为函数值返回。return(表达式);和return表达式;都是正确的。在函数定义时,允许出现多个return语句,但每次函数执行时必定只有一条return语句被执行。在定义函数时指定的函数类型一般应和return语句中表达式的类型一致。信息科学与工程学院1.函数调用的一般形式函数名(实际参数表);(1)有参数函数:(2)无参数函数:函数名();2.函数调用的规则⑵实际参数表中的参数可以是常量、变量或表达式;⑶实参与形参个数相等,类型应一致;⑴多个实参间用逗号隔开;⑷实参与形参按顺序对应,一一传递数据;⑸函数调用可以嵌套。5.45.5函数调用和函数的参数传递信息科学与工程学院3.函数调用的方式(1)把函数调用作为一个语句。一般形式:函数名(实际参数表);这种方式常用于调用一个可以忽略返回值或没有返回值的函数。使用情况:如:printf(“Hello!\n”);信息科学与工程学院(3)函数调用作为一个函数的实参出现。如:d=max(max(a,b),c);如:printf(“%d”,max(a,b));(2)函数调用出现在表达式(函数表达式)中。一般形式:变量名=函数表达式;使用情况:这种方式用于调用带返回值的函数,函数的返回值将参加表达式的运算。如:a=3+max(num1,num2);注意:无返回值函数的调用,不能出现在表达式中。信息科学与工程学院4.函数参数和函数的值形式参数:在定义函数时函数名后面括弧中的变量名,简称形参。实际参数:在调用函数时函数名后面括弧中的表达式,简称实参。voidmain(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Maxis%d”,c);}intmax(intx,inty){intz;z=xy?x:y;return(z);}形参表实参表信息科学与工程学院(2)形参是函数的内部变量,只在函数内部才有意义;(3)实参对形参的数据传递是值传递,即单向传递,只由实参传递给形参,反之不可。调用结束后,只有形参单元被释放,实参单元中的值不变。(1)形参调用前不占内存单元,调用时占用,调用后释放;5.函数的传值调用信息科学与工程学院156.函数调用举例分析(见下页)信息科学与工程学院intmax(intx,inty)/*函数定义*/{inttemp;if(xy)temp=x;elsetemp=y;returntemp;}voidmain(){inta,b;scanf(%d,%d,&a,&b);a=max(a,b);/*函数调用*/printf(\nmax=%d\n,a);}例2求两个整数中的最大值…...…...20002008200A2002200420065变量a变量b(main)9变量temp变量y变量x(max)959COPY实参到形参是单向值传递信息科学与工程学院intmax(intx,inty){inttemp;if(xy)temp=x;elsetemp=y;returntemp;}voidmain(){inta,b;scanf(%d,%d,&a,&b);a=max(a,b);printf(\nmax=%d\n,a);}例求两个数中的最大值…...…...20002008200A2002200420069变量a变量b(main)9运行结果:max=9信息科学与工程学院例3函数间的参数传递voidswap(intx,inty);//函数声明voidmain(){inti,j;i=2,j=6;printf(调用前:i=%d,j=%d\n,i,j);swap(i,j);//函数调用printf(调用后:i=%d,j=%d\n,i,j);}voidswap(intx,inty)//函数定义{inttemp;printf(交换前:x=%d,y=%d\n,x,y);temp=x;x=y;y=temp;printf(交换后:x=%d,y=%d\n,x,y);}运行结果:调用前:i=2,j=6交换前:x=2,y=6交换后:x=6,y=2调用后:i=2,j=6xy2662信息科学与工程学院六函数的嵌套调用嵌套调用:在调用一个函数的过程中,又调用另一个函数。嵌套定义:在定义一个函数时,该函数体内包含另一个函数的定义。C语言不能嵌套定义,但可以嵌套调用。在调用一个函数的过程中,又调用另一个函数。信息科学与工程学院205.6函数说明什么是函数说明?向编译系统声明将要被调用函数的接口信息。在什么情况下需要函数说明?函数的定义出现在被调用之后或者在其他文件中。函数说明的形式?信息科学与工程学院函数说明intfun(int,char);函数类型函数名函数的参数intfun(intxxx,charyyy);信息科学与工程学院225.7变量的存储类别作用域(可用域)与生存期局部变量与全局变量自动变量与静态变量信息科学与工程学院23作用域(可用域)与生存期C语言中定义的变量都有一个起作用的范围,称为变量的作用域。程序运行时,变量被创建和被删除的时间段,称为变量的生存期。信息科学与工程学院24局部变量和全局变量在一个函数内部定义的变量是内部变量,它只在本函数内部范围内有效。也就是说只有在本函数内才能使用它们。这些变量称为“局部变量”。在函数之外定义的变量称为外部变量,也称为全局变量,在文件内的所有函数都能使用它。它的有效范围为从定义变量的位置开始到文件的结束。信息科学与工程学院25局部变量的注意事项不同函数中可以使用相同名字的变量,它们代表不同的数据对象,互不干扰。形式参数也是局部变量在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也可称为“分程序”或“程序块”。信息科学与工程学院26全局变量的注意事项建议只有在必要时才使用全局变量。当局部变量与全局变量同名时,以局部变量优先。信息科学与工程学院27自动变量与静态变量用auto说明的变量是动态变量,auto可以省略。动态变量在调用函数时被创建,函数调用结束后删除。用static说明的变量是静态变量,程序一启动就创建,程序结束后才删除。信息科学与工程学院28练习intd;intf(intc){staticinta;intb;…………}请问a、b、c、d的作用域和生存期?信息科学与工程学院29*5.8递归调用在一个函数的定义中出现直接或间接地调用该函数本身,称为函数的递归调用。信息科学与工程学院intf(intx){inty,z;z=f(y);return(2*z);}intf1(intx){f2(y);}intf2(){f1();}信息科学与工程学院31关键问题构造递归表达式。将问题规模缩小,或者将规模放大。确定递归结束条件。否则递归无法结束。信息科学与工程学院32例用递归方法求n!根据n!的运算规律可以写出以下递归公式:)!1(*1!nnn(n=0,1)(n1)定义函数doublefac(intn)来求n!的值,在main中负责用户输入和结果输出。信息科学与工程学院33小结函数定义的形式?函数说明的作用?在什么情况下需使用到函数说明?函数的调用形式?函数调用时实参如何传递给形参?实参可以是常量吗?变量的作用域和生存期?全局变量和局部变量?自动变量和静态变量?什么问题可以用递归解决?信息科学与工程学院34课堂作业P140第6题信息科学与工程学院35课外练习P.1405-85-95-11信息科学与工程学院36上机实验五《上机指导》实验五函数基础部分:课堂作业提高部分:教材P1405-85-95-11实验步骤:(1)先自学并完成上机指导实验5函数P113-119内容;(2)完成并提交课堂作业的程序,程序源文件的名称为:班级+学号后两位+姓名+实验五.cpp。