1、第八章第八章第1页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 28.18.1概述概述 一个较大程序可分为若干个程序模块程序模块,每一个模块用来实现一个特定功效。在高级语言中用子程序子程序实现模块功效。子程序由函数来完成。一个程序可由一个主函数和若干个其它函数组成。由主函数调用其它函数,其它函数也能够相互调用。由主函数调用其它函数,其它函数也能够相互调用。同一个函数能够被一个或多个函数调用任意屡次。同一个函数能够被一个或多个函数调用任意屡次。函数间调用关系函数间调用关系第2页计算机
2、科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 3#include void main()void printstar();/*对对printstar函数申明函数申明*/void print_message();/*对对print_message函数申明函数申明*/printstar();*调用调用printstar函数函数*print_message();/*调用调用print_message函数函数*/printstar();*调用调用printstar函数函数*/例例8.18.1先举
3、一个函数调用简单例子先举一个函数调用简单例子第3页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 4void printstar()*定义定义printstar函数函数*printf(*n);void print_message()*定义定义print_message函数函数*printf(How do you do!n);运行情况以下:运行情况以下:*How do you do!How do you do!*第4页计算机科学与技术系计算机科学与技术系 Department of C
4、omputer ScienceDepartment of Computer Science 5 说明:(1)一个程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。对较大程序,一般不希望把全部内容全放在一个文件中,而是将他们分别放在若干个源文件中,再由若干源程序文件组成一个C程序。这么便于分别编写、分别编译,提高调试效率。一个源程序文件可认为多个C程序公用。第5页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 6(2 2)一个源程序文件由一个或多个函数以及其它相关内容(如
5、命令行、数据定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译,而不是以函数为单位进行编译。(3 3)程序执行是从函数开始,如是在函数中调用其它函数,在调用后流程返回到函数,在函数中结束整个程序运行。第6页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 7(4 4)全部函数都是平行,即在定义函数时是分别进行,是相互独立。一个函数并不隶属于另一函数,即函数不能嵌套定义。函数间能够相互调用,但不能调用函数。函数是系统调用。第7页计算机科学与技术系计算机科
6、学与技术系 Department of Computer ScienceDepartment of Computer Science 8(5 5)从用户使用角度看,函数有两种:标标准准函函数数,即库函数。这是由系统提供,用户无须自己定义这些函数,能够直接使用它们。应该说明,不一样C系统提供库函数数量和功效会有一些不一样,当然许多基本函数是共同。用用户户自自己己定定义义函函数数。用以处理用户专门需要。第8页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 9(6 6)从函数形式看,函数分
7、两类:无无 参参 函函 数数。如 例 8.1中 printstar和print_message就是无参函数。在调用无参函数时,主调函数不向被调用函数传递数据。无参函数普通用来执行指定一组操作。比如,例8程序中printstar函数。有有参参函函数数。在调用函数时,主调函数在调用被调用函数时,经过参数向被调用函数传递数据,普通情况下,执行被调用函数时会得到一个函数值,供主调函数使用。第9页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 108.函数定义普通形式函数定义普通形式 8.2.
8、1.8.2.1.无参函数定义普通形式无参函数定义普通形式无参函数定义普通形式无参函数定义普通形式 定义定义无参函数无参函数普通形式为普通形式为:类型标识符类型标识符函数名函数名()()申明部分申明部分 语句部分语句部分 在定义函数时要用“类型标识符”指定函数值类型,即函数带回来值类型。例8.中printstar和print_message函数为void类型,表示不需要带回函数值。第10页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 118.2.2.有参函数定义普通形式有参函数定义普
9、通形式 定义定义有参函数有参函数普通形式为普通形式为:类型标识符类型标识符函数名函数名(形式参数表列)(形式参数表列)申明部分申明部分 语句部分语句部分 比如:比如:(int,int);/*函数体中申明部分*?;();第11页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 128.2.3 空函数空函数 定义定义空函数空函数普通形式为普通形式为:类型标识符类型标识符函数名函数名()()比如:比如:()()调用此函数时,什么工作也不做,没有任何实际作用。在主调函数中写上“();”表明“这
10、里要调用一个函数”,而现在这个函数没有起作用,等以后扩充函数功效时补充上。第12页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 138.函数参数和函数值函数参数和函数值 8 8.形式参数和实际参数形式参数和实际参数形式参数和实际参数形式参数和实际参数 在前面提到有参函数中,在定义函数时函数名后面括弧中变量名称为“形式参数”(简称“形参形参”),在主调函数中调用一个函数时,函数名后面括弧中参数(能够是一个表示式)称为“实际参数”(简称“实参实参”)。return后面括弧中值()作为函
11、数带回值(称函数返回值函数返回值)。第13页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 14在不一样函数之间传递数据,能够使用法:参数:经过形式参数和实际参数返回值:用return语句返回计算结果全局变量:外部变量大多数情况下,主调函数和被调用函数之间有数据传递关系。第14页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 15#include#include void
12、void()()int max(int int max(int,int int);/*/*对函数申明对函数申明*/*/int int,;,;scanf scanf(,);(,);(,);(,);printf printf(,);,);例例8.8.调用函数时数据传递调用函数时数据传递 第15页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 16int max(int int max(int,int int)*定义有参函数定义有参函数max*max*int int;?;return re
13、turn();();运行情况以下:,第16页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 17经过函数调用,使两个函数中数据发生联络经过函数调用,使两个函数中数据发生联络 第17页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 18关于形参加实参说明:关于形参加实参说明:(1)在定义函数中指定形参,在未出现函数调用时,它们并不占内存中存放单元。只有在发生函数调用时,函数中
14、形参才被分配内存单元。在调用结束后,形参所占内存单元也被释放。(2)实参能够是常量、变量或表示式,如:(,);但要求它们有确定值。在调用时将实参值赋给形参。第18页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 19(3)在被定义函数中,必须指定形参类型(见例8.2程序中“(,);(,);”)。(4)实参加形参类型应相同或赋值兼容。例8中实参和形参都是整型。假如实参为整型而形参x为实型,或者相反,则按第3章介绍不一样类型数值赋值规则进行转换。比如实参值a为3.5,而形参x为整型,则将
15、实数3.5转换成整数3,然后送到形参b。字符型与整型能够相互通用。第19页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 20(5)在语言中,实参向对形参数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不一样单元。第20页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 21在调用函数时,给形参分配存放单元,并将实参对
16、应值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。所以,在执行一个被调用函数时,形参值假如发生改变,并不会改变主调函数实参值。比如,若在执行函数过程中和值变为和,而和仍为和。第21页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 228.3.2 8.3.2 函数返回值函数返回值通常,希望经过函数调用使主调函数能得到一个确定值,这就是函数返回值函数返回值。比如,例8.中,(,)值是,(,)值是5。赋值语句将这个函数值赋给变量。关于函数返回值一些说明:关于函数返回值一
17、些说明:(1)(1)函数返回值是经过函数中函数返回值是经过函数中returnreturn语句取得。语句取得。第22页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 23假如需要从被调用函数带回一个函数值供主调函数使用,被调用函数中必须包含return语句。假如不需要从被调用函数带回函数值能够不要return语句。一个函数中能够有一个以上return语句,执行到哪一个return语句,哪一个语句起作用。return语句后面括弧也能够不要,如如:“:“return ;”;”等价于等价于“
18、return();();”return语句将被调用函数中一个确定值带回主调函数中去。见图8.2中从return语句返回箭头。第23页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 24return后面值能够是一个表示式。比如,例8中函数能够改写成:(int,int)(?););(2)(2)函数返回值应该属于某一个确定类型,函数返回值应该属于某一个确定类型,在在定义函数时指定函数返回值类型定义函数时指定函数返回值类型。第24页计算机科学与技术系计算机科学与技术系 Department
19、of Computer ScienceDepartment of Computer Science 25比如比如:下面是下面是3 3个函数首行:个函数首行:int max(float,float)/*函数值为整型*/char letter(char c1,char c2)/*函数值为字符型*/double min(int,int)/*函数值为双精度型*/在语言中,凡不加类型说明函数,自动按整型处理。例8.中函数首行函数类型int能够省写,用Turbo C 2.0编译程序时能经过,但用Turbo C 3.0编译程序时不能经过,因为C+要求全部函数都必须指定函数类型。所以,提议在定义时对全部函数都
20、指定函数类型。第25页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 26(3 3)在定义函数时指定函数类型普通应该和在定义函数时指定函数类型普通应该和returnreturn语句中表示式类型一致。语句中表示式类型一致。假如函数值类型和return语句中表示式值不一致,则以函数类型为准。对数值型数据,能够自动进行类型转换。即函数类型决定返回值类型。(4 4)对于不带回值函数,应该用对于不带回值函数,应该用“void”“void”定义定义函数为函数为“无类型无类型”(或称(或称“空类型
21、空类型”)。这么,)。这么,系统就确保不使函数带回任何值,即禁止在调系统就确保不使函数带回任何值,即禁止在调用函数中使用被调用函数返回值。此时在函数用函数中使用被调用函数返回值。此时在函数体中不得出现体中不得出现returnreturn语句。语句。第26页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 27例例 8.8.返回值类型与函数类型不一样返回值类型与函数类型不一样#include void main()()int(float,float);float,;,;int;scanf
22、(,);(,);(,);(,);printf(,);,);int max(float,float)float;/*z为实型变量为实型变量*/?;return();();运行情况以下:,Max is 第27页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 288.8.函数调用函数调用 8.8.函数调用普通形式函数调用普通形式函数调用普通形式函数调用普通形式函数调用普通形式为函数调用普通形式为:函数名函数名(实参表列)(实参表列)假如实参表列包含多个实参,则各参数间用逗号隔开。实参加形参
23、个数应相等,类型应匹配。实参加形参按次序对应,一一传递数据。假如是调用无参函数,则“实参表列”能够没有,但括弧不能省略。第28页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 29假如实参表列包含多个实参,对实参求值次序并不是确定,有系统按自左至右次序求实参值,有系统则按自右至左次序。许多版本是按自右而左次序求值,比如Tubro+。第29页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer S
24、cience 30例例 8 8 实参求值次序实参求值次序#include void main()int f(int a,int b);/*函数申明函数申明*/int i=2,p;p=f(i,+i);/*函数调用函数调用*/printf(%dn,p);第30页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 31int f(int a,int b)/*函数定义函数定义*/int c;if(ab)c=1;else if(a=b)c=0;else c=-1;return(c);第31页计算机
25、科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 32假如按自左至右次序求实假如按自左至右次序求实参值,则函数调用相当于参值,则函数调用相当于(,)(,)假如按自左至右次序求实假如按自左至右次序求实参值,则函数调用相当于参值,则函数调用相当于(3,),)对于函数调用对于函数调用 int i=2,p;p=f(i,+i);第32页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 338.
26、8.函数调用方式函数调用方式函数语句函数语句把函数调用作为一个语句。如例8.1中printstar(),这时不要求函数带回值,只要求函数完成一定操作。函数表示式函数表示式函数出现在一个表示式中,这种表示式称为函数表示函数表示式式。这时要求函数带回一个确定值以参加表示式运算。比如:*(,);(,);第33页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 34函数参数函数参数函数调用作为一个函数实参。比如:m=max(a,max(b,c);其中max(b,c)是一次函数调用,它值作为ma
27、x另一次调用实参。m值是a、b、c三者中最大者。又如:printf(%d,max(a,b);也是把max(a,b)作为printf函数一个参数。函数调用作为函数参数,实质上也是函数表示式形式调用一个,因为函数参数原来就要求是表示式形式。第34页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 358.对被调用函数申明和函数原型对被调用函数申明和函数原型(1)首先被调用函数必须是已经存在函数(是库函数或用户自己定义函数)。但光有这一条件还不够。8.对被调用函数申明和函数原型对被调用函数申
28、明和函数原型第35页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 36(3)假如使用用户自己定义函数,而该函数位置在调用它函数(即主调函数)后面(在同一个文件中),应该在主调函数中对被调用函数作申明对被调用函数作申明。(2)假如使用库函数,还应该在本文件开头用命令将调用相关库函数时所需用到信息“包含”到本文件中来。第36页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 3
29、7函数原型普通形式为函数原型普通形式为(1)(1)函数类型函数类型 函数名函数名(参数类型参数类型1 1,参数,参数类型类型2)2);(2)(2)函数类型函数类型 函数名函数名(参数类型参数类型1 1,参数,参数名名1 1,参数类型,参数类型2 2,参数名,参数名2)2);第37页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 38“申明申明”一词原文是delaration,过去在许多书中把它译为“说明”。申明作用申明作用是把函数名、函数参数个数和参数类型等信息通知编译系统,方便在碰
30、到函数调用时,编译系统能正确识别函数并检验调用是否正当。(比如函数名是否正确,实参加形参类型和个数是否一致)。第38页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 39注意:注意:函数函数“定义定义”和和“申明申明”不是一回不是一回事事。函数定义函数定义是指对函数功效确实立,包含指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整、独立函数单位。而函数申明函数申明作用则是把函数名字、函数类型以及形参类型、个数和次序通知编译系统,方便在调用该函数时系统按此进行对照检验。第39
31、页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 40#include void main()()float add(float x,float y););*对被调用函数对被调用函数add申明申明*float a,b,c;scanf(f,f,a,b););cadd(a,b);printf(sum is f n,c););float add(float,float)*函数首部函数首部*float;/*函数体函数体*/z;return(z););例例8 对被调用函数作申明对被调用函数作申
32、明第40页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 41假如假如 被调用函数定义出现在主调函数之前,能够无须加以申明。因为编译系统已经先知道了已定义函数相关情况,会依据函数首部提供信息对函数调用作正确性检验。假如假如 被调用函数定义出现在主调函数之前,能够无须加以申明。因为编译系统已经先知道了已定义函数相关情况,会依据函数首部提供信息对函数调用作正确性检验。第41页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartme
33、nt of Computer Science 42改写例改写例 8.#include float add(float,float)*函数首部函数首部*float;/*函数体函数体*/z;return(z););void main()()float a,b,c;scanf(f,f,a,b););cadd(a,b);printf(sum is f n,c););第42页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 438.函数嵌套调用函数嵌套调用嵌套定义就是在定义一个函数时,其函数体内
34、又包含另一个函数完整定义。语言不能嵌套定义函数,但能够嵌套调用函数,也就是说,在调用一个函数过程中,又调用另一个函数。第43页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 44第44页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 45例例 8.8.用弦截法求方程用弦截法求方程 f(x)=x3-5x2+16x-80=0 f(x)=x3-5x2+16x-80=0 根根 第4
35、5页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 46(1)取两个不一样点x1,x2,假如f(x1)和f(x2)符号相反,则(x1,x2)区间内必有一个根。假如f(x1)与f(x2)同符号,则应改变x1,x2,直到f(x1)、f(x2)异号为止。注意x1、x2值不应差太大,以确保(x1,x2)区间内只有一个根。(2)连接(x1,f(x1)和(x2,f(x2)两点,此线(即弦)交x轴于x。方法:方法:第46页计算机科学与技术系计算机科学与技术系 Department of Compu
36、ter ScienceDepartment of Computer Science 47(3)(3)若f(x)与f(x1)同符号,则根必在(x,x2)区间内,此时将x作为新x1。假如f(x)与f(x2)同符号,则表示根在(x1,x)区间内,将x作为新x2。(4)(4)重复步骤(2)和(3),直到 f(x)为止,为一个很小数,比如 10-6.此时认为 f(x)0 第47页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 48N-S流程图流程图 第48页计算机科学与技术系计算机科学与技术系
37、 Department of Computer ScienceDepartment of Computer Science 49分别用几个函数来实现各部分功效分别用几个函数来实现各部分功效:(1)用函数f(x)代表x函数:x3-5x2+16x-80.(2)用函数调用xpoint(x1,x2)来求(x1,f(x1)和 (x2,f(x2)连线与x轴交点x坐标。(3)用函数调用root(x1,x2)来求(x1,x2)区间 那个实根。显然,执行root函数过程中要用 到函数xpoint,而执行xpoint函数过程中要用 到f函数。第49页计算机科学与技术系计算机科学与技术系 Department of
38、 Computer ScienceDepartment of Computer Science 50 float f(float x)*定义函数,以实定义函数,以实 现现f(x)x3-5x2+16x-80*;=(-.)*+.)*-.;();();第50页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 51float xpoint(float x1,float x2)*定义定义xpoint函数,求出弦与函数,求出弦与x轴交点轴交点*/;=(*()()-*()()()()-();();(
39、);();第51页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 52float root(float,float)/*定义定义root函数,求近似根函数,求近似根*/,;,;();();do (,);(,);();();if(*)/*()与与()同符号同符号*/;while()().););();();第52页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 53 void
40、 main()()主函数主函数float,;,;do printf(,:);,:);scanf(,);(,);();();();();while(*););(,);(,);printf(root of equation is .n,);运行情况以下:运行情况以下:,:,root of equation is 第53页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 548函数递归调用函数递归调用 在在调调用用一一个个函函数数过过程程中中又又出出现现直直接接或或间间接接地地调调用用该该函
41、函数数本本身身,称称为为函函数数递递归归调调用用。语语言言特特点之一就在于允许函数递归调用。比如:点之一就在于允许函数递归调用。比如:(int),;,;();();return(*););第54页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 55第55页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 56例例 8 有个人坐在一起,问第个人多少岁?有个人坐在一起,问第个人多
42、少岁?他说比第个人大岁。问第个人岁数,他说比第他说比第个人大岁。问第个人岁数,他说比第个人大岁。问第个人,又说比第个人大岁。个人大岁。问第个人,又说比第个人大岁。问第个人,说比第个人大岁。最终问第个人,问第个人,说比第个人大岁。最终问第个人,他说是岁。请问第个人多大。他说是岁。请问第个人多大。()()()()()()()()()()()()()()()()()()能够用数学公式表述以下:能够用数学公式表述以下:()()()()()()()第56页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Sci
43、ence 57能够用一个函数来描述上述递归过程:能够用一个函数来描述上述递归过程:int age(int)*求年纪递归函数求年纪递归函数*int;*用作存放函数返回值变量用作存放函数返回值变量*if()();else ();();return();();用一个主函数调用用一个主函数调用age函数,求得第函数,求得第5人年纪。人年纪。#include void main()()(,();,();运行结果以下:运行结果以下:第57页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 58例例
44、8.8.用递归方法求!用递归方法求!求!也能够用递归方法,即!等于求!也能够用递归方法,即!等于!,而!,而!。!。可用下面递归公式表示:可用下面递归公式表示:!(,)(,)()!()!()()第58页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 59例例 8.8.(汉诺)塔问题(汉诺)塔问题。这。这是一个古典数学问题,是一个用递归方法解题是一个古典数学问题,是一个用递归方法解题经典例子。问题是这么:古代有一个梵塔,塔经典例子。问题是这么:古代有一个梵塔,塔内有内有3 3个座个座A
45、 A、B B、C C,开始时座上有个盘,开始时座上有个盘子,盘子大小不等,大在下,小在上(见图子,盘子大小不等,大在下,小在上(见图8 8)。有一个老和尚想把这个盘子从)。有一个老和尚想把这个盘子从座移到座,但每次只允许移动一个盘,且座移到座,但每次只允许移动一个盘,且在移动过程中在在移动过程中在3 3个座上都一直保持大盘在下,个座上都一直保持大盘在下,小盘在上。在移动过程中能够利用座,要求小盘在上。在移动过程中能够利用座,要求编程序打印出移动步骤。编程序打印出移动步骤。第59页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartmen
46、t of Computer Science 60第60页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 61为便于了解,我们先分析将座上个盘子移到座上过程:(1)将座上个盘子移到座上(借助);(2)将座上个盘子移到座上;(3)将座上个盘子移到座上(借助)。其中第()步能够直接实现。第步又可用递归方法分解为:将上个盘子从移到;将上个盘子从移到;将上个盘子从移到。第()步能够分解为:将上个盘子从移到上;将上个盘子从移到上;将上个盘子从移到上。将以上综合起来,可得到移动3个盘子步骤为,。第
47、61页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 62由上面分析可知:将个盘子从座移到座能够分解为以下3个步骤:(1)将上个盘借助座先移到座上。(2)把座上剩下一个盘移到座上。(3)将个盘从座借助于座移到座上。第62页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 63程序以下:程序以下:#include void main()void hanoi(int n,char
48、 one,char two,char three);/*对对hanoi函数申明函数申明*/int m;printf(input the number of diskes:);scanf(“%d”,&m);printf(The step to moveing%d diskes:n,m);hanoi(m,A,B,C);第63页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 64void hanoi(int n,char one,char two,char three)/*定义定义hano
49、i函数函数,将个盘从将个盘从one座借助座借助two座,移座,移到到three座座*/void move(char x,char y);/*对对move函数申明函数申明*/if(n=1)move(one,three);else hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);void move(char x,char y)/*定义定义move函数函数*/printf(“%c-%cn,x,y);第64页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartm
50、ent of Computer Science 65运行情况以下:运行情况以下:input the number of diskes:3 The steps to noving 3 diskes:第65页计算机科学与技术系计算机科学与技术系 Department of Computer ScienceDepartment of Computer Science 668.数组作为函数参数数组作为函数参数8.7.1 8.7.1 数组元素作函数实参数组元素作函数实参数组元素作函数实参数组元素作函数实参因因为为实实参参能能够够是是表表示示式式,而而数数组组元元素素能能够够是是表表示示式式组组成成部部分