资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第六章 函数与预编译处理,教学目的要求:,1,、掌握函数的一般概念和使用的时机,2,、了解模块化程序设计的基本概念,3,、掌握标准函数库的使用,4,、掌握函数定义的形式、调用以及参数和参数传递,5,、掌握编译预处理,尤其是宏定义,6,、能灵活运用函数进行编程,重点,难点:,1,、模块化的概念及其设计原则,2,、标准函数的使用方法,3,、函数的概念、定义的形式、参数的传递以及实参、形参的区别,4,、编译预处理中的带参宏定义,5,、函数的嵌套调用,概 述,一件事情,往往要实现,多个功能,一个程序,多个函数,一个,C,程序可由一个主函数和若干个函数构成。,main,a,b,c,d,e,f,g,h,h,i,e,g,由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。,i,关于函数的几点说明,1,、一个源程序文件由一个或者多个函数组成。,一个源程序文件是一个编译单位,而不是以函数为单位进行编译,.,2,、一个,C,程序由一个或者多个源文件组成。,3,、从用户使用的角度看,函数有两种,:,标准函数,和,用户自己定义的函数,.,4,、从函数的形式看,函数有两种,:,无参函数,和,有参函数,.,05.9-14,以下关于函数的叙述中正确的是,A,)每个函数都可以被其它函数调用(包括,main,函数),B,)每个函数都可以被单独编译,C,)每个函数都可以单独运行,D,)在一个函数内部可以定义另一个函数,(,B,),print_star,(),printf,(“*”);,*,How do you do!,*,print_message,(),printf,(“,nHow,do you do!n”);,main(),printf_star,();,/*,调用,printstar,函数*,/,print_message();,/*,调用,print_message,函数*,/,printf_star,();,/*,printstar,函数*,/,2,、,有参,函数的定义形式,类型标识符 函数名(形式参数表列),声明部分,语句,函 数 定 义 的 形 式,1,、,无参,函数的定义形式,类型标识符 函数名(),声明部分,语句,int,max(,int,x,int,y),int,z;,z=x y?x:y;,return(z);,函数类型 函数名,(,参数类型 参数名,,,参数类型 参数名,),print_message(),printf,(“How do you do!n”);,关 于 定 义 的 说 明,1,、,max,为函数名,括号中有两个形式参数,x,和,y,,,均是整型。在调用时,主调函数把实参的,值传递,给被调用函数,max,中的形参,x,和,y,,,这时,x,和,y,才获得相应的存储单元。其本质是进行值的复制,.,2,、花括弧内是函数体,它包括,声明部分,和,语句部分,。在声明部分定义函数中所用的变量(局部变量)。,int,max(,int,x,int,y),int,z;,z=x y?x:y;,return(z);,3,、在语句部分中求解,,return,(,z,),的作用是将,z,的值作为整个函数的值带回到主调函数,,return,后面括号中的值,z,就是函数带回的值即函数返回值。,4,、如果在定义函数时不指定函数类型,系统会,隐含指定函数类型为,int,型,。,因此上面定义的,max,函数左端的,int,可以省写。,函 数 参 数,形式参数,和,实际参数,在调用函数时,大多数情况下,主调函数和被调用函数之间有数据传递关系。这就是前面提到的有参函数。,在,定义函数,时,函数后面括弧,中的变量名称为“,形式参数,”(简称“,形参,”),,int,max(,int,x,int,y,),在,主调函数中,调用函数时,函数名后面括弧中的参数(可以是表达式)称为,“,实际参数,”,(,简称“实参”),如,c=max(,a,b,),。,main(),int,a,b,c;,scanf(“%d,%d”,&a,&b,);,c=max(a,b);,printf(“Max,is%d”,c);,int,max(int,x,int,y),int,z;,z=xy?x:y;,return(z);,a,b,c=max(a,b);,说 明,(5),实参变量对形参变量的数据传递,“,值传递,”,,即,单向传递,,,只由实参传给形参,而不能由形参传回来给实参,.,在内存中,实参单元与形参单元是不同单元。,2,x,a,2,3,y,b,3,3,x,a,2,2,y,b,3,swap(int,x,int,y),int,t;,t=x;x=y;y=t;,main(),int,a=2,b=3;,if(ay?x:y;,return(z);,说 明,下面对函数值作一些说明:,1,、函数的返回值是通过函数中的,return,语句,获得的。,return,语句将被调用函数中的一个确定的值带回主调函数中去。,如果需要从被调用函数带回一个函数值(供主调函数使用),,被调用函数中必需包含,return,语句。如,:,例,2,如果不需要从被调用函数带回函数值可以不要,return,语句,如,:,例,1,或者有,return,语句,但没有具体返回值,即,return;,语句。,两种情况,:,说 明,(3)returen,后面的值可以是一个表达式。,例如,,max(int,x,int,y),return(xy?x:y);,注意:,(,1),一个函数中可以有一个以上的,return,语句(作为选择结构的各,个分支的内嵌语句,;,不能出现顺序结构的多个,return,语句),,执行到哪一个,return,语句,哪一个语句起作用。,(2)return,语后面的括弧可以不要,如,return z;,如果出现多个,return,语句,且不是出现在选择结构的各个分,支中,则系统会自动执行第一个,return,语句,其它的不被执行,说 明,2,、函数值的类型。,(1),既然函数有返回值,这个值当然应属于某一个确定的类型,,应当在定义函数时指定函数值的类型。,(2),凡不加类型说明的函数,一律自动按,int,处理。,(3),在定义函数时,return,语句中的表达式类型一般应该和函数说,明的类型一致。,3,、如果被调用函数中没有,return,语句,不带回值。,但实际上,函数并不是不带回值,而只是,不带回有用的,值,带回的是一个,不确定的,值。,int,a,b,c,;,a=,printstar,();b=,print_message,();c=,printstar,(),;,printf(“%d,%d,%dn”,a,b,c,);,上面的语句也是合法的,运行时除了可以得到和例,1,一样的结果外,还可以输出,a,、,b,、,c,的值。但是,a,、,b,、,c,的值没有实际意义。,说 明,4,、为了明确表示,“,不带回值,”,,可以用,void,(,空类型或无类型),定义函数类型。,例如,例,1,中的定义可以改为,void,printstar,()void print_message(),这样,系统就保证不使函数带回任何值,即,禁止,在调用函数中使用函数的返回值。,则下面的用法就是错误的:,a=,printstar,();,b=print-message();,编译时会给出出错信息。,05.9-30,设函数,fun,的定义形式为,void,fun(char,ch,floatx),则以下对函数,fun,的调用语句中,正确的是,A,),fun(“abc”,3.0);B,),t=fun(D,16.5);C,),fun(65,2.8);D,),fun(32,32);,06.4-46,以下叙述中错误的是,A)C,程序必须由一个或一个以上的函数组成,B),函数调用可以作为一个独立的语句存在,C),若函数有返回值,必须通过,return,语句返回,D),函数形参的值也可以传回给对应的实参,等 考 实 例,(,D,),(,D,),函 数 的 调 用,函数调用的一般形式为,函数名(,实参表列,),如果是调用无参函数,则,“,实参表列,”,可以没有,但,括弧不能省略,,如果实参表列包含多个实参,则各参数间用逗号隔开。,实参与形参的个数应相等,类型应一致。,实参与形参按顺序对应,一 一传递数据,。,函 数 调 用 的 方 式,按函数在程序中调用的位置,可以有以下三种函数调用方式:,1,、函数语句,:,把函数调用作为一个语句。,如例,1,中的,printstar,();,这时不要求函数带回值,只要求函数完成一定的操作。,2,、函数表达式,函数出现在一个表达式中,这种表达式称为函数表达式。,这时要求函数带回一个确定的值以参加表达式的运算。,例如:,c=2*,max(a,b,);,3,、函数参数,函数调用作为一个函数的实参。,例如:,m=max(a,max(b,c);,又如:,printf(,“,%d,”,max(a,b,);,实质上是函数表达式形式调用的一种,因为函数的参数本来就要求是表达式形式。,关于函数调用的几点说明,1,、,C,程序的执行,从,main,函数开始,调用其它函数后,流程,回到,main,函数,。,2,、所有的函数都是平行的,即在定义函数时是互相独立的,一个函数并不从属于另一个函数,即函数,不能嵌套定义,函数间可以互相调用,但是,不能调用,main,函数,.,3,、被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。,4,、如果使用库函数,一般还应该在本文件开头用,#include,命令将调用有关库函数时所需用到的信息,“,包含,”,到本文件中来。,函 数 声 明,如果使用用户自己定义的函数,而且该函数与调用它的函数(即主调函数)在同一个文件中,一般还应该在主调函数中对被调用的函数作,声明,,即向编译系统声明将要调用此 函数,并将有关信息通知编译系统。,函数声明,int,max(,int,x,int,y);,在函数声明中也可以不写形参名,而只写形参的类型。,如:,int,max(,int,int,);,函数原型的一般形式为,1,、函数类型 函数名(参数类型,1,,参数类型,2,),在,C,语言中,以上的,函数声明,称为,函数原型。,主要是利用它在程序的编译阶段对调用函数的合法性进行全面检查。,2,、函数类型 函数名(参数类型,1,,参数名,1,,,参数类型,2,,参数名,2,),06.4-20,若各选项中所用变量已正确定义,函数,fun,中通过,return,语句返回一个函数值,以下选项中错误的程序是,A)main()x=fun(2,,,10),;,float,fun(int,a,,,int,b),B)float,fun(int,a,,,int,b),main()x=,fun(i,j,),;,C)float,fun(int,,,int,),;,main()x=fun(2,,,10),;,float,fun(int,a,,,int,b),D)main(),float,fun(int,i,,,int,j),;,x=,fun(i,j,),;,float,fun(int,a,,,int,b),等 考 实 例,(,A,),05.9-12,有以下程序,int,sub(int,n)return(n/10+n%10);main(),int,x,y,;,scanf(“%d”,&x,);y=,sub(sub(sub(x,);,printf(“%dn”,y,);,若运行时输入:,1234,,程序的输出结果是,。,06.4-33,有以下程序,int,fun1(double,a)return,a*=a,;,int,fun2(double x,,,double y)double a=0,,,b=0,;,a=fun1(x),;,b=fun1(y),;,return(int)(a+b,),;,main()double w,
展开阅读全文