C语言实例08.ppt





《C语言实例08.ppt》由会员分享,可在线阅读,更多相关《C语言实例08.ppt(92页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章第八章 函函 数数 8.1 概述概述 一个大一个大 程序一般应分为若干个程序一般应分为若干个程序模块程序模块,一个模块用来实现,一个模块用来实现 一个一个 特定的功能。特定的功能。C程序有一个主函数和若干个函数构成。程序有一个主函数和若干个函数构成。由主函数调用其它函数;由主函数调用其它函数;其它函数也可以互相调用;其它函数也可以互相调用;同一个函数可以被一个或多个函数调用同一个函数可以被一个或多个函数调用任意多次任意多次。第八章第八章 函数函数要记住要记住4.所有函数都是平行的,即相互独立的,可以所有函数都是平行的,即相互独立的,可以相互调用相互调用,但不能相互嵌套定义。但不能相互嵌套
2、定义。5.从用户角度看,从用户角度看,C语言的函数有两种语言的函数有两种:(1).标准函数标准函数(库函数库函数)(2).用户自定义函数用户自定义函数6.从函数形式看,从函数形式看,C语言的函数分两类语言的函数分两类:(1).无参函数无参函数 (2).有参函数有参函数 说明说明:1.一个一个C程序由一个或多个源文件组成程序由一个或多个源文件组成(便于分别编写和调试便于分别编写和调试)2.一个源程序有一个或多个函数组成一个源程序有一个或多个函数组成,以以源文件源文件为单位进行编译为单位进行编译 3.C程序的执行从程序的执行从main函数开始,函数开始,main函数是系统定义的函数是系统定义的 C
3、 程序程序 源文件源文件1源文件源文件2 源文件源文件n。源文件源文件 i 函数函数 1 函数函数 2 函数函数 n。组织结构组织结构 void main()printstar();print_message();printstar();(1)(2)(3)void print_message()printf(How do you do!n);void printstar()printf(*n);一个源文件(三个函数)一个源文件(三个函数)例例 8.1运行结果:运行结果:*How do you do!*printstar(),print_message()都是无参函数;都是无参函数;main()
4、主函数调用这两个子函数;主函数调用这两个子函数;print_message()被调用两次。被调用两次。1.无参函数的定义形式(括号内无参量)无参函数的定义形式(括号内无参量)类型标识符类型标识符 函数名函数名()说明部分说明部分 语句语句 其中其中:“类型标识符类型标识符”指定函数值的类型,指定函数值的类型,即函数带回来的值的类型;即函数带回来的值的类型;如果不需要带回函数值,如果不需要带回函数值,写上写上void类型标识符(空类型);类型标识符(空类型);“”内是内是函数体函数体,包括说明部分和语句部分。,包括说明部分和语句部分。函数体函数体8.2 函数定义的一般形式函数定义的一般形式voi
5、d printstar()printf(*n);例如例如:2.有参函数定义的一般形式有参函数定义的一般形式 类型标识符类型标识符 函数名(函数名(形式参数表列形式参数表列)说明部分说明部分 语句语句 形式参数的说明必须写在函数体的外面,括号内。形式参数的说明必须写在函数体的外面,括号内。函数体内用到的变量必须在函数体内进行说明函数体内用到的变量必须在函数体内进行说明注意注意int max(int x,int y)/*形式参数说明形式参数说明 */int z;/*函数体内变量说明函数体内变量说明 */z=xy?x:y;return(z);例如例如:3.空函数空函数 类型标识符类型标识符 函数名函
6、数名()空函数不进行任何操作空函数不进行任何操作 例如例如:dummy()用途:用途:在程序中占一个位置在程序中占一个位置,以后用一个编好的函数代替。,以后用一个编好的函数代替。这样做,程序总的结构清晰,可读性好。这样做,程序总的结构清晰,可读性好。当主调函数和被调用函数之间有数据传递关系时,应定义为当主调函数和被调用函数之间有数据传递关系时,应定义为 有参函数有参函数。在在定义函数定义函数时,函数名后面括号中的变量名称为时,函数名后面括号中的变量名称为“形式参数形式参数”(简称简称“形参形参”)。在在调用函数调用函数时,函数名后面括号中的表达式称为时,函数名后面括号中的表达式称为“实际参数实
7、际参数”(简称简称“实参实参”)。8.3 函数参数和函数的值函数参数和函数的值8.3.1 形式参数和实际参数形式参数和实际参数void main()int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(max is%dn,c);int max(int x,int y)int z;z=xy?x:y;return(z);函数定义函数定义a 和和 b 就是实参就是实参x 和和 y 就是形参就是形参数据传递数据传递运行结果:运行结果:输入:输入:7,8 输出:输出:max is 8调用函数时的数据传递。调用函数时的数据传递。例例 8.2 1.在定义函数中指定的在
8、定义函数中指定的形式参数形式参数,在未出现函数调用时,它们,在未出现函数调用时,它们 并并不占内存不占内存中的存储单元,只有在发生函数调用时,函数中中的存储单元,只有在发生函数调用时,函数中 的形参的形参才被分配内存单元才被分配内存单元,在调用结束后,在调用结束后,形参所占的内存形参所占的内存 单元即被释放。单元即被释放。2.实参可以是常量、变量或表达式实参可以是常量、变量或表达式,但必须有确定的值。,但必须有确定的值。在调用时将在调用时将实参的值赋给形参变量实参的值赋给形参变量(数组除外数组除外),例如:,例如:c=max(3,a+b);说说 明明 几几 点点 上例中上例中3赋给赋给x,a+
9、b的值赋给的值赋给y.3.在函数定义中必须在函数定义中必须指定形参的类型指定形参的类型。4.实参与形参的实参与形参的类型必须一致类型必须一致。5.实参变量对形参变量的数据传递是实参变量对形参变量的数据传递是值传递值传递(即单向传递即单向传递),实参实参=形参形参 (即在形参中建立实参的复本即在形参中建立实参的复本)只由实参传给形参,而不能由形参传回来给实参。只由实参传给形参,而不能由形参传回来给实参。6.在形参表列中同时对形参进行类型说明在形参表列中同时对形参进行类型说明 如如:int max(int x,int y)等价于等价于 int max(x,y).int x,y;.这是早期这是早期C
10、的写法的写法 1.函数的返回值是通过函数中的函数的返回值是通过函数中的 return 语句获得的,语句获得的,return 语句语句 将被调用函数中的将被调用函数中的一个确定值一个确定值带回主调函数中去。带回主调函数中去。如果需要从被调用函数中带回一个函数值,则被调用函数中如果需要从被调用函数中带回一个函数值,则被调用函数中 必须包含必须包含 return 语句。语句。如果不需要从被调用函数中带回一个函数值,则可以不要如果不需要从被调用函数中带回一个函数值,则可以不要 return 语句。语句。一个函数中可以有一个以上的一个函数中可以有一个以上的 return 语句,执行到哪一个,语句,执行到
11、哪一个,哪一个就起作用。例如:哪一个就起作用。例如:if(xy)return x;else return y;8.3.2 函数的返回值函数的返回值return 语句的形式语句的形式:return(表达式表达式);或或 return 表达式表达式;或或 return;返回表达式的值返回表达式的值不返回值不返回值例如:例如:return(z);或或 return z;return(xy?x:y);2.函数值的类型函数值的类型 应当在应当在定义函数定义函数时用类型标识符指定函数值的类型。时用类型标识符指定函数值的类型。例如例如:int max(int x,int y)-函数值为整型函数值为整型 do
12、uble min(double x,double y)-函数值为双精度型函数值为双精度型 C语言中规定,凡不加类型说明的函数,一律自动按语言中规定,凡不加类型说明的函数,一律自动按整型整型处理。处理。例如例如:int max(int x,int y)可写成可写成 max(int x,int y)在定义函数时对函数的类型说明一般应该和在定义函数时对函数的类型说明一般应该和 return 中的表达式中的表达式 的值的类型一致。的值的类型一致。3.当函数值的类型和当函数值的类型和 return 语句中的表达式的值语句中的表达式的值不一致不一致时时,以以函数类型函数类型为准为准(自动进行类型转换自动进
13、行类型转换)。void main()float a,b;int c;scanf(%f,%f,&a,&b);c=max(a,b);printf(max is%dn,c);运行结果:运行结果:输入:输入:1.5,2.5 输出:输出:max is 2 返回值类型和函数类型不一致。返回值类型和函数类型不一致。当返回时当返回时,先将先将z的值转换成的值转换成int型型然后由然后由return带回一个整型的函数值带回一个整型的函数值例例 8.3int max(float x,float y)float z;/*z是是float型型 */z=xy?x:y;return(z);4.如果被调用函数中没有如果被调
14、用函数中没有 return 语句,并不表示函数不带回语句,并不表示函数不带回 函数值,而是带回函数值,而是带回一个不确定的值一个不确定的值。使用时要注意。使用时要注意。5.为了明确表示函数为了明确表示函数“不带回函数值不带回函数值”,可以用可以用“void”将函数定义将函数定义 为为“无类型无类型”(即即“空类型空类型”),这样系统就保证不使函数带回任何值。这样系统就保证不使函数带回任何值。void main()printstar();void printstar()printf(*n);例如例如:8.4.1 函数调用的一般形式函数调用的一般形式 函数名函数名(实参表列实参表列);1.如果是调
15、用无参函数,则没有实参表列,但是如果是调用无参函数,则没有实参表列,但是“()”不能省略。不能省略。2.如果实参表列中包含多个实参,每个实参之间用如果实参表列中包含多个实参,每个实参之间用“,”分隔。分隔。3.实参和形参必须一一对应,实参和形参必须一一对应,即个数相等,类型一致。即个数相等,类型一致。void main()int p;p=f(2,3);printf(%d,p);int f(int a,int b)int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);8.4 函数的调用函数的调用例例 8.41.函数语句函数语句-把函数调用作为一个
16、语句,这时并不要求把函数调用作为一个语句,这时并不要求 函数带回值。函数带回值。例如例如:printstar();2.函数表达式函数表达式-函数出现在表达式中,这时要求函数带回一个函数出现在表达式中,这时要求函数带回一个 确定的值参与运算。确定的值参与运算。例如例如:c=2*max(a,b);3.函数参数函数参数-函数调用作为一个函数的实参。函数调用作为一个函数的实参。例如例如:m=max(a,max(b,c);printf(%d,max(a,b);8.4.2 函数调用的方式函数调用的方式 在一个函数中调用另一个函数应具备什么条件在一个函数中调用另一个函数应具备什么条件?1.被调用的函数必须是
17、被调用的函数必须是已经存在的函数已经存在的函数。2.如果是使用如果是使用库函数库函数,一般还应该在程序的开头用,一般还应该在程序的开头用#include命令命令 将调用有关库函数时所需的信息包含到本程序中。例如:将调用有关库函数时所需的信息包含到本程序中。例如:#include#include 3.如果使用用户自定义的函数,而且该函数与调用它的函数在如果使用用户自定义的函数,而且该函数与调用它的函数在 同一个文件中时,同一个文件中时,一般还应在主调函数中对被调用函数的一般还应在主调函数中对被调用函数的 返回值的类型作说明。说明方式:返回值的类型作说明。说明方式:类型标识符类型标识符 被调用函数
18、的函数名被调用函数的函数名(形参类型说明形参类型说明);8.4.3 对被调用函数的说明和函数原型对被调用函数的说明和函数原型注意注意:只对函数的返回值和形参的类型进行说明,只对函数的返回值和形参的类型进行说明,不包括函数体。不包括函数体。作用作用:告诉系统在该函数中将要调用的某个函数的类型,告诉系统在该函数中将要调用的某个函数的类型,便于检查。便于检查。void main()float add(float x,float y);/*对被调函数声明对被调函数声明 */float a,b,c;scanf(“%f,%f”,&a,&b);c=add(a,b);/*调用在定义之前调用在定义之前 */pr
19、intf(“sum is%f”,c);float add(float x,float y)/*函数函数定义定义 */float z;z=x+y;return(z);对被调函数作函数原型声明。对被调函数作函数原型声明。这种函数声明称为这种函数声明称为函数原型声明函数原型声明,当当调用在定义之前调用在定义之前要作函数原型声明。要作函数原型声明。如果先定义后调用,可以不作声明。如果先定义后调用,可以不作声明。被调函数声明的另一种形式:(可以不写出变量名)被调函数声明的另一种形式:(可以不写出变量名)float add(float,float);例例 8.5C语言中还规定以下几种特殊情况可以语言中还规
20、定以下几种特殊情况可以不对被调用函数不对被调用函数进行类型说明进行类型说明:1.如果函数值是如果函数值是整型或字符型时整型或字符型时,可以不进行类型说明。,可以不进行类型说明。2.如果如果被调用函数的定义出现在主调函数之前被调用函数的定义出现在主调函数之前可以不进行可以不进行 类型说明类型说明(因为系统已经知道了该函数的类型因为系统已经知道了该函数的类型)。例如。例如:float add(float x,float y).void main()float a,b,c;.c=add(a,b);.函数函数定义定义函数函数调用调用3.如果在所有函数定义之前,在文件的开头如果在所有函数定义之前,在文件
21、的开头,在函数的外部,在函数的外部 已说明了函数类型,则在各个主调函数中不必对所有的函数已说明了函数类型,则在各个主调函数中不必对所有的函数 进行类型说明。进行类型说明。例如例如:char letter(char,char);float add(float,float);void main().x=add(y,z);c=letter(a,b);.char letter(char c1,char c2).float add(float a,float b).C语言的函数都是互相平行的、独立的,因此语言的函数都是互相平行的、独立的,因此C语言中语言中不能不能 嵌套函数定义嵌套函数定义,但但可以嵌套
22、调用函数可以嵌套调用函数。main().调用调用a函数函数 .a函数函数 .调用调用b函数函数 .b函数函数 .(2)(3)(4)(1)(5)(6)(7)(8)(9)8.5 函数的嵌套调用函数的嵌套调用特别注意特别注意嵌套调用函数的例子嵌套调用函数的例子 (求求 f(x)=x-5x+16x-80=0)方法方法:1.取两个不同的点取两个不同的点 x1、x2,如果如果f(x1)和和f(x2)符号相反,则在区间符号相反,则在区间(x1,x2)内必有一个根;内必有一个根;如果如果f(x1)和和f(x2)符号相同,改变符号相同,改变x1、x2,直到直到f(x1)与与f(x2)异号;异号;2.连接连接f(
23、x1)、f(x2)两点与两点与x轴相交于轴相交于x,求求x,并由并由x求出求出 f(x);x1*f(x2)x2*f(x1)x=-(求求x 公式)公式)f(x2)f(x1)3.若若f(x)与与f(x1)同号,则根在同号,则根在(x,x2)内,这时将内,这时将x作为新的作为新的x1;若若f(x)与与f(x2)同号,则根在同号,则根在(x1,x)内,这时将内,这时将x作为新的作为新的x2;4.重复第重复第2、第、第3步,直到步,直到|f(x)|为止。为止。3 2 用用弦截法弦截法求方程求方程 f(x)=0 的根的根。例例 8.6功能分解功能分解:1.定义一个函数定义一个函数 f(x),用来求用来求
24、f(x)的函数值;的函数值;2.定义一个函数定义一个函数 xpoint(x1,x2),用来求用来求f(x1)和和f(x2)的连线的连线 与与x轴的交点轴的交点x;3.定义一个函数定义一个函数 root(x1,x2),用来求用来求(x1,x2)内的那个实根;内的那个实根;这里,函数这里,函数root中要调用函数中要调用函数 xpoint,而函数而函数xpoint中中 又要调用函数又要调用函数f(x);x1 x2xxyf(x2)f(x1)f(x)0 f(x)=0,其中其中x就是所求的根就是所求的根+-#include /*定义函数定义函数f(x)*/float f(float x)float y;
25、y=x*x*x-5*x*x+16*x-80;return(y);float xpoint(float x1,float x2)/*定义函数定义函数xpoint*/float x;x=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1);return(x);/*定义函数定义函数root*/float root(float x1,float x2)int i;float x,y,y1;y1=f(x1);do x=xpoint(x1,x2);y=f(x);if(y*y10)y1=y;x1=x;else x2=x;while(fabs(y)0.0001);return(x);/*主函数主函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 实例 08

限制150内