函数张丽杰2010-3-7程序设计基础——函数22020/2/3C语言程序结构函数分类函数定义函数声明函数调用程序设计基础——函数32020/2/3C语言程序结构一般程序都是由一个主函数main()组成,程序的所有操作都在主函数中完成。(当然也包含一些库函数)对于小程序可以这样做,但是,对于一个有一定规模的程序这样做就不合适了。程序设计基础——函数42020/2/3#includestdio.h/*库函数的声明*/intmaxmum(intx,inty,intz);/*自定义函数声明*/intminmum(intx,inty,intz);/*自定义函数声明*/voidmain()/*主函数*/{inta,b,c,max,min;scanf(%d,%d,%d,&a,&b,&c);max=maxmum(a,b,c);/*函数作表达式,并用变量保存最大值*/printf(max=%d\n,max);min=minmum(a,b,c);/*函数作表达式,并用变量保存最小值*/printf(min=%d\n,min);}intmaxmum(intx,inty,intz)/*自定义函数*/{intmax;max=(xy)?x:y;max=(maxz)?max:z;return(max);/*函数的返回值*/}intminmum(intx,inty,intz)/*自定义函数*/{intmin;min=(xy)?(xz?x:z):(yz?y:z);returnmin;/*函数的返回值*/}程序设计基础——函数52020/2/3C程序结构b函数a函数c函数d函数e函数main()主函数f函数库函数必须的,起点b函数a函数c函数d函数e函数main()主函数f函数库函数必须的,起点程序设计基础——函数62020/2/3C语言程序结构函数分类函数定义函数声明函数调用程序设计基础——函数72020/2/3函数分类从用户角度标准函数(库函数):由系统提供,用户不必自己定义这些函数,可以直接使用它们。不同的C系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。用户自定义函数:用以解决用户的专门需要。程序设计基础——函数82020/2/3从函数形式无参函数:在调用无参函数时,主调函数不向被调用函数传递数据。无参函数一般用来执行指定的一组操作有参函数:在调用函数时,主调函数在调用被调用函数时,通过参数向被调用函数传递数据,一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。程序设计基础——函数92020/2/3C语言程序结构函数分类函数定义函数声明函数调用程序设计基础——函数102020/2/3函数的定义合法标识符函数返回值类型:缺省int型,无返回值void函数体函数类型函数名(形式参数类型说明表){声明部分执行部分}例有参函数intmax(intx,inty){intz;if(xy)z=x;elsez=y;return(z);}例空函数dummy(){}函数体为空例无参函数voidprintstar(){printf(“**********\n”);}参数:传递数据信息的通道程序设计基础——函数112020/2/3特别注意函数不能单独运行函数可以被主函数或其它函数调用也可以调用其它函数但是不能调用主函数。程序设计基础——函数122020/2/3C语言程序结构函数分类函数定义函数声明函数调用程序设计基础——函数132020/2/3函数声明在C程序中,调用函数的时候,如果被调用函数在调用它的函数之前定义,则可以直接调用,不需要声明;如果被调用函数在调用它的函数之后定义,那么就应先进行函数定义,才能够正确调用。程序设计基础——函数142020/2/3函数声明包括两种形式:1.标准库函数的声明的一般形式如被调用函数为C语言系统提供的标准库函数,可在程序的开头部分用#include进行文件包含,我们在前面见过的printf()、scanf()等函数,就属于这种形式。所以在使用这两个函数之前应在程序开头部分用下面的语句进行包含:#includestdio.h#includemath.h程序设计基础——函数152020/2/32.自定义函数声明的一般形式:函数类型函数名(类型名形参1,类型名形参2…);函数类型函数名(类型,类型);作用:仅仅是告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数声明不同:函数声明仅仅是对被调用函数的说明。函数声明位置:程序的数据说明部分(函数内或外)程序设计基础——函数162020/2/3函数声明举例voidmain(){floata,b;intc;scanf(%f,%f,&a,&b);c=max(a,b);printf(Maxis%d\n,c);}intmax(floatx,floaty){floatz;z=xy?x:y;return(z);}int型函数可不作函数声明(BorlandC++不行)floatadd(floatx,floaty){floatz;z=x+y;return(z);}voidmain(){floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);}被调函数出现在主调函数之前,不必函数声明voidmain(){floatadd(float,float);/*函数声明*/floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}可以:floatadd();不提倡。或:floatadd(floatx,floaty);floatadd(float,float);/*函数声明*/voidmain(){floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}程序设计基础——函数172020/2/3C语言程序结构函数分类函数定义函数声明函数调用程序设计基础——函数182020/2/3主调函数与被调函数C语言程序是由若干个函数组成的,各函数在结构上是独立的,但它们所处理的数据却是相互联系的。一个函数定义好后,就必须用一定的方式去调用它。当一个函数调用另一个函数时,将调用的函数称为主调函数,将被调用的函数称为被调函数。主调函数和被调函数具有数据传递的关系,其传递的实施是通过函数的参数来实现的。程序设计基础——函数192020/2/3函数的调用一般形式函数名(实参表);如:intmain(){inta=6,b=5,c;c=Max(a,b);printf(较大值为%d,c);system(pause);return0;}程序设计基础——函数202020/2/3voidmain(){…….t=Max(a,b);………}intMax(intx,inty){intmax;if(x=y)max=x;elsemax=y;returnmax;}函数调用被调函数主调函数程序设计基础——函数212020/2/3函数调用说明①如果调用的是无参函数,则“实际参数表”可以没有,但括号()不能省略。Max()②如果实参表包含多个实参,则各参数间用逗号隔开。Max(a,b)③实参与形参的个数应相等、类型应一致。④实参与形参按顺序对应,一一传递数据。程序设计基础——函数222020/2/3函数调用说明⑤函数不能嵌套定义,即在一个定义好的函数中,又定义另一个函数。但是函数之间允许相互调用,也允许嵌套调用。但main函数不能被调用。⑥函数还可以自己调用自己,称为递归调用。程序设计基础——函数232020/2/3函数参数形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式c=max(a,b);(main函数)(max函数)max(intx,inty){intz;z=xy?x:y;return(z);}例比较两个数并输出大者#includestdio.hvoidmain(){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);}形参实参(主调函数)c=max(a,b);(被调函数)max(intx,inty)实际参数形式参数参数传递程序设计基础——函数242020/2/3参数传递——值传递方式值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递实参a10形参x10复制实参内存空间形参内存空间程序设计基础——函数252020/2/3711x:y:调用前调用结束711x:y:例值传递举例#includestdio.hvoidmain(){intx=7,y=11;printf(x=%d,\ty=%d\n,x,y);printf(swapped:\n);swap(x,y);printf(x=%d,\ty=%d\n,x,y);}swap(inta,intb){inttemp;temp=a;a=b;b=temp;}调用711a:b:711x:y:swap711x:y:117a:b:temp程序设计基础——函数262020/2/3参数传递——地址传递方式地址传递方式:函数调用时,将数据的存储地址作为参数传递给形参特点:形参与实参占用同样的存储单元“双向”传递实参和形参必须是地址常量或变量实参a形参x实参内存空间形参内存空间程序设计基础——函数272020/2/3711x:y:调用前调用结束117x:y:例地址传递举例#includestdio.hvoidmain(){intx=7,y=11;printf(x=%d,\ty=%d\n,x,y);printf(swapped:\n);swap(&x,&y);printf(x=%d,\ty=%d\n,x,y);}swap(inta,intb){inttemp;temp=a;a=b;b=temp;}调用a:b:swap117a-x:b-y:temp程序设计基础——函数282020/2/3谢谢!