第七章-库函数函数的定义与返回值课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第七章-库函数函数的定义与返回值课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七 库函数 函数 定义 返回 课件
- 资源描述:
-
1、第七章 函数 在解决一个比较复杂的实际问题时,不可能把所有要完成的任务全都写在main函数中。这时,程序往往由一个main函数和若干个其它函数组成,每个函数各自完成相对独立的部分功能。 在前面的章节中,我们编写的程序都是由一个main函数来组成,在main函数中调用过scanf、printf等系统函数。模块化的程序设计方法函数间相互调用的示意函数间相互调用的示意 main() f1() f11() f1(); f11(); f12() f2(); f12(); f2() f21() f21(); 函数的分类从函数形式v无参函数 v有参函数?我们学习过哪些无参函数和有参函数?从用户角度v标准函数
2、(库函数):由系统提供v用户自定义函数 库函数由系统提供,用户只要按照要求的格式正确调用即可。不同的C编译系统提供的库函数有些不同。 7.1 库函数使用库函数应注意的问题:1、调用库函数时要用include命令将相关的头文件包含进来。 如:调用数学函数,用include math.h | 调用输入输出函数,用include stdio.h | 调用字符函数,用include ctype.h | 2、库函数调用的一般形式: 函数名(参数表) 要注意函数的功能、参数的个数与类型、函数值的类型。 如:求平方根的函数sqrt的形式是:double sqrt (double x) 3、库函数调用以两种方
3、式出现。其一:出现在表达式中,即作为表达式的一部分参与运算。如:计算y=x2.5+1.3,则通过以下语句调用来实现。 y=pow(x,2.5)+1.3;其二:独立的语句,即调用函数后加一分号。如:printf(*n);4、调用库函数时,要注意参数的一些特殊要求。如三角函数要求自变量参数用弧度表示,开平方函数要求自变量参数的值大于或等于0。使用库函数应注意的问题(续)函数返回值的类型缺省int型无返回值: void函数体函数类型 函数名(形参类型说明表) 说明部分执行部分 7.2 函数的定义和返回值1. 函数定义的一般格式现代风格:多个形参说明之间要用逗号隔开没有形参时,这一对括号不能省略合法标
4、识符如果函数的类型不是如果函数的类型不是void,函数体最,函数体最后要用后要用return语句去返回一个值语句去返回一个值例1 有参函数(现代风格) int max(int x,int y) int z; z = xy?x:y; return(z); 例2 有参函数(现代风格) int max(int x, y) int z; z = xy?x:y; return(z); 例3 无参函数 void printstar( ) printf(*n); 或 void printstar(void ) printf(*n); 函数的定义示例例4 空函数 void dummy(void) 函数体为空(
5、留待以后补充) int max2(int x , int y) /*现代风格*/ int max; if(xy) max = x; else max = y; printf(max(max2)=%dn,max); return(max); void main()int a,b,max; scanf(%d,%d,&a,&b); max = max2(a,b)+100; printf(max(main) =%dn,max);例 函数的定义 形参形参和和函数体中定函数体中定义的变量义的变量只在函数只在函数被调用时才被调用时才临时分临时分配存储单元配存储单元,当,当退退出出函数时,这些存函数时,这些存
6、储单元储单元全部被释放全部被释放(称为局部性,因称为局部性,因而与其它函数中的而与其它函数中的变量同名不会引起变量同名不会引起混淆)。混淆)。 main()时,时,main函函数是什么类型的?数是什么类型的?可改写为可改写为max=xy?x:y;形参形参实参实参函数与函数之间是平等的void main()int max2(int x , int y) int z; if(xy) z=x; else z=y; return(z); int a,b,max; scanf(%d,%d,&a,&b); max=max2(a,b); printf(max=%dn,max); 函数的定义是平行的函数的定义
7、是平行的, ,不能在一个函数的内部再定义不能在一个函数的内部再定义其它其它函数。即每个函数。即每个函数函数都都是一个相对独立的模块,不能在写某一个函数时又包含了另一个函是一个相对独立的模块,不能在写某一个函数时又包含了另一个函数的定义(数的定义(mainmain函数的执行时有一点点小的特权!函数的执行时有一点点小的特权!)。)。 返回语句v形式return(表达式);或 return 表达式; 或 return;v功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数v说明:l函数中可以有多个return语句,但只有其中的一个return语句能够得到执行l若函数中没有return
8、语句,或者是一个不带表达式的return语句,则该函数结束时自动返回调用函数一个不确定的值l若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换lvoid型函数:明确说明函数没有返回值2. 函数的返回值int max(float x, float y) float z; z=xy?x:y; return(z);main() float a,b; scanf(%f,%f,&a,&b); printf(Max is %dn, max(a,b);例 函数返回值类型转换 main()int a,b,max; scanf(%d,%d,&a,&b); max=max2(a
9、,b); printf(max=%dn,max);int max2(int x,int y) int z; if(xy)return x; elsereturn y;例 函数可以有多个return语句注意:注意:在在C C语言中,函数名不语言中,函数名不能被赋值,能被赋值,只能通过只能通过return语句返回一个值。 int max2(int x,int y) max2= xy?x:y ; printstar() printf(*n);main() int a; a = printstar(); printf(a=%dn,a);输出:a=10例 函数带回不确定值printstar()是是什么类
10、型?什么类型?void型函数:明确说明函数没有返回值#include /*void*/ printstar() printf(*#*n);main() int a; a=printstar();a=printstar(); printf(a=%dn,a);void printstar() printf(*n);main() int a; a = printstar(); printf(a=%d,a);编译错误!(VC+)error C2120: void illegal with all types说明:(1) 调用函数时,其名字必须与定义的名字相同。 (2) 函数调用时的实参只写名字不需要在
11、名字前再带实参类型。 如上面main函数中对max2函数的调用不能写成: max = max2(int a,int b); 7.3 函数的调用1. 函数调用的一般形式: 函数名(实参表);说明: (3) 实参与形参,个数应一致。若实参少,则必有形参未得到值(不确定值),影响结果。若实参多,则多余的无效(TC)。 如:c=max2(3); 则c的值为:761(随机值) 若:c=max2(3,5,8); 则c的值为: 5(4) 实参与形参的类型应一一对应相匹配。若不匹配,程序仍能运行,但得不出正确结果(TC)。 如:c=max(3.0,5.0); 则c的值为: 0 若:c=max(3L,5L);
12、则c的值为: 3函数调用说明(续)(5) 函数必须先定义,后调用。 将要被调用的函数定义在前,调用在后。返回值类型为int或char的函数可例外。(6) 函数可直接或间接地自己调用自己(递归调用,在7.6节介绍)函数调用说明(续)(7) 实参表求值顺序,因系统而定(Turbo C 自右向左)#include stdio.hvoid main() int p=2; printf(%d,%d,%dn,p,+p,p); /*TC: 3,3,2 VC: 3,3,2*/#include stdio.hvoid main() int p=2; printf(%d,%d,%dn,p,p+,p);/*TC:
13、3,2,2 VC: 2,2,2*/2. 函数调用的方式1. 函数表达式: 例 m=max(a,b)*2;2. 函数语句: 例 printstar(); printf(Hello,World!n );3. 函数参数: 例 printf(%d ,max(a,b); m=max(a,max(b,c); 7.4 函数的说明 在C语言中,除了主函数外,对于用户定义的函数要遵循“先定义,后使用”的规则。凡是未在调用之前定义的函数,C编译程序默认函数的返回值为int类型。对于返回值为其它类型的函数,若把函数的定义放在调用之后,应该在调用之前对函数进行说明(或称为函数原型说明)。 C语言对被调用函数要求:l必
14、须是已存在的函数l库函数: #include l用户自定义函数: 函数类型说明1. 函数说明一般形式 函数类型 函数名(形参类型 形参名,. ); 函数类型 函数名( );或main( )float a,b,c; float max2(float x, float y); /* 函数的说明 */ scanf(%f%f ,&a,&b); c=max2(a,b); /* 函数的调用 */ printf(%fn,c);float max2(float x,float y) /* 以下为函数的定义 */ float z; if(xy) z=x; else z=y; return(y); 例如:函数说明
15、语句作用:告诉编译系统max2函数是float类型的、有2个float类型的参数。可选在VC中不允许说明 (1)函数说明可以是一个独立的语句;如上面例子中就是采用独立语句的形式。 (2)函数说明中的形参名是一种虚设,它们可以是任意的用户标识符,既不必与函数首部中的形参名一致,又可以与程序中的任意用户标识符同名。因此,参数名也可以省略。如上面的例子中函数说明可写成: float max2(float,float); (3)注意函数定义与函数说明是不同的,定义是写出函数的完整形式,而说明是告诉系统此函数的返回值类型、参数的个数与类型,便于编译时进行有效的类型检查。 (4)若函数的返回值类型为int
16、或char,则可以不进行函数说明(系统默认)。但是使用这种方法时,系统无法对参数的类型做检查。若调用函数时参数使用不当,在编译时也不会报错。因此,为了程序清晰和安全,建议都进行说明为好。 (5)若被调函数的定义出现在主调函数之前,也可以不进行函数说明。 (6)有些系统(如Borland C+、VC+等)要求一定要用函数说明指出函数类型和形参类型,并且对void和int型函数也要进行函数说明。main()int a,b,c; scanf(“%f%f”,&a,&b); c=max2(a,b); /* 函数的调用 */ printf(“%fn”,c);int max2(int x, int y) /
17、* 以下为函数的定义 */ int z; if(xy) z=x; else z=y; return(z);/*书错为return(y) */ int型函数可不作函数说明(Borland C+不行)float max2(float x,float y) /* 以下为函数的定义 */ float z; if(xy) z=x; else z=y; return(z);/*书错为return(y) */ main()float a,b,c; scanf(“%f%f”,&a,&b); c=max2(a,b); /* 函数的调用 */ printf(“%fn”,c);被调函数出现在主调函数之前,不必函数说
18、明main() float add(float,float); /*function declaration*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);也可写成:float add();例 函数说明举例2.函数说明的位置 (1)放在调用函数的说明部分(只有此调用函数能识别被调用函数)。可以是独立语句,也可与其它变量的定义放在同一个语句中。 如上面的用法也可以如下形式的语句: float a,b,c
19、,max2(float,float); (2) 放在所有函数的外部,被调用之前。(此时函数说明的后面所有位置上都可对该函数进行调用)。float max2(float,float);main()float a,b,c; scanf(“%f%f”,&a,&b); c=max2(a,b); printf(“%f”,c); float max2(float x,float y)函数说明放在所有函数的外部例 函数说明举例 (3)调用库函数时,要在程序的开头使用 命令:#include 来包含相关的头文件,就是因为头文件中包含了这些库函数的原型说明。 形参与实参的概念形式参数:定义函数时函数名后面括号中
20、的变量名实际参数:调用函数时函数名后面括号中的表达式7.5 调用函数和被调用函数之间的数据传递 int max2(int x, int y) int z; z=(xy)?x,y ; return(z); main()int a,b,c; a=30,b=58; c=max2(a,b); c=max2(a+5,100); printf(“%fn”,c);例如:形参:x,y形参必须指定类型;实参:a,b实参: a+5,100(1) 实参表达式也可以是变量或常量,但必须有确定的值;(2) 要求形参与实参类型一致,个数相同(多:略/少:随机值);(4) 形参在函数被调用前不占内存;函数调用时为形参分配内
21、存;调用结束,内存释放;(5) C语言的参数传递方式 值传递方式:函数调用时,系统临时为被调函数的形参分配存贮单元,并将实参的值复制到形参中;当被调函数结束时,形参单元被释放,实参单元仍保留并维持原值。特点:单向的值传递(数值或地址值)。有关参数传递的几点说明xaproduct1.21.21.7281.变量作为参数(单向的数值传递)#include float cube(float x) return(x*x*x);void main() float a, product; printf(Please input value of a:); scanf(%f,&a); product=cube
22、(a); printf(”Cube of %.4f is %.4fn,a,product);例 计算x的立方Cube kju:b n.立方体, 立方main()void swap(int , int); int x=10,y=20; printf(“(1)x=%d y=%dn”,x,y); swap(x,y); printf(“(4)x=%d y=%dn”,x,y);void swap(int a, int b)int t; printf(“(2)a=%d b=%dn”,a,b); t=a; a=b; b=t; printf(“(3)a=%d b=%dn”,a,b);例7.1 函数参数之间的单
23、向传递1020 x:y:调用前:调用结束:1020 x:y:调用:1020a:b:1020 x:y:swap:1020 x:y:2010a:b:t:程序运行结果为:(1)x=10 y=20(2)a=10 b=20(3)a=20 b=10(4)x=10 y=20main( )void ex(int z,int y,int x); int x=10,y=20,z=30; printf(“(1)x=%d y=%d z=%dn”,x,y,z); ex(y,z,x);void ex(int x,int y,int z) printf(“(2)x=%d y=%d z=%dn”,x,y,z);例7.2 实参
24、向形参按位置传递数据 程序运行结果为:(1)x=10 y=20 z=30(2)x=20 y=30 z=10实参:3010y:z:3010z:x:形参:20 x:20y:函数说明语句形参名是一种虚设函数调用语句确定实参顺序函数定义确定形参顺序实参向形参按位置传递数据#include long sum(int a, int b); long factorial(int n);void main() int n1,n2; long a; scanf(%d,%d,&n1,&n2); a=sum(n1,n2); printf(a=%1d,a); long sum(int a,int b) long c1
展开阅读全文