收藏 分销(赏)

C语言用函数实现模块化程序设计省公共课一等奖全国赛课获奖课件.pptx

上传人:a199****6536 文档编号:4153713 上传时间:2024-08-05 格式:PPTX 页数:228 大小:2.56MB
下载 相关 举报
C语言用函数实现模块化程序设计省公共课一等奖全国赛课获奖课件.pptx_第1页
第1页 / 共228页
C语言用函数实现模块化程序设计省公共课一等奖全国赛课获奖课件.pptx_第2页
第2页 / 共228页
C语言用函数实现模块化程序设计省公共课一等奖全国赛课获奖课件.pptx_第3页
第3页 / 共228页
C语言用函数实现模块化程序设计省公共课一等奖全国赛课获奖课件.pptx_第4页
第4页 / 共228页
C语言用函数实现模块化程序设计省公共课一等奖全国赛课获奖课件.pptx_第5页
第5页 / 共228页
点击查看更多>>
资源描述

1、第第7章章 用函数实现模块化程序设计用函数实现模块化程序设计7.1为何要用函数为何要用函数7.2怎样定义函数怎样定义函数7.3调用函数调用函数7.4对被调用函数申明和函数原型对被调用函数申明和函数原型7.5函数嵌套调用函数嵌套调用7.6函数递归调用函数递归调用7.7数组作为函数参数数组作为函数参数7.8局部变量和全局变量局部变量和全局变量7.9变量存放方式和生存期变量存放方式和生存期7.10关于变量申明和定义关于变量申明和定义7.11内部函数和外部函数内部函数和外部函数第1页7.1为何要用函数为何要用函数问题:问题:u假如程序功效比较多,规模比较大,把全部代码假如程序功效比较多,规模比较大,把

2、全部代码都写在都写在main函数中,就会使主函数变得庞杂、函数中,就会使主函数变得庞杂、头绪不清,阅读和维护变得困难头绪不清,阅读和维护变得困难u有时程序中要屡次实现某一功效,就需要屡次重有时程序中要屡次实现某一功效,就需要屡次重复编写实现此功效程序代码复编写实现此功效程序代码,这使程序冗长,不这使程序冗长,不精炼精炼第2页7.1为何要用函数为何要用函数处理方法:用处理方法:用模块化程序设计思绪模块化程序设计思绪u采取采取“组装组装”方法简化程序设计过程方法简化程序设计过程u事先编好一批实现各种不一样功效函数事先编好一批实现各种不一样功效函数u把它们保留在函数库中把它们保留在函数库中,需要时需

3、要时直接用直接用第3页7.1为何要用函数为何要用函数处理方法:用处理方法:用模块化程序设计思绪模块化程序设计思绪u函数就是功效函数就是功效u每一个函数用来实现一个特定功效每一个函数用来实现一个特定功效u函数名字应反应其代表功效函数名字应反应其代表功效第4页7.1为何要用函数为何要用函数在设计一个较大程序时,往往把它分为若干个程序模在设计一个较大程序时,往往把它分为若干个程序模块,每一个模块包含一个或多个函数,每个函数实现块,每一个模块包含一个或多个函数,每个函数实现一个特定功效一个特定功效程序可由一个主函数和若干个其它函数组成程序可由一个主函数和若干个其它函数组成主函数调用其它函数,其它函数也

4、能够相互调用主函数调用其它函数,其它函数也能够相互调用同一个函数能够被一个或多个函数调用任意屡次同一个函数能够被一个或多个函数调用任意屡次第5页7.1为何要用函数为何要用函数mainabcfghdeie第6页7.1为何要用函数为何要用函数能够使用库函数能够使用库函数能够使用自己编写函数能够使用自己编写函数在程序设计中要善于利用函数,能够降低在程序设计中要善于利用函数,能够降低重复编写程序段工作量,同时能够方便地重复编写程序段工作量,同时能够方便地实现模块化程序设计实现模块化程序设计第7页7.1为何要用函数为何要用函数例例7.1输出以下结果,用函数调用实现。输出以下结果,用函数调用实现。*How

5、doyoudo!*第8页7.1为何要用函数为何要用函数解题思绪:解题思绪:u在输出文字上下分别有一行在输出文字上下分别有一行“*”号,显然无须号,显然无须重复写这段代码,用一个函数重复写这段代码,用一个函数print_star来实来实现输出一行现输出一行“*”号功效。号功效。u再写一个再写一个print_message函数来输出中间一函数来输出中间一行文字信息行文字信息u用主函数分别调用这两个函数用主函数分别调用这两个函数第9页#includeintmain()voidprint_star();voidprint_message();print_star();print_message();p

6、rint_star();return0;voidprint_star()printf(“*n”);voidprint_message()printf(“Howdoyoudo!n”);输出输出16个个*输出一行文字输出一行文字第10页#includeintmain()voidprint_star();voidprint_message();print_star();print_message();print_star();return0;voidprint_star()printf(“*n”);voidprint_message()printf(“Howdoyoudo!n”);申明函数申明函数定

7、义函数定义函数第11页#includeintmain()voidprint_star();voidprint_message();print_star();print_message();print_star();return0;voidprint_star()printf(“*n”);voidprint_message()printf(“Howdoyoudo!n”);第12页说明:说明:(1)一个程序由一个或多个程序模块组一个程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。成,每一个程序模块作为一个源程序文件。对较大程序,一般不希望把全部内容全放对较大程序,一般不希望把全部内

8、容全放在一个文件中,而是将它们分别放在若干在一个文件中,而是将它们分别放在若干个源文件中,由若干个源程序文件组成一个源文件中,由若干个源程序文件组成一个个C程序。这么便于分别编写、分别编译,程序。这么便于分别编写、分别编译,提高调试效率。一个源程序文件可认为多提高调试效率。一个源程序文件可认为多个个C程序共用。程序共用。第13页说明:说明:(2)一个源程序文件由一个或多个函数以及其一个源程序文件由一个或多个函数以及其它相关内容(如预处理指令、数据申明与定义它相关内容(如预处理指令、数据申明与定义等)组成。一个源程序文件是一个编译单位,等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程

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

10、,即函数不能嵌套定义。函数间能够相互调用,但不能调用相互调用,但不能调用main函数。函数。main函函数是被操作系统调用。数是被操作系统调用。第16页说明:说明:(5)从用户使用角度看,函数有两种。从用户使用角度看,函数有两种。u库函数,它是由系统提供,用户无须自己定义库函数,它是由系统提供,用户无须自己定义而直接使用它们。应该说明,不一样而直接使用它们。应该说明,不一样C语言编语言编译系统提供库函数数量和功效会有一些不一样,译系统提供库函数数量和功效会有一些不一样,当然许多基本函数是共同。当然许多基本函数是共同。u用户自己定义函数。它是用以处理用户专门需用户自己定义函数。它是用以处理用户专

11、门需要函数。要函数。第17页说明:说明:(6)从函数形式看,函数分两类。从函数形式看,函数分两类。无参函数。无参函数普通用来执行指定一组无参函数。无参函数普通用来执行指定一组操作。无参函数能够带回或不带回函数值,但操作。无参函数能够带回或不带回函数值,但普通以不带回函数值居多。普通以不带回函数值居多。有参函数。在调用函数时,主调函数在调用有参函数。在调用函数时,主调函数在调用被调用函数时,经过参数向被调用函数传递数被调用函数时,经过参数向被调用函数传递数据,普通情况下,执行被调用函数时会得到一据,普通情况下,执行被调用函数时会得到一个函数值,供主调函数使用。个函数值,供主调函数使用。第18页7

12、.2 怎样定义函数怎样定义函数7.2.1为何要定义函数为何要定义函数7.2.2定义函数方法定义函数方法第19页7.2.1 为何要定义函数为何要定义函数C语言要求,在程序中用到全部函数,语言要求,在程序中用到全部函数,必须必须“先定义,后使用先定义,后使用”指定指定函数函数名字名字、函数、函数返回值类型返回值类型、函数、函数实现实现功效功效以及以及参数个数与类型参数个数与类型,将这些,将这些信息通知编译系统。信息通知编译系统。第20页7.2.1 为何要定义函数为何要定义函数指定函数名字,方便以后按名调用指定函数名字,方便以后按名调用指定函数类型,即函数返回值类型指定函数类型,即函数返回值类型指定

13、函数参数名字和类型,方便在调用指定函数参数名字和类型,方便在调用函数时向它们传递数据函数时向它们传递数据指定函数功效。这是最主要,这是在函指定函数功效。这是最主要,这是在函数体中处理数体中处理第21页7.2.1 为何要定义函数为何要定义函数对于库函数,程序设计者只需用对于库函数,程序设计者只需用#include指令把相关头文件包含到本文指令把相关头文件包含到本文件模块中即可件模块中即可程序设计者需要在程序中自己定义想用程序设计者需要在程序中自己定义想用而库函数并没有提供函数而库函数并没有提供函数第22页7.2.2 定义函数方法定义函数方法1.定义无参函数定义无参函数定义无参函数普通形式为定义无

14、参函数普通形式为:类型名类型名函数名函数名(void)函数体函数体类型名类型名函数名函数名()函数体函数体包含申明部分包含申明部分和语句部分和语句部分包含申明部分和包含申明部分和语句部分语句部分第23页7.2.2 定义函数方法定义函数方法1.定义无参函数定义无参函数定义无参函数普通形式为定义无参函数普通形式为:类型名类型名函数名函数名(void)函数体函数体类型名类型名函数名函数名()函数体函数体指定函数指定函数值类型值类型指定函数指定函数值类型值类型第24页7.2.2 定义函数方法定义函数方法2.定义有参函数定义有参函数定义有参函数普通形式为定义有参函数普通形式为:类型名类型名函数名(形式参

15、数表列)函数名(形式参数表列)函数体函数体第25页7.2.2 定义函数方法定义函数方法3.定义空函数定义空函数定义定义空空函数普通形式为函数普通形式为:类型名类型名函数名(函数名()先用空函数占一个位置,以后先用空函数占一个位置,以后逐步逐步扩充扩充好处:好处:程序结构清楚,可读性好,以后程序结构清楚,可读性好,以后扩充新功效方便,对程序结构影响不大扩充新功效方便,对程序结构影响不大第26页7.3 调用函数调用函数7.3.1函数调用形式函数调用形式7.3.2函数调用时数据传递函数调用时数据传递7.3.3函数调用过程函数调用过程7.3.4函数返回值函数返回值第27页7.3.1函数调用形式函数调用

16、形式函数调用普通形式为:函数调用普通形式为:函数名(实参表列)函数名(实参表列)假如是调用无参函数,则假如是调用无参函数,则“实参表列实参表列”能够没有,但括号不能省略能够没有,但括号不能省略假如实参表列包含多个实参,则各参数假如实参表列包含多个实参,则各参数间用逗号隔开间用逗号隔开第28页7.3.1函数调用形式函数调用形式按函数调用在程序中出现形式和位置来按函数调用在程序中出现形式和位置来分,能够有以下分,能够有以下3种函数调用方式种函数调用方式:.函数调用语句函数调用语句把函数调用单独作为一个语句把函数调用单独作为一个语句如如printf_star();这时不要求函数带回值,只要求函数完这

17、时不要求函数带回值,只要求函数完成一定操作成一定操作第29页7.3.1函数调用形式函数调用形式按函数调用在程序中出现形式和位置来按函数调用在程序中出现形式和位置来分,能够有以下分,能够有以下3种函数调用方式种函数调用方式:.函数表示式函数表示式函数调用出现在另一个表示式中函数调用出现在另一个表示式中如如c=max(a,b);这时要求函数带回一个确定值以参加表这时要求函数带回一个确定值以参加表示式运算示式运算第30页7.3.1函数调用形式函数调用形式按函数调用在程序中出现形式和位置来按函数调用在程序中出现形式和位置来分,能够有以下分,能够有以下3种函数调用方式种函数调用方式:.函数参数函数参数函

18、数调用作为另一函数调用时实参函数调用作为另一函数调用时实参如如mmax(a,max(b,c);其中其中max(b,c)是一次函数调用,它值是一次函数调用,它值作为作为max另一次调用实参另一次调用实参第31页7.3.2 函数调用时数据传递函数调用时数据传递1.形式参数和实际参数形式参数和实际参数u在调用有参函数时,主调函数和被调用函在调用有参函数时,主调函数和被调用函数之间有数据传递关系数之间有数据传递关系u定义函数时函数名后面变量名称为定义函数时函数名后面变量名称为“形式形式参数参数”(简称(简称“形参形参”)u主调函数中调用一个函数时,函数名后面主调函数中调用一个函数时,函数名后面参数称为

19、参数称为“实际参数实际参数”(简称(简称“实参实参”)u实际参数能够是常量、变量或表示式实际参数能够是常量、变量或表示式第32页7.3.2 函数调用时数据传递函数调用时数据传递2.实参和形参间数据传递实参和形参间数据传递u在调用函数过程中,系统会把实参值传递在调用函数过程中,系统会把实参值传递给被调用函数形参给被调用函数形参u或者说,形参从实参得到一个值或者说,形参从实参得到一个值u该值在函数调用期间有效,能够参加该值在函数调用期间有效,能够参加被调被调函数中运算函数中运算第33页7.3.2 函数调用时数据传递函数调用时数据传递例例7.2输入两个整数,要求输出其中值较输入两个整数,要求输出其中

20、值较大者。要求用函数来找到大数。大者。要求用函数来找到大数。解题思绪:解题思绪:(1)函数名应是见名知意,函数名应是见名知意,故故定名为定名为max(2)因为给定两个数是整数,返回主调函数值因为给定两个数是整数,返回主调函数值(即较大数)(即较大数)应该是整型应该是整型(3)max函数应该有两个参数,方便从主函数接函数应该有两个参数,方便从主函数接收两个整数,收两个整数,所以所以参数类型应该是整型参数类型应该是整型第34页7.3.2 函数调用时数据传递函数调用时数据传递先编写先编写max函数:函数:intmax(intx,inty)intz;z=xy?x:y;return(z);第35页7.3

21、.2 函数调用时数据传递函数调用时数据传递在在max函数上面函数上面,再编写主函数再编写主函数#includeintmain()intmax(intx,inty);inta,b,c;printf(“twointegernumbers:);scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“maxis%dn”,c);return0;实参能够是常量、变量或表示式实参能够是常量、变量或表示式第36页7.3.2 函数调用时数据传递函数调用时数据传递c=max(a,b);(main函数)函数)intmax(intx,inty)(max函数)函数)intz;z=xy?x:y;r

22、eturn(z);第37页7.3.3 函数调用过程函数调用过程在定义函数中指定形参,在未出现函数调在定义函数中指定形参,在未出现函数调用时,它们并不占内存中存放单元。在发用时,它们并不占内存中存放单元。在发生函数调用时,函数生函数调用时,函数max形参被暂时分配形参被暂时分配内存单元。内存单元。2a3bxy23实参实参形参形参第38页7.3.3 函数调用过程函数调用过程调用结束,形参单元被释放调用结束,形参单元被释放实参单元仍保留并维持原值,没有改变实参单元仍保留并维持原值,没有改变假如在执行一个被调用函数时,形参值发假如在执行一个被调用函数时,形参值发生改变,不会改变主调函数实参值生改变,不

23、会改变主调函数实参值2a3bxy23实参实参形参形参第39页7.3.4.函数返回值函数返回值通常,希望经过函数调用使主调函数能得通常,希望经过函数调用使主调函数能得到一个确定值,这就是函数值到一个确定值,这就是函数值(函数返回值函数返回值)(1)函数返回值是经过函数中函数返回值是经过函数中return语句取语句取得。得。u一个函数中能够有一个以上一个函数中能够有一个以上return语句,执语句,执行到哪一个行到哪一个return语句,哪一个语句,哪一个就就起作用起作用ureturn语句后面括号能够不要语句后面括号能够不要第40页7.3.4.函数返回值函数返回值通常,希望经过函数调用使主调函数能

24、得通常,希望经过函数调用使主调函数能得到一个确定值,这就是函数值到一个确定值,这就是函数值(函数返回值函数返回值)(2)函数值类型。应该在定义函数时指定函函数值类型。应该在定义函数时指定函数值类型数值类型第41页7.3.4.函数返回值函数返回值通常,希望经过函数调用使主调函数能得通常,希望经过函数调用使主调函数能得到一个确定值,这就是函数值到一个确定值,这就是函数值(函数返回值函数返回值)(3)在定义函数时指定函数类型普通应该和在定义函数时指定函数类型普通应该和return语句中表示式类型一致语句中表示式类型一致u假如函数值类型和假如函数值类型和return语句中表示式值不语句中表示式值不一致

25、,则以函数类型为准一致,则以函数类型为准第42页7.3.4.函数返回值函数返回值例例7.3将例将例7.2稍作改动,将在稍作改动,将在max函数中定函数中定义变量义变量z改为改为float型。函数返回值类型与指型。函数返回值类型与指定函数类型不一样,分析其处理方法。定函数类型不一样,分析其处理方法。解题思绪:假如函数返回值类型与指定函解题思绪:假如函数返回值类型与指定函数类型不一样,按照赋值规则处理。数类型不一样,按照赋值规则处理。第43页#includeintmain()intmax(floatx,floaty);floata,b;intc;scanf(%f,%f,&a,&b);c=max(a

26、,b);printf(maxis%dn,c);return0;intmax(floatx,floaty)floatz;z=xy?x:y;return(z);1.52.62.62变为变为2第44页7.4对被调用函数申明和函数原型对被调用函数申明和函数原型在一个函数中调用另一个函数需要具备以在一个函数中调用另一个函数需要具备以下条件:下条件:(1)被调用函数必须是已经定义函数(是库函被调用函数必须是已经定义函数(是库函数或用户自己定义函数)数或用户自己定义函数)(2)假如使用库函数,应该在本文件开头假如使用库函数,应该在本文件开头加对加对应应#include指令指令(3)假如使用自己定义函数,而该

27、函数位置在假如使用自己定义函数,而该函数位置在调用它函数后面,应该申明调用它函数后面,应该申明第45页7.4对被调用函数申明和函数原型对被调用函数申明和函数原型例例7.4输入两个实数,用一个函数求出它输入两个实数,用一个函数求出它们之和。们之和。解题思绪:用解题思绪:用add函数实现。首先要定义函数实现。首先要定义add函数,它为函数,它为float型,它应有两个参型,它应有两个参数,也应为数,也应为float型。尤其要注意是:要型。尤其要注意是:要对对add函数进行申明。函数进行申明。第46页7.4对被调用函数申明和函数原型对被调用函数申明和函数原型分别编写分别编写add函数和函数和main

28、函数,它们组函数,它们组成一个源程序文件成一个源程序文件main函数位置在函数位置在add函数之前函数之前在在main函数中对函数中对add函数进行申明函数进行申明第47页#includeintmain()floatadd(floatx,floaty);floata,b,c;printf(Pleaseenteraandb:);scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%fn,c);return0;floatadd(floatx,floaty)floatz;z=x+y;return(z);求两个实数之和,求两个实数之和,函数值也是实型函数值也是实型对对a

29、dd函数申明函数申明第48页#includeintmain()floatadd(floatx,floaty);floata,b,c;printf(Pleaseenteraandb:);scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%fn,c);return0;floatadd(floatx,floaty)floatz;z=x+y;return(z);只差一个分号只差一个分号第49页#includeintmain()floatadd(floatx,floaty);floata,b,c;printf(Pleaseenteraandb:);scanf(%f,%f

30、,&a,&b);c=add(a,b);printf(sumis%fn,c);return0;floatadd(floatx,floaty)floatz;z=x+y;return(z);定义定义add函数函数调用调用add函数函数第50页函数原型普通形式有两种函数原型普通形式有两种:如如floatadd(floatx,floaty);floatadd(float,float);原型说明能够放在文件开头,这时全部函原型说明能够放在文件开头,这时全部函数都能够使用此函数数都能够使用此函数第51页7.5 函数嵌套调用函数嵌套调用语言函数定义是相互平行、独立语言函数定义是相互平行、独立即函数不能嵌套定义

31、即函数不能嵌套定义但能够嵌套调用函数但能够嵌套调用函数即调用一个函数过程中,又能够调用另一即调用一个函数过程中,又能够调用另一个函数个函数第52页7.5 函数嵌套调用函数嵌套调用main函数函数调用调用a函数函数结束结束a函数函数调用调用b函数函数b函数函数第53页7.5 函数嵌套调用函数嵌套调用例例7.5输入输入4个整数,找出其中最大数。用个整数,找出其中最大数。用函数嵌套调用来处理。函数嵌套调用来处理。解题思绪:解题思绪:umain中调用中调用max4函数,找函数,找4个数中最大者个数中最大者umax4中再调用中再调用max2,找两个数中大者找两个数中大者umax4中屡次调用中屡次调用ma

32、x2,可找,可找4个数中大者,个数中大者,然后把它作为函数值返回然后把它作为函数值返回main函数函数umain函数中输出结果函数中输出结果第54页#includeintmain()intmax4(inta,intb,intc,intd);inta,b,c,d,max;printf(“4integernumbers:);scanf(%d%d%d%d,&a,&b,&c,&d);max=max4(a,b,c,d);printf(max=%dn,max);return0;主函数主函数对对max4 函数申明函数申明第55页#includeintmain()intmax4(inta,intb,intc,

33、intd);inta,b,c,d,max;printf(“4integernumbers:);scanf(%d%d%d%d,&a,&b,&c,&d);max=max4(a,b,c,d);printf(max=%dn,max);return0;主函数主函数输入输入4个整数个整数第56页#includeintmain()intmax4(inta,intb,intc,intd);inta,b,c,d,max;printf(“4integernumbers:);scanf(%d%d%d%d,&a,&b,&c,&d);max=max4(a,b,c,d);printf(max=%dn,max);retur

34、n0;主函数主函数调用后必定是调用后必定是4个数中最大者个数中最大者输出最大者输出最大者第57页intmax4(inta,intb,intc,intd)intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);max4函数函数对对max2 函数申明函数申明第58页intmax4(inta,intb,intc,intd)intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);max4函数函数a,b中较大者中较大者a,b,c中较大者中

35、较大者a,b,c,d中最大者中最大者第59页intmax4(inta,intb,intc,intd)intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);max4函数函数intmax2(inta,intb)if(a=b)returna;elsereturnb;max2函数函数找找a,b中较大者中较大者第60页intmax4(inta,intb,intc,intd)intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);max4

36、函数函数intmax2(inta,intb)if(a=b)returna;elsereturnb;max2函数函数return(ab?a:b);第61页intmax4(inta,intb,intc,intd)intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);max4函数函数intmax2(inta,intb)return(ab?a:b);第62页intmax4(inta,intb,intc,intd)intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max

37、2(m,d);return(m);max4函数函数m=max2(max2(a,b),c);intmax2(inta,intb)return(ab?a:b);第63页intmax4(inta,intb,intc,intd)intmax2(inta,intb);intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);max4函数函数m=max2(max2(max2(a,b),c),d);intmax2(inta,intb)return(ab?a:b);第64页intmax4(inta,intb,intc,intd)intmax2(inta,intb);

38、intm;m=max2(a,b);m=max2(m,c);m=max2(m,d);return(m);max4函数函数ruturn max2(max2(max2(a,b),c),d);intmax2(inta,intb)return(ab?a:b);第65页intmax4(inta,intb,intc,intd)intmax2(inta,intb);ruturnmax2(max2(max2(a,b),c),d);intmax2(inta,intb)return(ab?a:b);#includeintmain()max=max4(a,b,c,d);第66页课堂练习o写一个函数,输入一个4位数字,

39、要求输出这四个数字字符,但每两个数字之间空一个空格。如输入,应该输出“2 0 1 3”。第67页课堂练习编程实现1-100累加。要求使用自定义函数,该函数可求自然数m-n累加和,m、n由用户从键盘输入。第68页#include int sum(int m,int n);int main()int a,b,c;scanf(“%d%d”,&a,&b)c=sum(a,b);printf(“%d到%d自然数之和=%d,a,b,c);return 0;int sum(int x,int y)int i,s=0;i=x;while(i=y)s=s+i;i+;return s;第69页7.6 函数递归调用函

40、数递归调用在调用一个函数过程中又出现直接或间接在调用一个函数过程中又出现直接或间接地调用该函数本身,称为函数地调用该函数本身,称为函数递归调用递归调用。语言特点之一就在于允许函数递归调用。语言特点之一就在于允许函数递归调用。第70页f2函数函数调用调用f1函数函数7.6 函数递归调用函数递归调用intf(intx)inty,z;z=f(y);return(2*z);f函数函数调用调用f函数函数f1函数函数调用调用f2函数函数应使用应使用if语句控制结束调用语句控制结束调用直接调用本函数直接调用本函数间接调用本函数间接调用本函数第71页7.6 函数递归调用函数递归调用例例7.6有有5个学生坐在一

41、起个学生坐在一起u问第问第5个学生多少岁?他说比第个学生多少岁?他说比第4个学生大个学生大2岁岁u问第问第4个学生岁数,他说比第个学生岁数,他说比第3个学生大个学生大2岁岁u问第问第3个学生,又说比第个学生,又说比第2个学生大个学生大2岁岁u问第问第2个学生,说比第个学生,说比第1个学生大个学生大2岁岁u最终问第最终问第1个学生,他说是个学生,他说是10岁岁u请问第请问第5个学生多大个学生多大第72页7.6 函数递归调用函数递归调用解题思绪:解题思绪:u要求第个年纪,就必须先知道第个年纪要求第个年纪,就必须先知道第个年纪u要求第个年纪必须先知道第个年纪要求第个年纪必须先知道第个年纪u第个年纪又

42、取决于第个年纪第个年纪又取决于第个年纪u第个年纪取决于第个年纪第个年纪取决于第个年纪u每个学生年纪都比其前个学生年纪大每个学生年纪都比其前个学生年纪大第73页7.6 函数递归调用函数递归调用解题思绪:解题思绪:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10第74页age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18回溯阶段回溯阶段递推阶段递推阶段第

43、75页age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18回回溯溯阶段阶段递推阶段递推阶段结束递归条件结束递归条件第76页#includeintmain()intage(intn);printf(NO.5,age:%dn,age(5);return0;intage(intn)intc;if(n=1)c=10;elsec=age(n-1)+2;return(c);第77页age(5)输出输出age(5)mainc=age(4)+2age函数

44、函数n=5c=age(3)+2age函数函数n=4c=age(1)+2age函数函数n=2c=age(2)+2age函数函数n=3c=10age函数函数n=1age(1)=10age(2)=12age(3)=14age(4)=16age(5)=1818第78页例例7.7用递归方法求!。用递归方法求!。解题思绪:解题思绪:u求!能够用递推方法求!能够用递推方法:即从开始,乘,即从开始,乘,再乘再乘一直乘到。一直乘到。u递推法特点是从一个已知事实递推法特点是从一个已知事实(如如1!=1)出发,出发,按一定规律推出下一个事实按一定规律推出下一个事实(如如2!=1!*2),再从这个新已知事实出发,再向

45、下推出一个新再从这个新已知事实出发,再向下推出一个新事实事实(3!=3*2!)。n!=n*(n-1)!。第79页例例7.7用递归方法求!。用递归方法求!。解题思绪:解题思绪:u求!也能够用递归方法,即!等于!求!也能够用递归方法,即!等于!,而!,而!,!,!u可用下面递归公式表示:可用下面递归公式表示:第80页#includeintmain()intfac(intn);intn;inty;printf(inputanintegernumber:);scanf(%d,&n);y=fac(n);printf(%d!=%dn,n,y);return0;第81页intfac(intn)intf;if

46、(n0)printf(ncnn1:hanoi(n-1,a,c,b)a-chanoi(n-1,b,a,c)o注意用递归调用结果,用递归调用结果,不关注该结果怎样不关注该结果怎样取得细节取得细节第123页#includeintmain()voidhanoi(intn,charone,chartwo,charthree);intm;printf(“thenumberofdiskes:);scanf(%d,&m);printf(move%ddiskes:n,m);hanoi(m,A,B,C);第124页voidhanoi(intn,charone,chartwo,charthree)voidmove(

47、charx,chary);if(n=1)move(one,three);elsehanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);第125页voidmove(charx,chary)printf(%c-%cn,x,y);第126页课堂练习o小猴子第一天摘下若干桃子,当即吃掉二分之一,又多吃一个.第二天早上又将剩下桃子吃二分之一,又多吃一个.以后天天早上吃前一天剩下二分之一另一个.到第10天早上猴子想再吃时发觉,只剩下一个桃子了.问第一天猴子共摘多少个桃子?第127页递推方法循环结构#includeint main

48、()int i,s=1;for(i=9;i=1;i-)s=(s+1)*2;printf(第%d天有%d个桃子n,i,s);return 0;第128页函数递归调用取代循环结构#includeint f(int n)int s;if(n=10)s=1;else s=(f(n+1)+1)*2;return s;int main()printf(第1天有%d个桃子n,f(1);return 0;第129页7.7数组作为函数参数数组作为函数参数7.7.1数组元素作函数实参数组元素作函数实参7.7.2数组名作函数参数数组名作函数参数7.7.3多维数组名作函数参数多维数组名作函数参数第130页7.7.1数

49、组元素作函数实参数组元素作函数实参例例7.9输入输入10个数,要求输出其中值个数,要求输出其中值最大元素和该数是第几个数。最大元素和该数是第几个数。第131页7.7.1数组元素作函数实参数组元素作函数实参解题思绪:解题思绪:u定义数组定义数组a,用来存放,用来存放10个数个数u设计函数设计函数max,用来求两个数中大者,用来求两个数中大者u在主函数中定义变量在主函数中定义变量m,初值为,初值为a0,每,每次调用次调用max函数后返回值存放在函数后返回值存放在m中中u用用“打擂台打擂台”算法,依次将数组元素算法,依次将数组元素a1到到a9与与m比较,最终得到比较,最终得到m值就是值就是10个数中

50、最大者个数中最大者第132页#includeintmain()intmax(intx,inty);inta10,m,n,i;printf(“10integernumbers:n);for(i=0;i10;i+)scanf(%d,&ai);printf(n);第133页for(i=1,m=a0,n=0;im)m=max(m,ai);n=i;printf(“largestnumberis%dn,m);printf(“%dthnumber.n“,n+1);intmax(intx,inty)return(xy?x:y);第134页7.7.2数组名作函数参数数组名作函数参数除了能够用数组元素作为函数参数

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

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

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

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

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

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

gongan.png浙公网安备33021202000488号   

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

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

客服