c语言程序设计第8章.ppt
《c语言程序设计第8章.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计第8章.ppt(91页珍藏版)》请在三一办公上搜索。
1、,1.我的程序有上百行,如何调试最方便?2.我想设计一个程序完成下面的计算:其中m,n为正整数,且mn 该如何设计程序最有效,第8章函数,本章学习要点:掌握函数的定义方法;掌握函数的类型和返回值;掌握形式参数与实际参数、参数传递;掌握函数的正确调用,了解函数的递归调用;掌握局部变量和全局变量、变量的存储类型,作用域和 生存期;,8.1 概述函数:英文名为Function,直译为“功能”,“函数”的意思.在C语言里,函数指的是实现一个特定功能的程序模块.它相当于其他语言中的子程序.1.一个C语言程序可分为若干个函数 2.每个程序有且只能有一个主函数(main),其它函数都都是子函数。3.每个C程
2、序由主函数调用子函数,子函数也可以相互调用.在程序设计中,常将一些常用的功能模块编写成函数,放在函数库中供公共选用.,main,函数a,函数e,函数f,函数g,.,.,.,函数b,函数h,函数I,函数J,.,.,.,函数c,函数K,函数L,函数M,.,.,.,函数a,函数M,函数e,说明:1)源程序文件可由一个或多个函数组成,其中主函数是不可缺省的.源程序文件是编译单位,函数不是编译单位;2)一个C程序由一个或多个源程序文件组成.较大的C程序,常将一些函数和其他内容分别放在若干源文件中,再由若干源文件组成一个C程序.最简单的情况,一个C程序由一个源程序组成,这个源程序中只包含了一个函数-主函数
3、;3)C程序的执行从main函数开始,调用其他函数后仍回到main函数,程序在main函数结束时结束 4)所有子函数都是平行的,任何子函数都不属于其它函数 5)所有函数在定义时是相互独立的,函数之间可以相互引用但不能嵌套定义;,例:8-1#includevoid printstar()printf(“*n”);void print_message()printf(“How do you do!n”);void main()printstar();print_message();printstar();,说明1)每个程序有且只能有一个主函数(main),其它函数都是子函数。2)C程序的执行从ma
4、in函数开始,调用其他函数后仍回到main函数,程序在main函数结束时结束 3)所有子函数都是平行的,任何子函数都不属于其它函数,*How do you do!*,函数的分类:1)从用户使用的角度函数可分为:标准函数,即库函数.由系统提供,用户不必定义,直接使用;用户自定义函数.由用户根据需要,自行编写,以解决专门需要;2)从函数的形式分,函数可分为:无参数函数.在调用无参函数时,主函数并不将数据传送给被调用函数,一般用来执行指定的一组操作.无参函数可以带回也可以不带回函数值,一般以后者居多;如:printstar()有参函数.在调用函数时,在主函数和被调用函数之间有数据传递;如:max(a
5、,b),8.2 函数定义的一般形式,函数定义的一般形式:类型标识符 函数名(形式参数说明)函数体 形式参数说明方法:类型标识符 变量名,类型说明符 变量名1.无参函数的定义形式 类型标识符 函数名()函数体2.有参函数定义的一般形式 类型标识符 函数名(形式参数表列)函数体 3.空函数定义的一般形式类型标识符 函数名(形式参数表列),例如:int max(int x,int y)int z;z=xy?x:y;return(z);例如:void printhello()printf(“Hello,wordn”);,函数定义的一般形式:类型标识符 函数名(形式参数说明)函数体 形式参数说明方法:类
6、型标识符 变量名,类型说明符 变量名1.无参函数的定义形式 类型标识符 函数名()函数体2.有参函数定义的一般形式 类型标识符 函数名(形式参数表列)函数体,例如:int max(int x,int y)int z;z=xy?x:y;return(z);,例如:void printhello(char name)printf(“Hello,%sn”,name);,例如:dummy();,3.空函数定义的一般形式类型标识符 函数名(形式参数表列),例如:int max(int x,int y)int z;z=xy?x:y;return(z);例如:void printhello(char nam
7、e)printf(“Hello,%sn”,name);,一般情况下,函数体由两部分组成:局部变量说明 语句 局部变量:函数体内定义的变量。其有效范围仅限于所在的函数内部,离开函数体则无意义。,8.3 函数参数和函数的值,一个C程序由若干个函数组成,各函数调用时经常需要传递一些数据。即调用函数把数据传递给被调用函数,经被调用函数处理后,得到一个确定的结果,在返回调用函数时,把这结果带回调用函数。,例8.2 调用函数时的数据传递#includeint max(int x,int y)int z;z=xy?x:y;return(z);void main()int a,b,c;scanf(“%d,%d
8、”,printf(“Max is%d”,c),c=max(a,b);,int max(int x,int y)int z;z=xy?x:y;return(z);,主调函数,被调用函数,Z,a.b,各函数信息往来是由参数传递和返回语句实现,8.3 函数参数和函数的值,8.3.1 形式参数和实际参数 函数参数:用于函数间数据传递1、形式参数(形参):函数定义时设定的参数。下例中,函数头int max(int x,int y)中x,y就是形参,它们的类型都是整型。2、实际参数(实参):调用函数时所使用的实际的参数。下例中,主函数中调用max函数的语句是:nmax=max(a,b);其中a,b就是实参
9、,它们的类型都是整型。,实参a,b,形参x,y,运行情况如下:7,8Max is 8,例8.2 调用函数时的数据传递int max(int x,int y)int z;z=xy?x:y;return(z);main()int a,b,c;scanf(“%d,%d”,printf(“Max is%d”,c),关于形参和实参的说明(1)函数调用前形参不占内存。只用在发生函数调用时,形参才被分配内存单元.在调用结束后,形参所占的内存单元也被释放;(2)在被定义的函数中,必须指定形参的类型,只能是变量或数组(3)实参可以是常量,变量或表达式,如:max(3,a+b).但要求它们有确定的值.在调用时将实
10、参的值赋给形参.(4)实参和形参的类型应相同或赋值兼容,否则会出错;字符型和整形可以相互匹配。(5)C语言规定,实参对形参变量的数据传递是“值传递”,即单向传递,只能由实参传给形参,而不能由形参传回来.它仅由参数的位置确定,与名字无关。,例8.2 调用函数时的数据传递int max(int x,int y)int z;z=xy?x:y;return(z);main()int a,b,c;scanf(“%d,%d”,printf(“Max is%d”,c),又将函数max作变形会怎样?#include int max(int b,int a)int c;c=ab?a:b;return(c);ma
11、in()int a,b,c;scanf(“%d,%d”,printf(“Max is%d”,c),将函数max作变形会怎样?#include int max(int x,int y)x=xy?x:y;return(x);main()int a,b,c;scanf(“%d,%d”,printf(“Max is%d”,c),例:读程序,写出结果#includeint sum(int a,int b)a=a+b;b=a+b return a;void main()int a=1,b=3,c;c=sum(a,b);printf(“Sum of%d,%d is%dn,a,b,c);,sum of 1,3
12、 is 4,8.3.2 函数的返回值 通常,希望通过函数调用使主调函数得到一个确定的值,这就是函数的返回值.说明:(1)函数的值也就是函数的返回值。函数的返回值是通过函数中的return语句获得的.,int max(int x,int y)int z;z=xy?x:y;return(z);main()int a,b,c;scanf(“%d,%d”,printf(“Max is%d”,c),8.3.2 函数的返回值 通常,希望通过函数调用使主调函数得到一个确定的值,这就是函数的返回值.说明:(1)函数的返回值是通过函数中的return语句获得的.(2)一个函数中可以有一个以上的return语句,
13、但不论执行到哪个return都将结束函数调用返回主调函数;,int max(int x,int y)if(xy)return x;else return y;main()int a,b,c;scanf(“%d,%d”,printf(“Max is%d”,c),8.3.2 函数的返回值 通常,希望通过函数调用使主调函数得到一个确定的值,这就是函数的返回值.说明:(1)函数的返回值是通过函数中的return语句获得的.(2)一个函数中可以有一个以上的return语句,但不论执行到哪个return都将结束函数调用返回主调函数;(3)return语句后的括弧可以不要;例如:return z;和retu
14、rn(z);是等效的.return后面的值可以是一个表达式。(4)函数返回值的类型应当在定义函数值时指定;在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致,如果不一致,则以函数类型为准.,int max(int x,int y)return(xy?x:y;);main()int a,b,c;scanf(“%d,%d”,printf(“Max is%d”,c),(6)为了明确表示“不带回值”,可以用“void”定义无类型.例如:例8.1中的定义为:void printstar()void print_message()这样,系统就保证不使函数带回任何值,即禁止在调用函数
15、中使用被调用函数的返回值.例如:a=printfstar();b=print_message();是不合法的.,8.4 函数的调用,8.4.1 函数调用的一般形式函数调用的一般形式为:函数名(实参表列)说明:(1)如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略;(2)如果实参表列多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致;在Turbo C中,对实参求值的顺序是按自右至左顺序求值的.,例8.2 调用函数时的数据传递int max(int x,int y)int z;z=xy?x:y;return(z);main()int a,b,c;scanf(“%d,%d”
16、,printf(“Max is%d”,c),8.4.1 函数调用的一般形式函数调用的一般形式为:函数名(实参表列)说明:(1)如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略;(2)如果实参表列多个实参,则各参数间用逗号隔开,实参与形参的个数应相等,类型应一致;在Turbo C中,对实参求值的顺序是按自右至左顺序求值的.,例:读程序,写出结果#includeint f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return c;void main()int i=2,p;p=f(i,+i);printf(“%d”,p);
17、,8.4.1 函数调用的一般形式函数调用的一般形式为:函数名(实参表列)说明:(1)如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略;(2)如果实参表列多个实参,则各参数间用逗号隔开,实参与形参的个数应相等,类型应一致;在Turbo C中,对实参求值的顺序是按自右至左顺序求值的.,例:读程序,写出结果#includeint f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return c;void main()int i=2,p,j;j=+i;p=f(i,j);printf(“%d”,p);,8.4.2 函数调用的方式
18、按函数在程序中出现的位置来分,可以有以下三种函数调用方式:1.函数语句把函数调用作为一个语句.如例8.1中的printstar();这种不要求函数带回值,只要求函数完成一定的操作;2.函数表达式函数出现在一个表达式中,这种表达式称为函数表达式,这是要求函数带回一个确定的值参加表达式的运算.例如:m=max(a,b);c=2*max(a,b);3.函数参数函数调用作为一个函数的实参.这种调用的实质也是函数表达式调用的一种.例如:m=max(a,max(b,c);printf(“max is%d”,max(a,b);其中max(b,c)是一次函数调用,它的值作为max另一次调用的实参。,函数调用的
19、执行过程 按从左向右的顺序,计算实参中各表达式的值按照位置,将实参的值一一对应地传给形参 执行被调用函数 当遇到return(表达式)语句时,计算表达式的值,并返回主调函数。,例:读程序,写出结果#include int iabs(float x)return(x0?x;-x);void main()float x=-1,y;y=iabs(x)printf(“x=%f,iabs(x)=%fn,x,y);,8.4.3 对被调用函数的声明和函数原型,在一个函数中调用另一个函数需要具备的条件:(1)首先被调用的函数必须是已经存在的函数(库函数或用户自己定义的函数);(2)如果使用库函数,一般还应该在
20、本文件开头用#include命令将调用有关库函数时所用到的信息“包含”到本文件中来。,例如(先定义后使用)#includefloat f(float x)return 2*x*x+3*x+1);void main()float x;scanf(f,例如(使用库函数)#include#includevoid main()float x,y;scanf(f,(3)如果使用用户自己定义的函数,被调函数定义在主调函数之后,一般还应该在主调函数中对被调用函数作声明。(函数声明也称为函数原形),对被调用函数的声明。,从此行开始为对被调用函数的定义。包括函数首部、函数体等。,例(后定义使用原型说明)#inc
21、ludevoid main()float f(float);float x;scanf(f,函数原型的形式为:函数类型 函数名(参数类型1,参数类型2),在函数声明中可以不写形参名,而只写形参的类型。如可以这样进行函数声明:float add(float,float);函数原型的一般形式为:(1)函数类型 函数名(参数类型1,参数类型2)(2)函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2)编译系统不检查参数名。函数声明可以写成:float add(float a,float b);,应当保证函数原型与函数首部写法上的一致,即函数类型、函数名,参数个数,参数类型和参数顺序必须相同
22、。函数调用时函数名、实参个数应与函数原型一致。实参类型必须与函数原型中的参数类型赋值兼容。如果被调用函数的定义出现在主调函数之前,可以不必加以声明。,8.3 函数参数和函数的值,8.3.1 形式参数和实际参数1、形式参数(形参):函数定义时设定的参数。2、实际参数(实参):调用函数时所使用的实际的参数。关于形参和实参的说明(1)函数调用前形参不占内存。只用在发生函数调用时,形参才被分配内存单元.在调用结束后,形参所占的内存单元也被释放;(2)C语言规定,实参对形参变量的数据传递是“值传递”,即单向传递,只能由实参传给形参,而不能由形参传回来.它仅由参数的位置确定,与名字无关。,8.4 函数的调
23、用,8.4.1 函数调用的一般形式函数调用的一般形式为:函数名(实参表列)说明:(1)如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略;(2)如果实参表列多个实参,则各参数间用逗号隔开。实参与形参的个数应相等,类型应一致;在Turbo C中,对实参求值的顺序是按自右至左顺序求值的.,如果使用用户自己定义的函数,被调函数定义在主调函数之后,一般还应该在主调函数中对被调用函数作声明。(函数声明也称为函数原形)函数原型的一般形式为:(1)函数类型 函数名(参数类型1,参数类型2)(2)函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2)如果被调用函数的定义出现在主调函数之前,可以
24、不必加以声明。,8.4.3 对被调用函数的声明和函数原型,例:编写求 的程序分析:重复三次求阶乘运运算,只是每次的值不同。将求阶乘的过程编成一个函数fac,以不同的参数值k来调用函数,fac,k,k!,#include#includefloat fac(int k)float t=1;int i;for(i=2,i=k;i+)t*=i;return t;void main()float c;int m,n;scanf(“%d%d”,例:编写求 的程序分析:重复三次求阶乘运运算,只是每次的值不同。将求阶乘的过程编成一个函数fac,以不同的参数值k来调用函数,fac,k,k!,#include#i
25、ncludevoid main()float c;int m,n;float fac(int);/float fac(int x);scanf(“%d%d”,8.5函数的嵌套调用,C语言的函数定义都是互相平行、独立的。C语句不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。,#includevoid printstar()printf(“*n”);void print_message()printf(“How do you do!n”);printstar();void main()printstar();print_message();,例 8.用弦截
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计
链接地址:https://www.31ppt.com/p-5426442.html