收藏 分销(赏)

第八章函数(很重要)省公共课一等奖全国赛课获奖课件.pptx

上传人:快乐****生活 文档编号:3298605 上传时间:2024-06-29 格式:PPTX 页数:107 大小:858.93KB
下载 相关 举报
第八章函数(很重要)省公共课一等奖全国赛课获奖课件.pptx_第1页
第1页 / 共107页
第八章函数(很重要)省公共课一等奖全国赛课获奖课件.pptx_第2页
第2页 / 共107页
第八章函数(很重要)省公共课一等奖全国赛课获奖课件.pptx_第3页
第3页 / 共107页
第八章函数(很重要)省公共课一等奖全国赛课获奖课件.pptx_第4页
第4页 / 共107页
第八章函数(很重要)省公共课一等奖全国赛课获奖课件.pptx_第5页
第5页 / 共107页
点击查看更多>>
资源描述

1、第八章第八章 函数函数(很主要)(很主要)第1页主要内容o 8.8.1 1 概述概述 o 8.8.函数定义普通形式函数定义普通形式o 8.8.函数参数和函数值函数参数和函数值o 8.8.函数调用函数调用 o 8.8.函数嵌套调用函数嵌套调用o 8.8.函数递归调用函数递归调用 o 8.8.数组作为函数参数数组作为函数参数o 8.8.8 8 局部变量和全局变量局部变量和全局变量o 8.8.变量存放类别变量存放类别 o 8.10 8.10 内部函数和外部函数内部函数和外部函数o 练习练习8 8 函数概念函数概念函数概念函数概念 函数定义与调用函数定义与调用函数定义与调用函数定义与调用 函数递归调用

2、函数递归调用函数递归调用函数递归调用 变量作用域变量作用域变量作用域变量作用域 函数作用域函数作用域函数作用域函数作用域第2页按功效划分模块按功效划分模块 可读性和可了解性都比很好可读性和可了解性都比很好可读性和可了解性都比很好可读性和可了解性都比很好 可验证性比很好可验证性比很好可验证性比很好可验证性比很好 可重组性比很好可重组性比很好可重组性比很好可重组性比很好o模模块化程序化程序设计基本概念基本概念n模模块化程序化程序设计是指把一个大程序按人是指把一个大程序按人们能了解大能了解大小小规模模进行分解。行分解。8.1 概述 第3页oC是模是模块化程序化程序设计语言言C C程序结构程序结构第4

3、页n一个一个较大程序可分大程序可分为若干个程序模若干个程序模块,每一个模,每一个模块用来用来实现一一个特定功效个特定功效n在高在高级语言中用子程序言中用子程序实现模模块功效。子程序由函数来完成功效。子程序由函数来完成n一个程序可由一个主函数和若干个其它函数一个程序可由一个主函数和若干个其它函数组成成n函数是函数是C语言程序中最小言程序中最小结构化模构化模块n一个函数将一个函数将实现一个功效,函数是一个功效,函数是经过调用被用被执行行n函数函数间调用关系用关系o由主函数由主函数调用其它函数,其它函数也能用其它函数,其它函数也能够相互相互调用。同一用。同一个函数能个函数能够被一个或多个函数被一个或

4、多个函数调用任意屡次用任意屡次n一个函数在一个函数在调用之前,必用之前,必须先定先定义,有,有时还要要对已定已定义函数函数进行行说明明n一个一个C程序必程序必须有且只能有一个名有且只能有一个名为main主函数主函数nC程序程序执行行总是从是从main函数开始,在函数开始,在main中中结束束第5页函数间调用函数间调用第6页例例8.18.1 函数调用简单例子函数调用简单例子#include void main()void printstar();/*对对printstar函数申明函数申明*/void print_message();/*对对print_message函数申明函数申明*/print

5、star();*调用调用printstar函数函数*print_message();/*调用调用print_message函数函数*/printstar();*调用调用printstar函数函数*/第7页void printstar()*定义定义printstar函数函数*printf(*n);void print_message()*定义定义print_message函数函数*printf(How do you do!n);运行情况以下:运行情况以下:*How do you do!How do you do!*第8页o 说明明o (1)一个程序由一个或多个程序模一个程序由一个或多个程序模块组

6、成,成,每一个程序模每一个程序模块作作为一个源程序文件。一个源程序文件。对于于较大程序,通常将程序内容分大程序,通常将程序内容分别放在若干个源文放在若干个源文件中,再由若干源程序文件件中,再由若干源程序文件组成一个成一个C程序。程序。这么便于分么便于分别编写、分写、分别编译,提高,提高调试效率。效率。一个源程序文件可一个源程序文件可认为多个多个C程序公用。程序公用。o (2)一个源程序文件由一个或多个函数以及其一个源程序文件由一个或多个函数以及其他有关内容(如命令行、数据定他有关内容(如命令行、数据定义等)等)组成。成。一个源程序文件是一个一个源程序文件是一个编译单位,在程序位,在程序编译时是

7、以源程序文件是以源程序文件为单位位进行行编译,而不是以,而不是以函数函数为单位位进行行编译。o (3)程序程序执行是从行是从main函数开始,如果在函数开始,如果在main函数中函数中调用其他函数,在用其他函数,在调用后流程返回用后流程返回到到main函数,在函数,在main函数中函数中结束整个程序运束整个程序运行。行。第9页(4)全部函数都是平行,即在定全部函数都是平行,即在定义函数函数时是分是分别进行,行,是相互独立。一个函数并不隶属于另一函数,即函是相互独立。一个函数并不隶属于另一函数,即函数不能嵌套定数不能嵌套定义。函数。函数间能能够相互相互调用,但不能用,但不能调用用main函数。函

8、数。main函数是系函数是系统调用。用。(5)从用从用户使用角度看,函数有两种:使用角度看,函数有两种:标准函数,即准函数,即库函数。函数。这是由系是由系统提供,用提供,用户无无须自己定自己定义这些函数,能些函数,能够直接使用它直接使用它们。不一。不一样C系系统提供提供库函数数量和功效会有一些不一函数数量和功效会有一些不一样,但,但许多基本函数是共同。多基本函数是共同。用用户自己定自己定义函数。用以函数。用以处理用理用户专门需要。需要。第10页(6)从函数形式看,函数分两从函数形式看,函数分两类:无参函数。无参函数普通用来无参函数。无参函数普通用来执行指定一行指定一组操作。操作。在在调用无参函

9、数用无参函数时,主,主调函数不向被函数不向被调用函数用函数传递数据。数据。有参函数。主有参函数。主调函数在函数在调用被用被调用函数用函数时,经过参参数向被数向被调用函数用函数传递数据。数据。第11页8.函数定义普通形式 函数头函数头函数体函数体函数类型函数类型 函数名()函数名()申明部分申明部分语句部分语句部分正当标识符正当标识符存放类和数存放类和数据类型据类型o8.2.1 无参函数定义普通格式无参函数定义普通格式数据类型数据类型:指该函数返回值类型,函数无返回值时用指该函数返回值类型,函数无返回值时用void第12页o8.2.2 有参函数定有参函数定义普通形式普通形式 函数类型函数类型 函

10、数名(形式参数表列)函数名(形式参数表列)说明部分说明部分语句部分语句部分方法方法1:int max(int x,int y)方法方法2:int max(x,y)int x,y;第13页o8.2.3 空函数空函数 n定定义空函数普通形式空函数普通形式为:类型型标识符函数名()符函数名()n主主调函数函数调用空函数用空函数时,只表明,只表明这里要里要调用一个函用一个函数,但函数本身什么工作也不做数,但函数本身什么工作也不做,以后以后扩充函数功效充函数功效时补充上充上第14页n函数定函数定义举例例例例 1 有参函数有参函数 int max(int x,int y)int z;z=xy?x:y;re

11、turn(z);或或double max(x,y)double x,y;double d;d=xy?x:y;return d;例例2 无参函数无参函数 void printstar()printf(“*n”);或或 void printstar(void)printf(“*n”);例例 空函数空函数 dummy()函数体为空,函数体为空,最简单函数最简单函数函数名下行给出函数名下行给出参数数据类型参数数据类型在括号内函数参在括号内函数参数名前给出参数数名前给出参数数据类型数据类型第15页8.函数参数和函数值 o 8.8.形式参数和实际参数形式参数和实际参数 n大多数情况下,主大多数情况下,主调

12、函数和被函数和被调用函数之用函数之间有数据有数据传递关系关系n形式参数形式参数o定定义函数函数时函数名后面括号中函数名后面括号中变量名称量名称为“形式参数形式参数”(简称称“形参形参”)n实际参数参数o主主调函数中函数中调用一个函数用一个函数时,函数名后面括号中参数,函数名后面括号中参数(能能够是一个表示式是一个表示式)称称为“实际参数参数”(简称称“实参参”)n函数返回函数返回值oreturn后面括号中后面括号中值作作为函数函数带回回值(称函数返回(称函数返回值)第16页c=max(a,b);(main 函数)函数)(max 函数)函数)max(int x,int y)int z;z=xy?

13、x:y;return(z);#include void main()int max(int x,int y);int a,b,c;scanf(%d,%d,&a,&b);c=max(a,b);printf(Max is%d,c);int max(int x,int y)int z;z=xy?x:y;return(z);形参形参实参实参例例8.2 8.2 调用函数时数据传递:比较两个数并输出大者调用函数时数据传递:比较两个数并输出大者运行情况以下:运行情况以下:,经过函数调用,可使两个函数中数据发生联络。经过函数调用,可使两个函数中数据发生联络。第17页关于形参加实参说明:关于形参加实参说明:(1

14、 1)在定义函数中指定形参,在未出现函在定义函数中指定形参,在未出现函数调用时,它们并不占内存中存放单元。只数调用时,它们并不占内存中存放单元。只有在发生函数调用时,函数有在发生函数调用时,函数maxmax中形参才被分中形参才被分配内存单元。在调用结束后,形参所占内存配内存单元。在调用结束后,形参所占内存单元也被释放。单元也被释放。(2 2)实参能够是常量、变量或表示式,实参能够是常量、变量或表示式,比如:比如:maxmax(,);(,);但要求它们有确定值。在调用时将实参值赋但要求它们有确定值。在调用时将实参值赋给形参。给形参。第18页(3 3)在被定义函数中,必须指定形参类型。)在被定义函

15、数中,必须指定形参类型。(4 4)实参加形参类型应相同或赋值兼容。)实参加形参类型应相同或赋值兼容。(5 5)值传递)值传递:实参向形参数据传递是单向实参向形参数据传递是单向“值传递值传递”,只能由实参传给形参,而不,只能由实参传给形参,而不能由形参传回来给实参。能由形参传回来给实参。在调用函数时,给形参分配存放单元,在调用函数时,给形参分配存放单元,并将实参对应值传递给形参,调用结束后,并将实参对应值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持形参单元被释放,实参单元仍保留并维持原值。原值。第19页o8.3.2 函数返回函数返回值n函数返回函数返回值是是经过函数函数调用使主用

16、使主调函数得到确函数得到确实定定值n比如比如:例例8.中,中,max(,)(,)值是,是,max(,)(,)值是是5。赋值语句将句将这个函数个函数值赋给变量量第20页oC C语言中,函数返回值是经过带有表示式返回语句来实现语言中,函数返回值是经过带有表示式返回语句来实现,函数返回函数返回值是函数之间信息交换一个伎俩。值是函数之间信息交换一个伎俩。o普通格式:普通格式:return return ;或或 return(return();或或 return;return;带有表示式返回语句详细实现过程以下:带有表示式返回语句详细实现过程以下:(1 1)先计算)先计算returnreturn语句中语

17、句中 值。值。(2 2)依据函数数据类型对)依据函数数据类型对 类型进行转换,将类型进行转换,将 类型转类型转换为函数数据类型。换为函数数据类型。(3 3)将)将 转换后值和类型返回给调用函数。转换后值和类型返回给调用函数。(4 4)将程序流控制权交给调用函数,执行其后语句。)将程序流控制权交给调用函数,执行其后语句。v不带有表示式返回语句,只执行步骤(不带有表示式返回语句,只执行步骤(4 4),其它步骤将不执行。),其它步骤将不执行。比如比如:(int,int)return(?:););第21页说明:说明:(1 1)函数返回值是经过函数中)函数返回值是经过函数中returnreturn语句取

18、得。语句取得。一个函数中能够有一个以上一个函数中能够有一个以上return语句,执行到哪一个语句,执行到哪一个return语句,哪一个语句起作用。语句,哪一个语句起作用。假如一个函数中无假如一个函数中无return语句,该函数体右花括号含有语句,该函数体右花括号含有return语句作用。语句作用。(2 2)函数返回值应该属于某一个确定类型,在定义函数时指定)函数返回值应该属于某一个确定类型,在定义函数时指定函数返回值类型。函数返回值类型。比如比如:下面是下面是3个函数首行:个函数首行:int max(float,float)/*函数值为整型函数值为整型*/char letter(char c1

19、,char c2)/函数值为字符型函数值为字符型 double min(int,int)/函数值为双精度型函数值为双精度型 注意:注意:凡不加类型说明函数,自动按整型处理。凡不加类型说明函数,自动按整型处理。第22页(3 3)在定义函数时指定函数类型普通应该和)在定义函数时指定函数类型普通应该和returnreturn语句中表示语句中表示式类型一致。式类型一致。假如函数值类型和假如函数值类型和return语句中表示式值不一致,则以语句中表示式值不一致,则以函数类型为准。函数类型为准。(切记切记!)对数值型数据,能够自动进行类型转换。即函数类型决定对数值型数据,能够自动进行类型转换。即函数类型决

20、定返回值类型。返回值类型。(4 4)对于不带回值函数,应该用)对于不带回值函数,应该用“void”void”定义函数为定义函数为“无类型无类型”(或称(或称“空类型空类型”)。)。此时在函数体中不得出现此时在函数体中不得出现returnreturn语句语句。第23页例例 有返回值函数有返回值函数 int max(int x,int y)int z;z=xy?x:y;return(z);例例 无返回值函数无返回值函数 void swap(int x,int y)int temp;temp=x;x=y;y=temp;无无return语句语句第24页例例A8.1A8.1 一个没有返回值函数一个没有返

21、回值函数#includevoid printstart(int,char);void main()int n;char ch;printf(Input n:);scanf(%d,&n);printf(Input char:);scanf(%c,&ch);printf(n);printstart(n,ch);void printstart(int n,char c)int i,j;for(i=1;i=i;j-)printf();for(j=1;j=2*i-1;j+)printf(%c,c);printf(n);return;运行结果:运行结果:分析、分析、思索思索?!第25页8.函数调用 o8.

22、4.1 函数函数调用普通形式用普通形式n概念概念oC语言程序言程序实际上是函数串上是函数串o一个完整一个完整C程序能程序能够由若干个函数由若干个函数组成,其中必成,其中必须有一有一个且只能有一个主函数个且只能有一个主函数main()。C程序程序总是从主函数是从主函数开始开始执行行(不不论它在程序中什么位置它在程序中什么位置),而其它函数只能,而其它函数只能被被调用用o一个完整一个完整C程序中全部函数能程序中全部函数能够放在一个文件中,也能放在一个文件中,也能够放在多个文件中放在多个文件中oC语言中函数没有隶属关系,各函数之言中函数没有隶属关系,各函数之间相互独立,能相互独立,能够相互相互调用。

23、用。C函数不能嵌套定函数不能嵌套定义第26页n函数函数调用普通形式用普通形式说明说明:(1 1)假如是调用无参函数,则假如是调用无参函数,则“实参表列实参表列”能够没有,但括弧能够没有,但括弧不能省略。不能省略。(2 2)假如实参表列包含多个实参,则各参数间用逗号隔开。实假如实参表列包含多个实参,则各参数间用逗号隔开。实参加形参个数应相等,类型应匹配。实参加形参按次序对应,参加形参个数应相等,类型应匹配。实参加形参按次序对应,一一传递数据。一一传递数据。(3 3)假如实参表列包含多个实参,对实参求值次序并不是确定,)假如实参表列包含多个实参,对实参求值次序并不是确定,有系统按自左至右次序求实参

24、值,有系统则按自右至左次序。有系统按自左至右次序求实参值,有系统则按自右至左次序。函数名(实参表);注意:实参加形参个数相等,类型一致,按次序一一对应第27页例 8.4 实参求值次序#include void main()int f(int a,int b);/*函数申明函数申明*/int i=2,p;p=f(i,+i);/*函数调用函数调用*/printf(%dn,p);int f(int a,int b)/*函数定义函数定义*/int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);第28页假如按自左至右次序求假如按自左至右次序求实参值,则函

25、数调用相实参值,则函数调用相当于(,)当于(,)假如按自右至左次序求实假如按自右至左次序求实参值,则函数调用相当于参值,则函数调用相当于(3,),)对于函数调用对于函数调用 int i=2,p;p=f(i,+i);注意:注意:尽可能防止轻易引发歧义写法尽可能防止轻易引发歧义写法第29页o8.4.2 函数函数调用方式用方式函数语句函数语句 把函数调用作为一个语句。这时不要求函数带回值,只把函数调用作为一个语句。这时不要求函数带回值,只要求函数完成一定操作。要求函数完成一定操作。例例 printstar();printf(“Hello,World!n”);函数表示式函数表示式 函数出现在一个表示式

26、中,这种表示式称为函数表示式。函数出现在一个表示式中,这种表示式称为函数表示式。这时要求函数带回一个确定值以参加表示式运算。这时要求函数带回一个确定值以参加表示式运算。比如比如:*(,);(,);第30页函数参数函数参数函数调用作为一个函数实参。函数调用作为一个函数实参。比如比如:m=max(a,max(b,c);其中其中max(b,c)是一次函数调用,它值作为是一次函数调用,它值作为max另一次调用实参。另一次调用实参。m值是值是a、b、c三者中最大者。三者中最大者。第31页o8.4.3 对被被调用函数申明和函数原型用函数申明和函数原型1.1.首先被调用函数必须是已经存在函数(是库函数或用户

27、首先被调用函数必须是已经存在函数(是库函数或用户自己定义函数)。但光有这一条件还不够。自己定义函数)。但光有这一条件还不够。3.3.假如使用用户自己定义函数,而该函数位置在调用它函假如使用用户自己定义函数,而该函数位置在调用它函数(即主调函数)后面,应该在主调函数中对被调用函数数(即主调函数)后面,应该在主调函数中对被调用函数作申明。作申明。2.2.假如使用库函数,还应该在本文件开头用假如使用库函数,还应该在本文件开头用#include#include 命令命令将调用相关库函数时所需用到信息将调用相关库函数时所需用到信息“包含包含”到本文件中来。到本文件中来。第32页函数原型普通形式为函数原型

28、普通形式为:1.1.函数类型函数类型 函数名函数名(参数类型参数类型1 1,参数类型,参数类型2)2);2.2.函数类型函数类型 函数名函数名(参数类型参数类型1 1 参数名参数名1 1,参数类型,参数类型2 2参数名参数名2)2);申明作用是把函数名、函数参数个数和参数类型等信申明作用是把函数名、函数参数个数和参数类型等信息通知编译系统,方便在碰到函数调用时,编译系统能正息通知编译系统,方便在碰到函数调用时,编译系统能正确识别函数并检验调用是否正当。确识别函数并检验调用是否正当。第33页注意:注意:函数函数“定义定义”和和“申明申明”区分:区分:p 函数定义是指对函数功效确实立,包含指定函函

29、数定义是指对函数功效确实立,包含指定函数名,函数值类型、形参及其类型、函数体等,数名,函数值类型、形参及其类型、函数体等,它是一个完整、独立函数单位。它是一个完整、独立函数单位。p 函数申明作用则是把函数名字、函数类型以及函数申明作用则是把函数名字、函数类型以及形参类型、个数和次序通知编译系统,方便在调形参类型、个数和次序通知编译系统,方便在调用该函数时系统按此进行对照检验。用该函数时系统按此进行对照检验。第34页o函数申明方法函数申明方法n在程序中,要在程序中,要调用函数先要定用函数先要定义好(好(编程者或系程者或系统已定已定义),定),定义好函数,在好函数,在调用前通常用前通常还需要需要说

30、明。明。o作用:告作用:告诉编译系系统函数函数类型、参数个数及型、参数个数及类型,方便型,方便检验n关于函数关于函数说明分明分为以下以下3 3种情况:种情况:o必必须说明:函数定明:函数定义在后,在后,调用在前,而且函数定用在前,而且函数定义时有数据有数据类型型说明明时o无无须说明:当函数在定明:当函数在定义时省略了数据省略了数据类型型说明明o可可说明也可不明也可不说明:函数定明:函数定义在前,在前,调用在后,通常不用在后,通常不说明明n函数定函数定义与函数与函数说明不一明不一样n函数函数说明位置:程序数听明位置:程序数听说明部分(函数内或外)明部分(函数内或外)第35页n两种函数两种函数说明

31、方法明方法o简单说明方法明方法n ();类型:包含存放型:包含存放类和数据和数据类型型说明符,与定明符,与定义时同同无无须给出函数参数及其出函数参数及其类型型比如:比如:double max();double max(x,y)double x,y;double d;d=xy?x:y;return d;简单说明简单说明第36页o原型原型说明方法(明方法(VC+6.0要求)要求)();n类型:包含存放型:包含存放类和数据和数据类型型说明符,与定明符,与定义时同同n参数参数类型型说明表明表给出全部参数出全部参数类型和名称,多个参数用逗号分隔型和名称,多个参数用逗号分隔也可省略参数名称,但要用参数也可

32、省略参数名称,但要用参数类型表示出参数个数型表示出参数个数比如:比如:double max(double x,double y);/double max(double,double);double max(x,y)double x,y;double d;d=xy?x:y;return d;原型说明原型说明函数说明能够放在函数说明能够放在 调用函数函调用函数函数体内,数体内,也可放在调用函数函数体外,也可放在调用函数函数体外,函数说明语句中还能够会有相函数说明语句中还能够会有相同类型变量,即可一起说明同类型变量,即可一起说明第37页n例例 函数函数说明明举例例#include void main

33、();/*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(float,float)float add(float x,float y)可不能够可不能够?第38页#include float add(float x,float y)float z;z=x+y;return(z);void main()float a,b,c;scanf(%f,%f,&a,&b);

34、c=add(a,b);printf(sum is%f,c);被调函数出现在被调函数出现在主调函数之前,主调函数之前,无须函数说明无须函数说明第39页上节小结第40页B8.1.1.c:#includevoid main()printf(“area=%lfn“,3.24*3.24*3.14);printf(“area=%lfn“,2.137*2.137*3.14);printf(“area=%lfn“,0.865*0.865*3.14);printf(“area=%lfn“,12.64*12.64*3.14);B8.1B8.1 (B8.1.c)假设有一批圆盘,需要求它们面积。这些圆盘半径分别是:假

35、设有一批圆盘,需要求它们面积。这些圆盘半径分别是:3.24、2.137、0.865、12.64。编程要求(用。编程要求(用2种方式):种方式):用一个主函数实现(用一个主函数实现(B8.1.1.c)写一个求面积函数供主函数调用(写一个求面积函数供主函数调用(B8.1.2.c)或者:或者:double x,area;for(i=1;i=4;i+)scanf(“%lf”,&x);area=x*x*3.14;printf(“area=%lfn“,area);思索:思索:对吗?对吗?问题:问题:重复代码、易错、难复用重复代码、易错、难复用 -引入软件构件思想引入软件构件思想第41页B8.1.2.c:#

36、includedouble c_area(double x)return x*x*3.14;void main()printf(“area=%lfn“,c_area(3.24);printf(“area=%lfn“,c_area(2.137);printf(“area=%lfn“,c_area(0.865);printf(“area=%lfn“,c_area(12.64);或者:或者:#includedouble c_area(double x)return x*x*3.14;void main()double x,area;for(i=1;i=4;i+)area=c_area(x);prin

37、tf(“area=%lfn“,area);自定义函数,自定义函数,功效:求圆面积功效:求圆面积函数调用函数调用第42页#include void main()int x=7,y=11;printf(x=%d,ty=%dn,x,y);printf(swapped:n);swap(x,y);printf(x=%d,ty=%dn,x,y);swap(int a,int b)int temp;temp=a;a=b;b=temp;711x:y:调用前:调用前:调用结束:调用结束:711x:y:调用:调用:711a:b:711x:y:swap:711x:y:117a:b:temp例A8.2 交换两个数,用

38、函数调用思索?思索?第43页o概念概念n指在被指在被调函数中函数中还可可调用另外一个函数用另外一个函数nC语言中不限制嵌套言中不限制嵌套调用用级别,但嵌套次数越多,但嵌套次数越多,执行效率越低行效率越低main()调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数b调用函数调用函数cc函数函数嵌套调用过程嵌套调用过程 8.函数嵌套调用第44页例A8.3 分析以下程序输出结果,从输出信息中掌握函数嵌套调用执行过程#includevoid A();void B();void C();void main()printf(Im in main().n);A();printf(Im fina

39、lly back in main().n);void C()printf(And now,Im in C().n);void A()printf(Now,Im in A().n);B();printf(Here,Im back in A().n);void B()printf(Now,Im in B().n);C();printf(back in b().n);运行结果:运行结果:第45页例A8.4 求三个数中最大数和最小数差值#include int dif(int x,int y,int z);int max(int x,int y,int z);int min(int x,int y,i

40、nt z);void main()int a,b,c,d;scanf(%d%d%d,&a,&b,&c);d=dif(a,b,c);printf(Max-Min=%dn,d);int dif(int x,int y,int z)return max(x,y,z)-min(x,y,z);int max(int x,int y,int z)int r;r=xy?x:y;return(rz?r:z);int min(int x,int y,int z)int r;r=xy?x:y;return(rz?r:z);main()调用函数调用函数dif输出输出结束结束dif函数函数max函数函数调用函数调用函

41、数max调用函数调用函数minmin函数函数第46页例例A8.5 A8.5 要求编写计算要求编写计算x x立方函数供主函数调用立方函数供主函数调用#include float a,product;printf(Please input value of a:);scanf(%f,&a);product=cube(a);printf(”Cube of%.4f is%.4fn,a,product);return(x*x*x);float xxaproduct1.21.21.728 void main()float cube()注意函数调用注意函数调用编写形式编写形式第47页例例A8.6 A8.6

42、编程求出下式值。编程求出下式值。1 1k k+2+2k k+3+3k k+n+nk k (假定假定k=3,n=5)k=3,n=5)#include#define K 3#define N 5void main()int sum(int,int);printf(Sum of%dth powers of integers from 1 to%d=,K,N);printf(%dn,sum(K,N);int sum(int k,int n)int power(int,int);int i,s=0;for(i=1;i=n;i+)s+=power(i,k);return s;int power(int m

43、,int n)int i,p=1;for(i=1;i=n;i+)p*=m;return p;第48页 8.6 函数递归调用函数递归调用 o定定义:在:在调用一个函数用一个函数过程中出程中出现直接或直接或间接接调用用该函数本身叫函数函数本身叫函数递归调用用f()调调f调调f2调调f1f1()f2()int f(int x)int y,z;z=f(y);.return(2*z);int f1(int x)int y,z;z=f2(y);.return(2*z);int f2(int t)int a,c;c=f1(a);.return(3+c);直接调用直接调用间接调用间接调用第49页n能能够使用使

44、用递归两个条件:两个条件:o原原问题能能够化化为新新问题,而且新,而且新问题与原与原问题处理方法理方法相同。相同。o经过有限次化分,最有限次化分,最终问题是已知。是已知。举例:使用递归算法经典例子举例:使用递归算法经典例子-求求5 5!5 5!能够化为!能够化为5*45*4!4 4!能够化为!能够化为4*34*3!3 3!能够化为!能够化为3*23*2!2 2!能够化为!能够化为2*12*1!1 1!能够化为!能够化为1*01*0!0 0!=1 5=1 5!=5*4*3*2*1=5*4*3*2*1,即,即120 120 递归算法特点:递归算法特点:1、使用递归算法编、使用递归算法编写程序简练清

45、楚,写程序简练清楚,可读性强。可读性强。2、使用递归算法编、使用递归算法编写程序运行起来开写程序运行起来开销比较大。销比较大。第50页n递归调用用过程程5!=5*4!4!=4*3!3!=3*2!2!=2*1!1!=1*0!2!=2*1!=23!=3*2!=64!=4*3!=245!=5*4!=120第一阶段:“递推”第二阶段:“回归”0!=11!=1*0!=1递推递推递推递推递推回归回归回归回归回归已知递归过程是递推过程和回归过程合成第51页例例8.8 用递归算法编程求某个正整数阶乘。用递归算法编程求某个正整数阶乘。P173 int fac(int n)int f;if(n0)printf(n

46、0,data error!);else if(n=0)f=1;else f=fac(n-1)*n;return(f);#include int fac(int n);void main()int n,y;printf(Input a integer number:);scanf(%d,&n);y=fac(n);printf(%d!=%15d,n,y);第52页例A8.7 用递归算法编程输出打印以下所表示图案#includevoid fun(char c1,char c2)if(c1=c2)printf(%c,c1);return;else printf(%c,c1);fun(c1+1,c2);

47、printf(%c,c1);void main()int i,j,n=5;for(i=1;i=n;i+)for(j=1;jbi6次,biai3次,其中i每次为不一样值),则认为a数组大于b数组,并分别统计出两个数组对应元素大于、等于、小于次数。第55页#include void main()()int large(int x,int y);/*函数申明函数申明*/int 10,10,i,n=0,m=0,k=0;printf(enter array a n);for(i=0;i10;i+)scanf(%d,&ai);printf(n);printf(enter array n);for(i=0;

48、i10;i+)scanf(%d,&bi);printf(n);for(i=0;ibi%d timesnai=bi%d timesnaik)printf(array a is larger than array bn);else if(ny)flag1;else if(xy)flag-1;else flag;return(flag);第57页运行情况以下:运行情况以下:enter array aenter array a:5 3 8 9 1 3 5 6 0 45 3 8 9 1 3 5 6 0 4 array a is smaller than array barray a is smaller

49、 than array b第58页o 8.7.2 数数组名作函数参数名作函数参数 n用数用数组名作函数参数名作函数参数时,此,此时形参形参应该用数用数组名或名或用指用指针变量量。(见第十章第十章)n把把实参数参数组首元素地址首元素地址传递给形参,两个数形参,两个数组共占共占用同一段内存用同一段内存单元,不是把数元,不是把数组元素元素值传递给形参形参(注意与(注意与变量作函数参数情况不一量作函数参数情况不一样)n在主在主调函数与被函数与被调函数分函数分别定定义数数组,且且类型型应一致一致n一一维形参数形参数组大小大小(多多维数数组第一第一维)可不指定可不指定n形参数形参数组名是地址名是地址变量量

50、第59页#include void main()()float average(float array10);/函数申明函数申明 float score10,aver;int;printf(input scores:););for(;)(;)scanf(,score););printf(););averaverage(score););printf(average score is.n);ver););实参用数组名实参用数组名例8.11 有一个一维数组score,内放10个学生成绩,求平均成绩。float average(float array10)int;float aver,;,;for

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服