您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > C程序设计-第五章函数
1第5章函数C语言程序设计主讲:刘卫红liuweihong@ahut.edu.cn2005年3月2函数回顾P39,7:编写程序,输入一个正整数n,求,可以调用pow函数求幂。P39,9:编写程序,输入一个正整数n,求,要求定义和调用函数fact(n)计算n!,函数类型是double.12nii1!niei2005年3月312nii求#includestdio.h#includemath.hintmain(void){intn;intsum=0;scanf(%d,&n);for(i=1;i=n;i++)sum=sum+pow(2,i);printf(sum=%d\n,sum);getch();}这些可以直接拿来用的函数是标准库函数,特点:无需定义,直接调用你还能想出哪些曾经学过的库函数?2005年3月4求1!nieiintmain(void){intn;doublesum=0;doublefact(intn);scanf(%d,&n);for(i=1;i=n;i++)sum=sum+fact(i);printf(sum=%lf\n,sum);getch();}doublefact(intn){inti;doublef=1;for(i=1;i=n;i++)f=f*i;returnf;}函数定义函数调用函数声明用户定义的函数特点:先定义后调用,如果定义在调用前,则可以没有函数声明,如果定义在调用后,则必须加函数声明。2005年3月5函数的类型标准库函数特点:无需定义,直接调用用户定义的函数特点:必须先定义后调用函数优点:一次定义,多次调用,函数的目的是为了代码的重用,同时便于分工合作,使程序结构清晰。本章的重点:如何定义和调用函数2005年3月6本章要点函数、函数参数、函数值的基本概念函数的调用局部变量和全局变量。静态存储和动态存储变量的作用域。2005年3月75.1函数的定义和调用函数定义的一般形式函数类型函数名(类型名形式参数1,…){函数实现过程}例如:求两个数的最大值。intmax(intx,inty){intz;z=xy?x:y;return(z);}类型省略时默认为int类型没有形式参数为无参函数2005年3月8intmax(x,y)intx,y;{intz;z=xy?x:y;return(z);}intmax(x,y){intx,y;……}或intmax(intx,y){……}或intmax(x,y)intx,y,z;{z=xy?x:y;return(z);}花括号中也可以为空,这种函数叫空函数。不能在函数体内定义其他函数,即函数不能嵌套定义。形参也可以这样定义如下定义都是错误的√2005年3月9函数参数和函数的值voidswap(intx,inty){intz;z=x;x=y;y=z;printf(\nx=%d,y=%d,x,y);}main(){inta=10,b=20;swap(a,b);printf(\na=%d,b=%d\n,a,b);}程序输出结果:x=20,y=10a=10,b=20形式参数(形参)实际参数(实参)单向值传递1.形式参数和实际参数分别对应不同的存储单元,2.对于有参调用时,必须保证形参与实参的数目,对应的类型,顺序完全一致2005年3月10函数的返回值函数的返回值是通过return语句带回到主调函数的说明:①若函数没有返回值,return语句可以省略。②return语句中的表达式类型一般应和函数的类型一致,如果不一致,系统自动将表达式类型转换为函数类型。③函数没有返回值,要在函数定义时,用空类型void予以说明.④函数值的缺省类型是整型int⑤函数可以没有return语句,也可以有多个return语句.return语句格式:return(表达式);或return表达式;或return;2005年3月11函数的调用1.函数调用的一般形式:函数名();或函数名(实参列表);2.被调用函数的说明:(1)被调用函数必须是已经存在的;(2)如果被调用函数返回值是整型数(int)或字符型(char),或者被调用函数的定义出现在主调函数之前,可以省略函数声明。(3)对用户自定义的函数,而且该函数与调用它的主调函数在同一文件中,且在主调函数的后面,需要对函数进行声明。一种最简单的声明方法如下:直接照抄函数的首部,然后加分号,即构成一个声明语句。2005年3月12/*在程序的最前面声明*/floatf1(floatx,floaty);floatf2(float,float);floatf3(floata,floatb);floatf4(float,float);main(){floata=98.87,b=67.43;clrscr();printf(sum=%f\n,f1(a,b));}floatf1(floatx,floaty){return(f2(x,y)*f3(x,y));}floatf2(floats,floatr){returns+r;}floatf3(floatu,floatv){return(u-v)*f4(u,v);}floatf4(floatu,floatv){returnu/v;}/*在main函数的中声明*/main(){floatf1(floatx,floaty);floatf2(float,float);floatf3(floata,floatb);floatf4(float,float);floata=98.87,b=67.43;clrscr();printf(sum=%f\n,f1(a,b));}floatf1(floatx,floaty){return(f2(x,y)*f3(x,y));}floatf2(floats,floatr){returns+r;}floatf3(floatu,floatv){return(u-v)*f4(u,v);}floatf4(floatu,floatv){returnu/v;}/*在调用函数的前面声明*/main(){floatf1(floatx,floaty);floata=98.87,b=67.43;clrscr();printf(sum=%f\n,f1(a,b));}floatf2(float,float);floatf3(floata,floatb);floatf4(float,float);floatf1(floatx,floaty){return(f2(x,y)*f3(x,y));}floatf2(floats,floatr){returns+r;}floatf3(floatu,floatv){return(u-v)*f4(u,v);}floatf4(floatu,floatv){returnu/v;}系统对函数声明只检查参数个数和类型,不对参数名作检查,因此,函数声明时可以不写参数名,但建议大家写上2005年3月135.3.1局部变量和全局变量局部变量______在一个函数体内定义的变量,它只能在定义该变量的函数内部有用,或者在复合语句内定义的变量,它只能在定义该变量的复合语句中有效.全局变量______在函数外部定义的变量,其作用域是从定义它的位置起到源文件结束位置为止.inta=3,b=5;/*a,b称为外部变量,是因为它们定义在函数外部*/max(a,b)inta,b;/*a,b为局部变量*/{intc;c=ab?a:b;return(c);}main(){inta=8;/*a为局部变量,值是8;b是全局变量,值未改变*/printf(%d\n,max(a,b));}2005年3月14#includestring.h”intmax(x,y)/*定义max函数*/intx,y;{externcharstr1[];/*外部变量说明*/intz;if(xy)printf(%s\n,str1);z=xy?x:y;return(z);}charstr1[10];/*定义外部变量*/main(){externinta,b;/*外部变量说明*/printf(”str1=%s,max=%d\n,strcpy(str1,”xyz”),max(a,b));}inta=13,b=-8;/*外部变量定义*/2005年3月15说明(1)如果外部变量是在文件的开头定义,则在整个文件范围内都可以使用该变量;(2)如果在变量定义点之前的函数想引用该变量,则应该在该函数中用关键字extern来说明该外部变量;(3)如果在同一源文件中,外部变量与函数或复合语句中的局部变量同名,则在局部变量的作用域范围内,外部变量不起作用.2005年3月165.1.3变量的存储类别及变量的生存期变量的生存期:变量在内存中占据存储空间的时间。全局变量局部变量静态存储变量:固定分配存储空间动态存储变量:动态分配存储空间变量的作用域(有效范围)变量的分类变量值的存在时间(生存期)程序区静态存储区动态存储区存放全局变量,或静态局部变量函数形参变量局部变量(即自动变量,未加static说明)函数调用时的现场保护2005年3月17变量的属性数据类型:决定为变量分配内存单元的长度,数据的存放形式,数的范围。存储类别:决定了变量的生存期,给它分配在哪个存储区。2005年3月18变量定义语句的一般形式存储类别数据类型变量名1,…,变量名n;auto(自动的)register(寄存器的)static(静态的)extern(外部的)1.自动变量(auto类别)局部变量可以定义为自动变量。main(){intx,y;…}main(){autointx,y;…}自动变量等价可省2005年3月19⑴内存分配调用函数或执行分程序时在动态存储区为其分配存储单元,函数或分程序执行结束,所占内存空间即刻释放。⑵变量的初值定义变量时若没赋初值,变量的初值不确定;如果赋初值则每次函数被调用时执行一次赋值操作。⑶生存期在函数或分程序执行期间。⑷作用域自动变量所在的函数内或分程序内。自动变量2005年3月202.静态变量(static类别)除形参外,局部变量和全局变量都可以定义为静态变量。局部静态变量(或称内部静态变量)全局静态变量(或称外部静态变量)静态变量静态变量staticinta;main(){floatx,y;…}f(){staticintb=1;……}全局静态变量局部静态变量自动变量不能省2005年3月21⑴内存分配编译时,将其分配在内存的静态存储区中,程序运行结束释放该单元。⑵静态变量的初值若定义时未赋初值,在编译时,系统自动赋初值为0;若定义时赋初值,则仅在编译时赋初值一次,程序运行后不再给变量赋初值。⑶生存期整个程序的执行期间。⑷作用域局部静态变量的作用域是它所在的函数或分程序。全局静态变量的作用域是从定义处开始到本源文件结束。静态变量2005年3月22f(inta){autointb=0;/*在该函数被调用时才对b进行初始化*/staticintc=3;/*在编译时c被初始化为3,不初始化时,缺省*/b=b+1;/*值为0*/c=c+1;/*c是静态变量,该函数结束时,不释放它占用的存储区*/return(a+b+c);}main(){inta=2,i;for(i=0;i3;i++)printf(%d,f(a));printf(\n);}/*结果为7,8,9*/举例2005年3月23[例]intfac(intn){staticintf=1;/*每次被调用时,引用局部静态变量上次的值*/f=f*n;return(f);}main(){inti;for(i=1;i=5;i++)printf(%d!=%d\n,i,fac(i));}输出的结果为:1!=12!=23!=64!=245!=1202005年3月24⑴内存分配编译时,将其分配在静态存储区,程序运行结束释放该单元。⑵变量的初值若定义变量时未赋初值,在编译时,系统自动赋初值为0。⑶生存期整个程序的执行期间。⑷作用域从定义处开始到本源文件结束。此外,还可以用extern进
本文标题:C程序设计-第五章函数
链接地址:https://www.777doc.com/doc-3354804 .html