c语言程序设计第6章函数.ppt
《c语言程序设计第6章函数.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计第6章函数.ppt(91页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 函函 数数结构化程序设计基础结构化程序设计基础6.1函数的概念 结构化程序设计要求一种自顶向下的设计方法,也就是将复杂结构化程序设计要求一种自顶向下的设计方法,也就是将复杂的系统划分为相对独立的,功能较为单一的子系统的组合。的系统划分为相对独立的,功能较为单一的子系统的组合。每个子系统称为模块,在每个子系统称为模块,在C语言中表现为函数。语言中表现为函数。复杂问题main()abca1a2b1b2c1c2各模块之间的关系称之为接口。各模块之间的关系称之为接口。优点:优点:函数实现的功能单一函数实现的功能单一完整,可以独立设计,单完整,可以独立设计,单独调试。易于维护,通用独调试。
2、易于维护,通用性强。性强。【例【例6-1】通过函数求两个数的最大值。】通过函数求两个数的最大值。/*example6-1通过函数求最大值通过函数求最大值*/#includeintGetMax(int,int);/*函数的原型声明函数的原型声明*/voidmain(void)inta,b,c,d;/*说明变量说明变量*/scanf(%d,%d,%d,&a,&b,&c);d=GetMax(a,b);/*调用函数调用函数GetMax求求a、b的较大值赋给的较大值赋给d*/d=GetMax(d,c);/*调用函数调用函数GetMax求求d、c的较大值赋给的较大值赋给d*/printf(TheMaxim
3、umofa,b,cis%dn,d);intGetMax(intx,inty)intmax;if(xy)max=x;/*xy成立,成立,x为较大值为较大值*/elsemax=y;/*xy不成立,不成立,y为较大值为较大值*/returnmax;函数的分类及调用过程函数的分类及调用过程 函数可分为标准库函数和用户自定义函数。标准库函数是C语言系统提供的一系列的实现特定功能的模块,如已经学习过的输入输出函数、数学函数、字符串处理函数等等。对于用户自定义函数,用户必须完整地定义函数的接口以及函数的实现细节,然后通过数据接口调用函数以实现所需的功能 用户自定函数的使用,应包括两个过程:函数的定义:函数定
4、义的作用就是确定函数的名称、接口、以及内部的实现细节。函数的调用:函数的调用是根据数据接口的定义,将实际数据传递给函数,函数执行其功能得到所需结果的过程。【例例6-2】通通过过标标准准函函数数及及用用户户定定义义函函数数实实现现求求字字符符串串中中含含有有的的实际字符的数量,输出结果。实际字符的数量,输出结果。/*example6-2通过函数输出字符串的实际长度通过函数输出字符串的实际长度*/#include#includeintGetStringLength(char*p);/*用户函数原型声明用户函数原型声明*/voidmain(void)charpszStr80;intiStrLen;g
5、ets(pszStr);/*调用字符输入函数输入字符串调用字符输入函数输入字符串*/iStrLen=strlen(pszStr);/*调用标准库函数求字符串长度调用标准库函数求字符串长度*/printf(Thestringlengthis%dn,iStrLen);gets(pszStr);iStrLen=GetStringLength(pszStr);/*调用用户定义函数求字符调用用户定义函数求字符串长度串长度*/printf(Thestringlengthis%dn,iStrLen);/*用户定义求字符串长度函数用户定义求字符串长度函数*/*函数名函数名GetStringLength*/*参
6、数参数指向字符的指针指向字符的指针p*/*返回值字符个数,整型返回值字符个数,整型*/intGetStringLength(char*p)intiCount;iCount=0;while(*p!=0)iCount+;p+;returniCount;6.2函数函数的定义和调用的定义和调用函数的基本结构函数的基本结构#includevoidmain(void)inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“%d”c);intmax(intx,inty)intz;z=x=y?x:y;return(z);主主函函数数函函数数体体函数的类型,返回值的类型
7、。函数的类型,返回值的类型。函数名(用标识符命名),函数名(用标识符命名),引用函数的标志,并得到结果。引用函数的标志,并得到结果。函数参数说明表。函数参数说明表。定义!定义!引用!引用!(1)函数的名称(2)函数的类型(3)函数的形式参数(4)函数体函数定义的目的函数定义是要确定如下四点:函数定义是要确定如下四点:名称名称函数的类型函数的类型函数的参数函数的参数函数的功能函数的功能函数的定义函数的定义格式:格式:type函数名函数名(参数说明表参数说明表)内部说明语句内部说明语句;功能语句功能语句;如果函数有返回值,应含如果函数有返回值,应含有有return语句。语句。intmax(intx
8、,inty)intz;z=x=y?x:y;return(z);说明:说明:函数不能嵌套定义,但可以嵌套引用,包括引用自己。函数不能嵌套定义,但可以嵌套引用,包括引用自己。intmax(intx,inty)intcx(intc,intd)/*Error!*/函数如果无返回值,函数如果无返回值,type应说明为空类型应说明为空类型void。函数无参。函数无参数应定义成数应定义成void。void Bell(void)printf(“007”);函数的调用函数的调用调用形式:调用形式:函数名函数名(实参表实参表)一般引用方式有三种:一般引用方式有三种:v语语句句形形式:式:max(a,b);v表达式
9、形式:表达式形式:c=max(a,b)*2;v函函数数参参数:数:c=max(a,max(b,d);【例例6-3】函函数数调调用用举举例例,通通过过函函数数求求xn,在在主主函函数数中中输输入入x及及n,并调用该函数,输出结果。,并调用该函数,输出结果。/*example6-3函数调用举例函数调用举例*/#includefloatGetPow(float,int);/*函数原型声明函数原型声明*/voidmain(void)floatx,y;intn;printf(Pleaseinputx,n:);scanf(%f,%d,&x,&n);/*输入输入x,n*/y=GetPow(x,n);/*给出
10、实参列表给出实参列表,调用函数调用函数*/printf(“xn=%fn”,y);/*将函数的返回值赋给将函数的返回值赋给y*/floatGetPow(floatx,intn)/*函数定义函数定义,名称:名称:GetPow*/floatz;inti;z=1;for(i=1;iy?x:y;return(z);先计算实参的值,从右向左向函数传递调赋值给形参。先计算实参的值,从右向左向函数传递调赋值给形参。23abXy23转移在函数中运行,执行到一个转移在函数中运行,执行到一个return语句,将返回表达式语句,将返回表达式的值。由函数名带回给调用函数。的值。由函数名带回给调用函数。z3函数如果没有函
11、数如果没有return语句,由最后一个语句,由最后一个返回一个不确定的值!返回一个不确定的值!【例例6-4】定定义义返返回回两两个个浮浮点点数数之之和和的的函函数数,在在主主函函数数中中输输入入数数据,并调用函数,输出结果。据,并调用函数,输出结果。/*example6-4通过函数求两个浮点数之和通过函数求两个浮点数之和*/#includefloatfAdd(float,float);/*函数原型声明函数原型声明*/voidmain(void)floata,b,c;printf(Pleaesinputtwonumbera,b:);scanf(%f,%f,&a,&b);c=fAdd(a,b);/
12、*调用函数调用函数*/printf(a+b=%fn,c);/*-*/*函数名函数名fAdd*/*参数:参数:x,y,float型型*/*返回值:返回值:x+y*/*-*/floatfAdd(floatx,floaty)floatz;z=x+y;returnz;关于返回值的几点说明:关于返回值的几点说明:函数可以通过一个函数可以通过一个return语句返回一个值,也可以不返回值,语句返回一个值,也可以不返回值,此时应在定义函数时用此时应在定义函数时用void类型加以说明。类型加以说明。函数中可以出现多个函数中可以出现多个return语句,遇到一个语句,遇到一个return语句,则语句,则返回值,
13、且返回调用函数,继续执行。返回值,且返回调用函数,继续执行。intmax(intx,inty)if(x=y)returnx;returny;返回值的类型应与函数的类型一致,如不一致,以函数类型返回值的类型应与函数的类型一致,如不一致,以函数类型为准,为准,先转换为函数类型后,先转换为函数类型后,再返回。再返回。intmax(void)floatz;returnz;/*z先转化为整型先转化为整型*/为了确保参数和返回值类型正确,一般须在函数调用前对其为了确保参数和返回值类型正确,一般须在函数调用前对其类型和参数的类型加以说明,该说明称之为类型和参数的类型加以说明,该说明称之为原型声明原型声明。i
14、ntimax(int,int);voidmain(void)intx,y,z;z=imax(x,y);原型声明语句,加;原型声明语句,加;举例:通过函数求举例:通过函数求xn。#includedoublepow(float,int);voidmain(void)inti;for(i=1;i=9;i+)printf(“%d,%fn”,i,pow(2.5,i);doublepow(floatx,intn)inti;doublep=1;for(i=1;i=n;i+)p=p*x;return(p);原型声明。原型声明。定定义义函函数数调用函数。调用函数。专题:函数间的数据传递专题:函数间的数据传递函数
15、在调用的过程中,调用函数和被调函数存在数据的相互传函数在调用的过程中,调用函数和被调函数存在数据的相互传递。数据的传递包括两个方面:递。数据的传递包括两个方面:将值传递给被调函数;将值传递给被调函数;将被调函数的结果返回给调用函数。将被调函数的结果返回给调用函数。调用函数调用函数被调函数被调函数向被调函数传递值。向被调函数传递值。将结果返回给调用函数。将结果返回给调用函数。函数间数据传递方式函数间数据传递方式通过函数参数传值或传地址;通过函数参数传值或传地址;通过返回值传递结果通过返回值传递结果;通过通过全局变量全局变量传递参数或结果。传递参数或结果。传值方式传值方式 通过实参与形参的结合,将
16、通过实参与形参的结合,将数据值传递给形参数据值传递给形参,形参的改变不,形参的改变不影响实参。影响实参。#includeintsplus(int,int);voidmain(void)inta,b,c;scanf(“%d,%d”,&a,&b);c=splus(a,b);printf(“a*b=%dn”,c);intsplus(intx,inty)intz;z=x*y;return(z);调调用用函函数数被被调调函函数数x、y形参。形参。a、b实参变量的值。实参变量的值。传递参数传递参数a:2b:3y:x:32z:6返回值返回值【例【例6-5】参数值传递方式说明举例。】参数值传递方式说明举例。/
17、*example6-5函数参数值传递实例函数参数值传递实例*/#includevoidExamFun(int,int);/*函数原型声明函数原型声明*/voidmain(void)inta,b;printf(请输入两个整数请输入两个整数a,b:);scanf(%d,%d,&a,&b);ExamFun(a,b);/*以实参以实参a、b值传递方式调用函数值传递方式调用函数*/printf(函数调用后函数调用后a的值的值%d,b的值的值%dn,a,b);voidExamFun(intx,inty)/*函数定义函数定义*/intt;t=x;x=y;y=t;/*形参变量形参变量x,y交换交换*/prin
18、tf(x的值的值%d,y的值的值%dn,x,y);传地址方式传地址方式形参定义为指针,实参为变量的地址,被调函数通过地址可以形参定义为指针,实参为变量的地址,被调函数通过地址可以修改地址对应的变量。修改地址对应的变量。#includevoidswap(int*,int*);voidmain(void)inta,b;scanf(“%d,%d”,&a,&b);if(ab)swap(&a,&b);printf(“n%d,%dn”,a,b);voidswap(int*x,int*y)intt;t=*x;*x=*y;*y=t;用用函函数数实实现现两两个个变变量量a、b值值的的交交换换46ab2000H2
19、400Hxy2400H2000H参数变量是否可以实现交换?参数变量是否可以实现交换?【例【例6-6】采用传递地址方式,通过函数实现变量值的交换。】采用传递地址方式,通过函数实现变量值的交换。/*example6-6,函数参数采用地址传递方式函数参数采用地址传递方式*/*通过函数实现调用函数变量的交换通过函数实现调用函数变量的交换*/#includevoidExchange(int*,int*);/*函数原型声明,参数为指向整型的指针函数原型声明,参数为指向整型的指针*/voidmain(void)inta,b;printf(请输入请输入a,b:);scanf(%d,%d,&a,&b);if(a
20、b)/*如果如果ab调用函数实现调用函数实现a、b的交换的交换*/Exchange(&a,&b);/*调用函数,实参为变量调用函数,实参为变量a,b的地址的地址*/printf(a=%dnb=%dn,a,b);voidExchange(int*x,int*y)/*函数定义函数定义*/intt;t=*x;*x=*y;*y=t;/*通过间接运算,实现形参通过间接运算,实现形参x、y指向对象的交换指向对象的交换*/函数的原型声明如果被调函数是以下三种情况,必须声明。如果被调函数是以下三种情况,必须声明。(1 1)被调函数定义在调用函数之后;)被调函数定义在调用函数之后;(2 2)被调函数是标准库函数
21、;)被调函数是标准库函数;(3 3)被调函数从其他文件连接加入。)被调函数从其他文件连接加入。函数的原型声明语句可以取两种形式:函数的原型声明语句可以取两种形式:只有参数类型而不带参数名的形式只有参数类型而不带参数名的形式 带有参数名的形式带有参数名的形式函数的原型声明的说明 函数原型声明最好写在主函数之外的程序开始处,如果函数原型声明最好写在主函数之外的程序开始处,如果程序较大,并有自己的头文件时,函数原型声明应统一写在程序较大,并有自己的头文件时,函数原型声明应统一写在头文件中头文件中 。原则上整型函数、定义在调用语句函数之前的函数可不原则上整型函数、定义在调用语句函数之前的函数可不加原型
22、声明,加原型声明,标标准准库库函函数数的的原原型型声声明明都都包包含含于于函函数数对对应应的的头头文文件件中中,因因此此,使使用用标标准准库库函函数数时时,应应在在程程序序的的开开始始包包含含对对应应的的头头文件文件 。6.3变量的作用域与生存期变量的作用域与生存期变量是内存数据的抽象,即将内存地址、数据表示变量是内存数据的抽象,即将内存地址、数据表示抽象成一个抽象成一个符号。符号。此外,变量还有此外,变量还有存储类型存储类型,存储类型确定了变量在,存储类型确定了变量在时间上的时间上的生存期和空间上的作用域。生存期和空间上的作用域。按空间的作用域可分为:按空间的作用域可分为:全局变量全局变量局
23、部变量局部变量按时间的生存期可分为:按时间的生存期可分为:静态存储变量静态存储变量动态存储变量动态存储变量变量的四种存储类型变量的四种存储类型自动类型自动类型auto寄存器类型寄存器类型register静态类型静态类型static外部类型外部类型extern变量的说明格式:变量的说明格式:存储类型存储类型 类型类型 变量名表;变量名表;确定变量在内存中的表示方法。确定变量在内存中的表示方法。确定变量的生存期和作用域。确定变量的生存期和作用域。该项省略表示该项省略表示auto存储类型。存储类型。auto存储类型存储类型(局部变量局部变量)定义在复合语句的开始处。块内生存、块内有效。定义在复合语句
24、的开始处。块内生存、块内有效。#includevoidmain(void)autointa,b;scanf(“%d,%d”,&a,&b);if(ba)intiTemp;iTemp=a;a=b;b=iTemp;printf(“Max=%d”,a);ab的的作作用用域域iTemp的作用域。的作用域。生存期:生存期:执行到复合语句建立内存执行到复合语句建立内存变量。执行出复合语句变量消变量。执行出复合语句变量消亡。亡。iTempregister存储类型存储类型(局部变量局部变量)作用域和生存期和作用域和生存期和auto相同,相同,差别在于,如果差别在于,如果CPU内部的寄存内部的寄存器空闲,器空闲,
25、则使用寄存器作为变量则使用寄存器作为变量的存储单元,以提高速度。主要的存储单元,以提高速度。主要用于循环变量,且应该是整型和用于循环变量,且应该是整型和字符型。字符型。【例【例6-7】通过函数求两个数的较小值。】通过函数求两个数的较小值。/*example6-7通过函数求两个数的较小值通过函数求两个数的较小值*/#includeintiGetMin(int,int);/*函数原型声明函数原型声明*/voidmain(void)inta,b,c;printf(Pleaseinputtwonumbera,b:);scanf(%d,%d,&a,&b);c=iGetMin(a,b);/*调用调用iGe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 函数
限制150内