(1.7)--第7章 函数C语言程序设计.ppt
《(1.7)--第7章 函数C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《(1.7)--第7章 函数C语言程序设计.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7 7章章 函数函数1 “米奇妙妙屋”是由“积木”搭建而成,一个C语言“程序”由若干个称之为“函数”的模块构成,函数与程序的关系如同“积木”与“米奇妙妙屋”,因此C语言被称为“函数式的语言”。要用“函数积木”搭好“程序米奇妙妙屋”,就要先学会函数的定义、声明和调用等函数的相关知识。学习目标:21.会进行函数的格式定义、声明2.会包含库函数的头文件、正确调用已有函数3.理解函数参数的含义、传递过程、传递的值4.理解函数的递归过程、什么情况适合用递归解决5.理解函数如何返回结果,有几种方式6.变量的有效范围的确定6.变量的生存周期的确定本章重点内容:函数式多文件程序结构1变量的作用域、变量的存
2、储类型5函数的定义、调用及声明24函数的嵌套与递归3函数的参数传递过程3函数1函数2函数m文件1文件2文件n程序C程序是函数的集合体,每个函数是一个独立的程序模块;一个C程序有且仅有一个主函数,若干个子函数,程序总是从主函数开始执行,在主函数内结束;函数可集中或分散存放在一个或多个源程序文件中;所有子函数地位平等,可互相调用、自我调用,但一个函数内部不能嵌套定义另一个函数。intmain()intmain()intInsert()intInsert()intQuery()intQuery()intUpdate()intUpdate()intDelete()intDelete()intList(
3、)intList()intSave()intSave()intLoad()intLoad()f1()main()f11()f2()f12()f21()47.1函数式多文件程序结构思考思考1:为什么采用多函数结构?为什么采用多函数结构?请看如下示例:主函数内代码显得非常重复、累赘!57.1函数式多文件程序结构功能为打印i行,j列的星号矩阵定义函数调用函数,打印3行2列调用函数,打印1行6列调用函数,打印4行3列6显然,主函数内代码简单、明了!7.1函数式多文件程序结构函数的作用函数的作用:在程序设计中,在程序设计中,采用采用“自顶向下,逐步求精自顶向下,逐步求精”的思想,将问题的思想,将问题逐逐
4、步分解步分解成若干个独立的成若干个独立的模块模块,每个模块对应个一个,每个模块对应个一个函数函数,如果有相,如果有相应的库函数就使用库函数,没有就自定义函数。应的库函数就使用库函数,没有就自定义函数。函数功能独立函数功能独立可重复调用可重复调用,能提高代码的利用率能提高代码的利用率;函数函数可相互调用可相互调用“组装组装”成程序,成程序,使程序结构清晰,层次分明使程序结构清晰,层次分明;库函数是黑盒子,库函数是黑盒子,不必知道如何设计,不必知道如何设计,只需知道如何使用只需知道如何使用。77.1函数式多文件程序结构思考2:为什么采用多文件结构?当一个文件的代码改变时,只需重新编译该文件不必重新
5、编译全部程序,缩短了编译时间。C语言是以文件为单位进行编译。C语言允许将一个源程序分成若干个文件分别编译、调试,一旦所有文件编译完毕,就可以将它们链接起来,形成完整的目标程序。1 12 23 31 11 12 2+87.1函数式多文件程序结构7.2函数的定义、调用及声明7.2.17.2.1函数函数分类分类 在C语言中,从函数定义的角度看,函数可分为库函数和用户自定义函数两种。(一)(一)库函数库函数 一组由编译系统提供的预先设计并编译好的用来实现各种通用或常用的功能的函数,这些函数根据功能不同被划分在不同的函数库中,称为库函数。详见附录C库函数。例如:printf,scanf,sqrt,pow
6、等(二)(二)用户自定义函数用户自定义函数 用户按需要自行编写具有特定功能的函数,称为用户自定义函数。有无参函数、有参函数两种形式。97.2.27.2.2函数的定义函数的定义 函数类型 函数名(形式参数类型 形式参数名)语句组 花括号“”中包含的声明和功能语句,函数的功能是功能语句来实现。不能省略!形式参数列表函数首部:函数首部:函数类型:函数运算结果的类型(数据类型标识符)。若函数不需要返回值,可指定函数类型为void。函数类型为int时可省略。函数名:用于标记函数的标识符。一个程序中不允许出现同名的函数,函数名不可省略!形式参数列表:用来说明形式参数的类型和名称,()不能省略!7.2函数的
7、定义、调用及声明10函数体:函数体:117.2函数的定义、调用及声明1.有参函数例1:编程实现3!5!8!t=t*j;j+;s=s+t;s=0;j=3真假t=1;j=1;输出s;假s=s+t;j=8t=t*j;j+;真t=1;j=1;假j=5t=t*j;j+;真t=1;j=1;s=s+t;7.2函数的定义、调用及声明求n的阶乘函数名函数体函数返回形式参数名形式参数类型函数类型int fact(intn)intj,t=1;for(j=1;jb?max=a;max=b;maxn)returnm;elsereturnn;求两个数中的大数。137.2函数的定义、调用及声明 例3:用程序实现钻石图案的输
8、出1.有参函数voidprintstar(intn)inti;for(i=1;i=4-n;i+)printf();for(i=1;i=2*n-1;i+)printf(*);printf(n);输出行中空格和*n=1n0输出4-n个空格输出2n-1个*假真开始结束14n+n-2.无参函数7.2函数的定义、调用及声明void disp1(void)printf(*n);printf(*n);printf(*n);printf(*n);printf(*n);void disp0()printf(*n);printf(*n);printf(*n);printf(*n);printf(*n);void
9、disp2()printf(*n);printf(*n);printf(*n);printf(*n);printf(*n);void disp3()printf(*n);printf(*n);printf(*n);printf(*n);printf(*n);157.2函数的定义、调用及声明函数定义时应注意的问题:1.形参类型必须一对一声明函数的定义是独立的,不允许在一个函数体内再定义另一个函数。void类型函数无需返回值,其余函数类型都必须通过return返回函数的运算结果。不论函数的形式参数类型是否相同,都必须一对一声明。如:(float a,float b)不能写成(float a,b)。
10、2.函数的不允许嵌套定义3.return与函数类型的对应16 一个C程序可以包含多个函数,但必必须须包包含含且且只只能能包包含含一一个个main()main()函函数数。程序的执行从main()函数开始,到main()函数结束。程序中的其它函数必须通过main()函数直接或者间接地调用才能执行。函数调用的过程就是主函数执行到调用语句时把实参的值一一传递给对应形参,流程转向被调用函数,执行函数体,执行完毕,流程返回调用处,如有返回值,则带回返回值,主函数继续执行的过程。7.2函数的定义、调用及声明7.2.37.2.3函数的调用函数的调用1.函数调用过程177.2函数的定义、调用及声明函数的调用与
11、返回/*1*/*2*/*3*/*4*/*5*/*11*/*12*/*13*/*14*/*15*/*16*/main()main()int a,b,c;int a,b,c;scanf(%d,%d,&a,&b);scanf(%d,%d,&a,&b);c=c=max(a,b);max(a,b);printf(max=%dn,c);printf(max=%dn,c);int int max(int x,int y)max(int x,int y)int z;int z;if(xy)z=x;if(xy)z=x;else z=y;else z=y;return(z);return(z);保护断点和保护断点
12、和现场,转向现场,转向1111入口入口虚实结合虚实结合a-xa-x,b-yb-y返回断点返回断点恢复现场恢复现场带回函数值带回函数值断点断点18#inclueintfact(intn)intj,t=1;for(j=1;j=n;j+)t*=j;returnt;voidmain()ints=0;s=fact(3)+fact(5)+fact(8);printf(“3!+5!+8!=%dn”,s);7.2.37.2.3函数的调用函数的调用p表达式形式遵循先定义后调用的原则适用于非void类型的函数,函数的返回值参与主调函数中表达式的运算197.2函数的定义、调用及声明2.函数调用形式#included
13、oublemax(doublem,doublen)if(mn)returnm;elsereturnn;voidmain()doublea,b,c;scanf(“%f%f%f”,&a,&b,&c);printf(“max=%f”,max(max(a,b),c);7.2.37.2.3函数的调用函数的调用p参数形式适用于非void类型的函数,函数的返回值在主调函数中作自己或其它函数的实参。207.2函数的定义、调用及声明1#includevoidprintstar(intn)inti;for(i=1;i=4-n;i+)printf();for(i=1;i=2*n-1;i+)printf(*);pri
14、ntf(n);voidmain()inti;for(i=1;i=1;i-)printstar(i);7.2.37.2.3函数的调用函数的调用p语句形式21主要用于void类型的函数非void类型的函数采用语句调用形式将不接受函数的返回值7.2函数的定义、调用及声明7.2函数的定义、调用及声明7.2.47.2.4函数类型与函数的返回值函数类型与函数的返回值 通过return语句返回主调函数的返回值类型应该和函数的类型一致。如果不一致,则返回值类型应转换为函数类型。#include void main()float a=1.5,b=0.5,c;c=max(a,b);printf(“max is%f
15、n”,c);max(float x,float y)float z;z=xy?x:y;return z;运行结果为运行结果为:函数返回值类型缺省了,所以编译器默认为是int,而return语句后的表达式z的值为float,系统自动进行转换,故丢失精度了!原因分析:原因分析:227.2.57.2.5函数的声明函数的声明函数遵循先定义后使用的原则,若先使用后定义必须前向声明。#include float max(float x,float y)float z;z=xy?x:y;return z;void main()float a=1.5,b=0.5,c;c=max(a,b);printf(“ma
16、x is%fn”,c);#include float max(float x,float y)float z;z=xy?x:y;return z;先定义,后使用先声明,后使用void main()float a=1.5,b=0.5,c;c=max(a,b);printf(“max is%fn”,c);float max(float x,float y);237.2函数的定义、调用及声明7.2.57.2.5函数的声明函数的声明 函数声明的作用是把函数名、函数参数的个数和参数类型等信息通知编译系统,以便编译系统识别并检查调用是否合法。u函数声明的形式(1)函数类型函数名(参数类型1,参数名1,参数
17、类型n,参数名n);(2)函数类型函数名(参数类型1,参数类型n,);u函数声明的位置u函数声明的作用主调函数的声明区或所有函数之外的声明区。成熟型稳健型247.2函数的定义、调用及声明若函数返值是char或int型,系统自动按int型处理,无需声明。u函数声明的特例 float max(float x,float y);float max(float,float);7.3函数的参数传递7.3.17.3.1函数间数据传递函数间数据传递u参数:通过形式参数和实际参数u返回值:用return语句返回计算结果在不同的函数之间传递数据,可以使用的方法:形式参数:定义一个有参函数时,函数名后()中的参数
18、称为形式参数,简称形参。例如:int max(int x,int y);调用一个有参函数时,函数名后()中的参数称为实际参数,简称实参。例如:c=max(2,7*5);257.3函数的参数传递7.3.27.3.2函数的参数传递数值函数的参数传递数值 发生函数调用时,根据实参和形参的对应关系,将实参的值单向地传递给形参,供被调函数在执行时使用。在函数执行过程中,对形参做任何修改都不影响实参值。main funcaxby调用函数时3434 main funcaxby调用结束3437定义函数func()intfunc(intx,inty)y=x+y;return(y);在main()函数中执行赋值语
19、句 m=func(a,b);假设主函数中a=3,b=4,如图 形参实参2617.3函数的参数传递main()函数 int a,b;a=5;b=10;swap(a,b);swap(int x,int y)函数 int temp temp=x;语句 x=y;语句 y=temp;语句 510实参变量a实参变量b形参变量x形参变量y复制复制temp=xx=yy=tempswap函数的执行过程和各个变量的变化过程未改变10510调用swap函数执行swap函数执行swap函数执行swap函数5变量temp5277.3函数的参数传递7.3.27.3.2函数的参数传递地址函数的参数传递地址 当形参和实参是数
20、组名时,实参传递给形参的是数组的首地址,形参取得实参的值(地址)后与实参共享同一个数组。voidbubble_sort(intp,intn)inti,j,temp;for(i=0;in-1;i+)for(j=0;jpj+1)temp=pj;pj=pj+1;pj+1=temp;voidmain()inti;inta10=3,5,-6,88,34,76,54,28,22,75;printf(排序前:n);for(i=0;i10;i+)printf(“%d”,ai);printf(“n排序后:n);bubble_sort(a,10);for(i=0;ip2temp=p1;p1=p2;p2=temp;
21、3-63488765488882275p3p4temp=p3;p3=p4;p4=temp;p4p5temp=p4;p4=p5;p5=temp;p5p6temp=p5;p5=p6;p6=temp;p6p7temp=p6;p6=p7;p7=temp;p7p8temp=p7;p7=p8;p8=temp;p8p9temp=p8;p8=p9;p9=temp;p0p1temp=p0;p0=p1;p1=temp;p4p5temp=p4;p4=p5;p5=temp;p5p6temp=p5;p5=p6;p6=temp;76p6p7temp=p6;p6=p7;p7=temp;22767675p7p8temp=p7
22、;p7=p8;p8=temp;p4p5temp=p4;p4=p5;p5=temp;2854p5p6temp=p5;p5=p6;p6=temp;542275p3p4temp=p3;p3=p4;p4=temp;2834p4p5temp=p4;p4=p5;p5=temp;342254p3p4temp=p3;p3=p4;p4=temp;2828222253-6297.3函数的参数传递在函数调用时,实参的值应一一对应地传递给形参,实参与形参的个数应相同,类型应兼容。7.3函数的参数传递7.3.27.3.2函数的参数传递小结函数的参数传递小结形参只有所在函数被调用时才分配内存单元,在调用结束时,即刻释放所
23、分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后,不能再使用该形参。30除了用数组名作为函数形参来实现参数的地址传递以外,还有一种更广的应用那就是用指针变量来作为函数的形参实现地址传递方法,7.4.17.4.1函数的嵌套调用函数的嵌套调用 C语言中,函数之间都是平行的,可以在一个函数中调用另一个函数。当被调函数的定义中又包含了对第三个函数的调用,这就构成了函数的嵌套调用。main main 函数函数 a()a()函数函数 b()b()函数函数调用调用a()a()函数函数 调用调用b()b()函数函数 结束结束执行执行调用调用返回返回返回返回C语言允许函数嵌套调用,不允许
24、函数嵌套定义。调用调用7.4函数的嵌套与递归3117.4函数的嵌套与递归32intdif(intx,inty,intz)return(max(x,y,z)min(x,y,z);intmax(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);intmin(intx,inty,intz)intr;r=xy?x:y;return(rz?r:z);【例例例例】计算三个数中最大数与最小数的差。计算三个数中最大数与最小数的差。#includeintdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1.7-第7章 函数C语言程序设计 1.7 函数 语言程序设计
限制150内