(1.2)--第7章 C语言程序设计函数.ppt
《(1.2)--第7章 C语言程序设计函数.ppt》由会员分享,可在线阅读,更多相关《(1.2)--第7章 C语言程序设计函数.ppt(86页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7章章 函数函数7.1引例引例7.2函数概述函数概述7.3函数定义函数定义7.4函数调用函数调用7.5递归函数递归函数21:3917.6数组作函数的参数数组作函数的参数7.7局部变量与全局变量局部变量与全局变量7.8变量生命期与存储类型变量生命期与存储类型7.9内部函数与外部函数内部函数与外部函数7.10函数程序设计示例函数程序设计示例21:3927.1引例引例【例例7.1】有有5个整数,输出其中的最大值。个整数,输出其中的最大值。#includeintmain()inta,b,c,d,e,maxa=10;b=12;c=9;d=13;e=5;max=a;/*a的值作为最大值的值作为最大值*
2、/if(bmax)max=b;if(cmax)max=c;if(dmax)max=d;if(emax)max=e;printf(max=%d,max);/*输出最大值输出最大值*/return0;21:393【例例7.2】使用函数的方法完成例使用函数的方法完成例7.1#includeintmain()inta,b,c,d,e,m;intmax(intx,inty);/*函数声明函数声明*/a=10;b=12;c=9;d=13;e=5;/*为变量赋初值为变量赋初值*/m=max(a,max(b,max(c,max(d,e);printf(max=%d,m);/*输出最大值输出最大值*/retur
3、n0;intmax(intx,inty)/*函数首部函数首部,x和和y为形参为形参*/intz;/*定义中间变量定义中间变量z*/if(xy)z=x;elsez=y;returnz;/*返回变量中的最大值返回变量中的最大值z*/21:3947.2 函数概述函数概述 n 所有所有C语言程序都是由一个或多个函数构成的。当语言程序都是由一个或多个函数构成的。当一个一个C语言程序的规模很小时,可以用一个源文件语言程序的规模很小时,可以用一个源文件来实现。当一个来实现。当一个C语言程序的规模较大时,可以由语言程序的规模较大时,可以由多个源文件组成,但其中只有一个源文件含有主函多个源文件组成,但其中只有一
4、个源文件含有主函数数main(),而其他源文件不能含有主函数。,而其他源文件不能含有主函数。n 程序由多个函数构成时,只能由主函数调用其他程序由多个函数构成时,只能由主函数调用其他函数,反之则不行。其他函数之间可以互相调用,函数,反之则不行。其他函数之间可以互相调用,同一个函数可以被一个或多个函数调用任意多次。同一个函数可以被一个或多个函数调用任意多次。一个函数调用另一个函数,前者称为一个函数调用另一个函数,前者称为调用函数调用函数;后;后者称为者称为被调函数被调函数。21:395 从用户使用的角度来看从用户使用的角度来看:(1)标准函数标准函数(2)用户自定义函数用户自定义函数从函数的形式上
5、看从函数的形式上看(1)无参函数无参函数(2)有参函数有参函数从函数的作用范围来看从函数的作用范围来看(1)外部函数外部函数(2)内部函数内部函数21:3967.3 函数的定义函数的定义 n C语言的库函数是由编译系统事先定义好的,语言的库函数是由编译系统事先定义好的,用户在使用时无须自己定义,只需用用户在使用时无须自己定义,只需用#include命令将有关的头文件包含到文件中即可。命令将有关的头文件包含到文件中即可。n所有的用户自定义函数均要所有的用户自定义函数均要“先定义,后使用先定义,后使用”。定义的目的是通知编译系统函数返回值的。定义的目的是通知编译系统函数返回值的类型、函数的名字、函
6、数的参数个数与类型以类型、函数的名字、函数的参数个数与类型以及函数实现什么功能等。及函数实现什么功能等。21:3977.3.1 无参函数的定义无参函数的定义 无参函数的定义形式如下:无参函数的定义形式如下:类型名类型名 函数名函数名()/*函数首部函数首部*/函数体函数体或或类型名类型名 函数名函数名(void)/*函数首部函数首部*/函数体函数体 21:398【例例7.3】定义一个无参且无返回值的函数定义一个无参且无返回值的函数prtstar()。#includevoidprtstar(void)/*函数首部,无形参与返回值函数首部,无形参与返回值*/printf(*n);intmain()
7、prtstar();/*调用函数调用函数*/printf(WelcometoClanguageworld!n);prtstar();/*调用函数调用函数*/return0;运行结果:运行结果:*WelcometoClanguageworld!*21:3997.3.2 有参函数的定义有参函数的定义 有参函数的定义形式如下:有参函数的定义形式如下:类型名类型名 函数名函数名(形式参数表列形式参数表列)/*/*函数首部函数首部*/函数体函数体 说明:说明:(1)有参函数比无参函数多了一项内容,即)有参函数比无参函数多了一项内容,即形式形式参数表列参数表列。在其中给出的参数称为形式参数(简称。在其中给
8、出的参数称为形式参数(简称形参),格式为:形参),格式为:类型类型1形参形参1,类型,类型2形参形参2,类型,类型n形参形参nn每个形参前面的类型必须分别写明每个形参前面的类型必须分别写明。21:3910 n【例例】以下函数定义中以下函数定义中正确正确的是的是。nAdouble fun(double x,y)nBdouble fun(double x;double y)nCdouble fun(double x,double y);nDdouble fun(double x,double y)21:3911(2)函数体)函数体由由一对大括号内的若干条语句一对大括号内的若干条语句组组成成,这些语
9、句实现了函数的功能,并用,这些语句实现了函数的功能,并用return语句返回运算的结果。语句返回运算的结果。return语句逻辑上是函语句逻辑上是函数的最后一条语句。它的一般形式是:数的最后一条语句。它的一般形式是:return表达式表达式;表达式的类型(函数返回值)应与函数名的类表达式的类型(函数返回值)应与函数名的类型一致。型一致。一条一条return语句只能返回一个值。语句只能返回一个值。21:3912(3)编译系统不检查函数名与形参变量)编译系统不检查函数名与形参变量名是否相同,例如下面的函数定义是正名是否相同,例如下面的函数定义是正确的。确的。intf(intf)(4)函数头部省略类
10、型名时,默认函数)函数头部省略类型名时,默认函数的返回值的类型为的返回值的类型为int。21:3913 n【例【例7.4】输入一个实数】输入一个实数x,计算并输出下式的,计算并输出下式的值,直到最后一项的绝对值小于值,直到最后一项的绝对值小于10-5(保留两(保留两位小数)。要求定义和调用函数位小数)。要求定义和调用函数fact(n),计算,计算n的阶乘,可以调用的阶乘,可以调用pow()函数求幂。函数求幂。#include#includedoublefact(intn);/*函数声明函数声明*/intmain()inti=1;doublex,item,s=0;printf(输入输入x的值的值
11、:)scanf(%lf,&x);item=x;while(fabs(item)=0.00001)s=s+item;i+;item=pow(x,i)/fact(i);printf(和是:和是:%lfn,s);return0;21:3914doublefact(intn)inti;doublejc=1;for(i=1;i=n;i+)jc=jc*i;returnjc;输入输入x的值:的值:2和是:和是:6.38904621:39157.3.3 空函数的定义空函数的定义 空函数的定义形式如下:空函数的定义形式如下:类型名类型名 函数名函数名()()例如:例如:intfun()说明:说明:n函数体是空的
12、,调用此函数函数体是空的,调用此函数时,什么工作也不做。时,什么工作也不做。n在调用程序中写上在调用程序中写上fun(),表明这里要调用一个表明这里要调用一个fun函函数,而这个函数还没有完成,数,而这个函数还没有完成,等待以后完善。等待以后完善。21:39167.4 函数的调用函数的调用 n 定义函数的目的就是为了重复使用,定义函数的目的就是为了重复使用,因此只有在程序中调用函数时才能实现函数因此只有在程序中调用函数时才能实现函数的功能。的功能。C语言程序从语言程序从main函数开始执行,函数开始执行,而自定义函数的执行是通过对自定义函数的而自定义函数的执行是通过对自定义函数的调用来执行的。
13、调用来执行的。当自定义函数结束时,从自当自定义函数结束时,从自定义函数结束的位置返回到主函数中继续执定义函数结束的位置返回到主函数中继续执行,直到主函数结束。行,直到主函数结束。21:39177.4.1 函数调用的形式和过程函数调用的形式和过程 1 1函数调用的一般形式函数调用的一般形式函数名函数名(实际参数列表实际参数列表);实际参数列表中的参数称为实际参数,简称实参,实际参数列表中的参数称为实际参数,简称实参,可以是常数、变量和表达式。可以是常数、变量和表达式。2 2函数调用的方式函数调用的方式(1)函数语句)函数语句函数名函数名(实参列表实参列表);(2)函数表达式)函数表达式函数作为表
14、达式中的一部分出现在表达式中,例如:函数作为表达式中的一部分出现在表达式中,例如:a=abs(x);21:3918(3)(3)函数嵌套调用函数嵌套调用C语言的函数定义是互相平行、独立的,也就语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能再定义另一是说,在定义函数时,一个函数内不能再定义另一个函数,也就是不能嵌套定义,但可以嵌套调用函个函数,也就是不能嵌套定义,但可以嵌套调用函数。数。例如:例如:putchar(getchar();21:3919函数嵌套调用图示:函数嵌套调用图示:21:3920【例例】设某自定义函数已有返回值,则以下设某自定义函数已有返回值,则以下关于
15、该函数调用的叙述中错误的是关于该函数调用的叙述中错误的是_。A函数调用可以作为独立的语句存在函数调用可以作为独立的语句存在B函数调用可以作为一个函数的实参函数调用可以作为一个函数的实参C函数调用可以出现在表达式中函数调用可以出现在表达式中D函数调用可以作为一个函数的形参函数调用可以作为一个函数的形参21:3921 3 3函数调用的过程函数调用的过程被调函数的所有形参分配内存,再计算实参的被调函数的所有形参分配内存,再计算实参的值,并一一对应地赋予相应的形参。值,并一一对应地赋予相应的形参。为函数说明部分中定义的变量分配存储空间,为函数说明部分中定义的变量分配存储空间,再依次执行函数的可执行语句
16、。当执行到再依次执行函数的可执行语句。当执行到“return(表达式表达式);”语句时,计算返回值。语句时,计算返回值。释放在本函数中定义的变量所占用的存储空间释放在本函数中定义的变量所占用的存储空间(对于(对于static类型的变量,其空间不会释放),返类型的变量,其空间不会释放),返回主调函数继续执行。回主调函数继续执行。21:3922【例例7.5】求两个正整数求两个正整数m和和n的最大公约数的最大公约数#includeintmain()inta,b,cintgcd(intm,intn);printf(请输入两个整数:请输入两个整数:);scanf(%d%d,&a,&b);c=gcd(a,
17、b);/*调用调用gcd()函数,返回值赋值给函数,返回值赋值给c*/printf(整数整数%d和和%d的最大公约数是:的最大公约数是:%dn,a,b,c);21:3923 intgcd(intm,intn)/*函数首部函数首部,m和和n为形参为形参*/intr;/*定义中间变量定义中间变量r*/r=m%n;/*计算计算m除以除以n的余数的余数*/while(r!=0)m=n;n=r;r=m%n;returnn;/*返回最大公约数返回最大公约数n*/运行结果:运行结果:请输入两个整数:请输入两个整数:3972整数整数39和和72的最大公约数是:的最大公约数是:321:39247.4.2 参数传
18、递参数传递 n调用函数向被调用函数传递数据主要是通过函数的调用函数向被调用函数传递数据主要是通过函数的参数进行的,而被调用函数向调用函数传递数据一参数进行的,而被调用函数向调用函数传递数据一般是通过般是通过return语句实现的。语句实现的。n形参形参是函数定义时函数名后括号中的变量;是函数定义时函数名后括号中的变量;实参实参是是指调用函数时函数名后括号中的常量、变量或表达指调用函数时函数名后括号中的常量、变量或表达式。在调用函数时,式。在调用函数时,将实参的值传递给形参,使形将实参的值传递给形参,使形参在数值上和实参相同参在数值上和实参相同。nC语言提供了两种参数传递数据方式:语言提供了两种
19、参数传递数据方式:按值传递按值传递和和按地址传递按地址传递。21:3925(1)按值传递)按值传递函数调用时,调用函数把实参的值传递给函数调用时,调用函数把实参的值传递给被调用函数的形参,被调用函数的形参,形参值的变化不会影响实形参值的变化不会影响实参的值参的值。这是一种单向的数据传送方式。这是一种单向的数据传送方式。当实参是常量、变量、表达式或数组元素,当实参是常量、变量、表达式或数组元素,形参是变量名时,函数传递数据采用的是按值形参是变量名时,函数传递数据采用的是按值传递。传递。21:3926【例例7.6】阅读下列程序阅读下列程序#includevoidswap(intx,inty)/*函
20、数首部函数首部,x和和y为形参为形参*/intt;/*定义中间变量定义中间变量t*/t=x;/*交换形参交换形参x和和y的值的值*/x=y;y=t;printf(x=%d,y=%dn,x,y);/*输出交换后的形参输出交换后的形参*/intmain()inta,b;scanf(%d,%d,&a,&b);swap(a,b);printf(a=%d,b=%dn,a,b);return0;运行结果:运行结果:12,28 X=28,y=12A=12,b=2821:3927 注意:注意:实参的个数应与形参一致,否则将会出现编译实参的个数应与形参一致,否则将会出现编译错误。错误。定义函数时,系统并不给形参
21、分配存储单元,定义函数时,系统并不给形参分配存储单元,只有函数被调用时系统才给形参分配存储单元。只有函数被调用时系统才给形参分配存储单元。在调用结束后,形参所占用的存储单元被释放。在调用结束后,形参所占用的存储单元被释放。实参与形参即使同名,也会分配不同的分配存实参与形参即使同名,也会分配不同的分配存储单元。储单元。C语言规定语言规定,函数间的参数传递是函数间的参数传递是“值传递值传递”,即单向传递,实参可以把值传给形参,但形参的即单向传递,实参可以把值传给形参,但形参的值不能传给实参,也就是说值不能传给实参,也就是说对形参的修改不会影对形参的修改不会影响对应的实参响对应的实参。这是由于在内存
22、中,实参与形参。这是由于在内存中,实参与形参是不同的存储单元,函数执行结束后,形参的存是不同的存储单元,函数执行结束后,形参的存储单元被释放。储单元被释放。21:3928【例例】若函数调用时的实参为变量,则以下若函数调用时的实参为变量,则以下关于函数形参和实参的叙述中正确的是关于函数形参和实参的叙述中正确的是。A实参和其对应的形参占用同一存储单元实参和其对应的形参占用同一存储单元B形参不占用存储单元形参不占用存储单元C形参和实参占用不同的存储单元形参和实参占用不同的存储单元D同名的实参和形参占用同一存储单元同名的实参和形参占用同一存储单元21:3929 (2)按地址传递)按地址传递当函数的形参
23、为数组(当函数的形参为数组(见见7.6.2【】【】)或)或指针(指针(见见8.3)类型时,)类型时,函数调用的参数传递称函数调用的参数传递称为按地址传递为按地址传递。由于传递的是地址,使形参与实参共享同由于传递的是地址,使形参与实参共享同一存储单元,这样通过形参可以直接引用或处一存储单元,这样通过形参可以直接引用或处理该地址中的数据,达到改变实参值的目的。理该地址中的数据,达到改变实参值的目的。21:39307.4.3 函数的返回值函数的返回值(1)函数的值只能通过)函数的值只能通过return语句返回给调用函数。语句返回给调用函数。return语句的一般形式为:语句的一般形式为:return
24、 表达式表达式;return (表达式表达式);(2)如果不需要从被调用函数返回函数值,可以省略)如果不需要从被调用函数返回函数值,可以省略return语句。省略时,返回的值不确定。语句。省略时,返回的值不确定。(3)return语句中表达式值的类型应与函数定义中函数语句中表达式值的类型应与函数定义中函数的类型保持一致。的类型保持一致。(4)对不需要返回函数值的函数,可以将其函数类型定)对不需要返回函数值的函数,可以将其函数类型定义为义为“void”(即(即“空类型空类型”)。)。21:3931【例例】关于函数返回值,以下叙述中正确的是关于函数返回值,以下叙述中正确的是。A函数返回值的类型由函
25、数体内函数返回值的类型由函数体内return语句包语句包含的表达式的类型决定含的表达式的类型决定B函数返回值的类型由函数头部定义的函数类函数返回值的类型由函数头部定义的函数类型决定型决定C若函数体中有多个若函数体中有多个return语句,则函数的返语句,则函数的返回值是排列在最后面的回值是排列在最后面的return语句中表达式的值语句中表达式的值D若函数体内没有若函数体内没有return语句,则函数没有返语句,则函数没有返回值回值21:39327.4.4 函数声明函数声明 同变量一样,函数的调用也遵循同变量一样,函数的调用也遵循“先声明,先声明,后使用后使用”的原则。的原则。函数声明的格式为:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1.2-第7章 C语言程序设计函数 1.2 语言程序设计 函数
限制150内