(精品)C语言程序设计第12讲(函数)(2012级).ppt
《(精品)C语言程序设计第12讲(函数)(2012级).ppt》由会员分享,可在线阅读,更多相关《(精品)C语言程序设计第12讲(函数)(2012级).ppt(76页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2023/1/291 Program Design in C LanguagePage第十二讲第十二讲第七章第七章函数函数数组作为函数的参数数组作为函数的参数函数的嵌套调用函数的嵌套调用函数的递归调用函数的递归调用函数变量的作用域函数变量的作用域2023/1/292 Program Design in C LanguagePage数数组组元元素素做做函函数数实实参参,遵遵循循”值值传传送送”特特性性,此此时时形参为变量。形参为变量。数组名可做实参和形参,传送的是整个数组。数组名可做实参和形参,传送的是整个数组。在在用用数数组组名名做做函函数数参参数数时时,实实参参和和形形参参都都应应该该用用数
2、数组(或指针变量)。组(或指针变量)。数组作为函数的参数数组作为函数的参数7.1.7 数组作为函数的参数 2023/1/293 Program Design in C LanguagePage数组元素作为函数参数举例数组元素作为函数参数举例:szdy1(intx,inty);szdy2(intx,inty);main()inta10,b45;szdy1(a7,b32);szdy2(b12,a4);szdy1(intx,inty)szdy2(intx,inty)(1)7.1.7 数组作为函数的参数 2023/1/294 Program Design in C LanguagePageszdy1(
3、intx10);szdy2(intx45);main()inta10,b45;szdy1(a);szdy2(b);szdy1(intx10)szdy2(intx45)(2)7.1.7 数组作为函数的参数 2023/1/295 Program Design in C LanguagePage数组名作函数参数时应注意:数组名作函数参数时应注意:1 1)数数组组名名作作函函数数参参数数时时,应应在在主主调调函函数数和和被被调调函数中分别定义数组。函数中分别定义数组。2 2)实实参参数数组组与与形形参参数数组组的的类类型型必必须须相相同同,但但大大小可以不同。小可以不同。3 3)形参数组的一维下标可以
4、省略。)形参数组的一维下标可以省略。4 4)数数组组名名表表示示的的是是数数组组元元素素的的首首地地址址,数数组组名名作作函函数数参参数数时时,传传递递的的是是整整个个数数组组。实实参参与与形形参之间的数据传递是参之间的数据传递是地址传递。地址传递。7.1.7 数组作为函数的参数 2023/1/296 Program Design in C LanguagePage数组名作函数的参数举例:数组名作函数的参数举例:7.1.7 数组作为函数的参数 2023/1/297 Program Design in C LanguagePage例例 利用数组换数利用数组换数 voidhuanshu2(ints
5、huzu,intn);main()/*主函数主函数*/intab2=5,10,i;for(i=0;i2;i+)printf(1)ab%d=%2d,i,abi);huanshu2(ab,2);printf(n);for(i=0;i2;i+)printf(4)ab%d=%2d,i,abi);7.1.7 数组作为函数的参数 2023/1/298 Program Design in C LanguagePagevoidhuanshu2(intshuzu,intn)intt,i;printf(n);for(i=0;in;i+)printf(2)shuzu%d=%2d,i,shuzui);for(i=0;
6、in-1;i+)t=shuzui;shuzui=shuzui+1;shuzui+1=t;printf(n);for(i=0;in;i+)printf(3)shuzu%d=%2d,i,shuzui);7.1.7 数组作为函数的参数 2023/1/299 Program Design in C LanguagePage说明:2000H A02002H A1ab=shuzu=2000H510105intab2=5,10;huanshu2(ab,2);for(i=0;i1从从以以上上定定义义看看,求求解解n!使使用用了了(n-1)!,也也即即要要计计算算n!,必必须须先先计计算算(n-1)!;要要计计
7、算算(n-1)!,必必须须先先计计算算(n-2)!;依依次次类类推,直至推,直至1!=1.再以此为基础,返回来计算再以此为基础,返回来计算2!,3!,4!,.n!.7.2.2 函数的递归调用 2023/1/2920 Program Design in C LanguagePagefac(n)fac(n-1)fac(2)fac(1)fac(n-1)fac(n-2)fac(1)7.2.2 函数的递归调用 如果求数如果求数n的阶乘的函数名为的阶乘的函数名为fac(int),则有:,则有:2023/1/2921 Program Design in C LanguagePage例例使用递归算法编写计算使
8、用递归算法编写计算n!的函数。的函数。longfac(intn)if(n=1)return1;elsereturnn*fac(n-1);voidmain()intm;scanf(%d,&m);printf(%2d!=%dn,m,fac(m);7.2.2 函数的递归调用 2023/1/2925 Program Design in C LanguagePage递递归归函函数数的的结结构构十十分分简简练练。构构造造递递归归函函数数的的关关键键是是找找到到适适当当的的递递归归算算法法和和终终结结条条件件。因因为为递递推推的的过过程程不不能能无无限限制制地地进进行行下下去去,必必须须要要有有一一个个结结
9、束束此此过过程程的的条条件件。在在上上例例求求n!的的过过程程中中,1!=1就就是是这这样样的的结结束束递推过程的条件。递推过程的条件。递递归归函函数数最最典典型型的的例例子子是是Hanoi塔塔问问题题,它它能能较较好地显示出函数递归调用的作用好地显示出函数递归调用的作用.7.2.2 函数的递归调用 2023/1/2926 Program Design in C LanguagePage例例汉汉诺诺(Hanoi)塔塔问问题题是是一一个个古古老老的的数数学学问问题题:在在一一个个塔塔座座(设设为为塔塔1)上上有有若若干干片片盘盘片片,盘盘片片大大小小各各不不相相等等,按按大大盘盘在在下下、小小盘
10、盘在在上上的的顺顺序序叠叠放放,现现要要将将其其移移放放至至另另一一个个塔塔座座(设设为为塔塔2)上上去去。问问:仅仅依依靠靠一一个个附附加加的的塔塔座座(设设为为塔塔3),在在每每次次仅仅只只能能搬搬动动一一片片盘盘片片,且且在在整整个个移移动动过过程程中中始始终终保保持持每每座座塔塔座座上上的的盘盘片片均均为为大大盘盘在在下下、小小盘盘在在上上的的叠叠放放方方式式,能能做做到到么?如何移法?么?如何移法?7.2.2 函数的递归调用 2023/1/2927 Program Design in C LanguagePage对对此此问问题题,一一个个想想法法是是采采用用递递归归的的方方法法。移移
11、动动n个个圆盘可以看成由移动圆盘可以看成由移动n-1个圆盘来完成个圆盘来完成(这就是递归这就是递归)。(1)借助塔借助塔2,将,将n-1个圆盘从塔个圆盘从塔1移动了塔移动了塔3。(2)将最大的一片圆盘将最大的一片圆盘(第第n个圆盘个圆盘)从塔从塔1移动了塔移动了塔2。(3)借助塔借助塔1,将,将n-1个圆盘从塔个圆盘从塔3移动了塔移动了塔2。重重复复上上述述步步骤骤,直直到到完完成成最最后后一一个个操操作作“移移动动n=1个圆盘个圆盘”。7.2.2 函数的递归调用 2023/1/2928 Program Design in C LanguagePage对对于于数数量量不不等等的的圆圆盘盘(设设
12、为为n片片),只只要要能能将将除除最最下下面面最最大大的的一一片片圆圆盘盘外外,其其余余的的盘盘片片(n-1片片)移移至至塔塔3座座上上,剩剩下下一一片片就就可可直直接接移移至至塔塔2上上。其其余余的的(n-1片片)盘盘片片既既能能从从塔塔1移移至至塔塔3,自自然然也也可可照照理理从从塔塔3移移至至塔塔2,问问题题就就解解决决了了。每每次次使使用用同同样样的的办办法法解解决决最最下下面面最最大大一一片片圆圆盘盘的的移移动动问问题题,一一次次次次搬搬下下去去,直直至至剩剩下下最最后后一一片圆盘,直接搬到塔片圆盘,直接搬到塔2上去就可以了。上去就可以了。7.2.2 函数的递归调用 2023/1/2
13、929 Program Design in C LanguagePage这这个个想想法法是是成成立立的的,也也确确实实是是解解决决此此问问题题的的办办法法。这这是是典典型型的的递递归归问问题题,递递归归的的结结束束条条件件是是只只剩剩下下一片圆盘时,可直接移至目的座(塔一片圆盘时,可直接移至目的座(塔2)上。)上。下下面面是是解解决决汉汉诺诺塔塔的的程程序序,程程序序能能打打印印出出盘盘片片移移动动过过程程中中的的每每一一搬搬动动步步骤骤,塔塔座座1、2、3分分别别用用字字符符1、2、3表示。表示。“”表示搬动塔座最上面的一片盘片。表示搬动塔座最上面的一片盘片。7.2.2 函数的递归调用 20
14、23/1/2933 Program Design in C LanguagePagevoid hanoi ta(int n,char ta1,char ta2,char ta3);/*函数函数原型原型*/main()int n;printf(“input the number of diskes:”)scanf(“%d”,&n);/*输入盘片数输入盘片数*/hanoi ta(n,1,2,3);7.2.2 函数的递归调用 2023/1/2934 Program Design in C LanguagePagevoid hanoi ta(int n,char ta1,char ta2,char t
15、a3);if(n=1)printf(“%c%cn”,tal,ta2);/*一一片片盘盘时时,直接移动直接移动*/elsehanoi ta(n-1,ta1,ta3,ta2);/*n-1片盘由片盘由ta1座移至座移至ta3座座*/printf(“%c%cn”,ta1,ta2);/*最下面最大一片盘,直接移动最下面最大一片盘,直接移动*/hanoi ta(n-1,ta3,ta2,ta1);/*n-1片盘由片盘由ta3座移至座移至ta2座座*/7.2.2 函数的递归调用 2023/1/2935 Program Design in C LanguagePage例例使用递归算法求使用递归算法求m和和n的最
16、大公约数的最大公约数gcd分析:求分析:求m和和n的最大公约数等价于求的最大公约数等价于求n与与(mmodn)的最大公约数。的最大公约数。则有则有gcd(m,n)等价于等价于gcd(n,(mmodn)例如:求例如:求24和和16的最大公约数的最大公约数即求与即求与gcd(16,(24mod16)的最大公约数的最大公约数为为gcd(16,8)又等价于又等价于gcd(8,(16mod8)为为gcd(8,0)此时此时n为零,为零,m即为最大公约数即为最大公约数7.2.2 函数的递归调用 2023/1/2936 Program Design in C LanguagePage#include#incl
17、udevoidmain()floatgcd(),m,n,g;printf(“nInputm,n:n”);scanf(“%f,%f”,&m,&n);g=gcd(m,n);printf(“ngcd(%2.0f,%2.0f)=%5.0fn”,m,n,g);程序如下:程序如下:7.2.2 函数的递归调用 2023/1/2937 Program Design in C LanguagePagefloatgcd(a,b)floata,b;if(b=0)return(a);elsereturn(gcd(b,fmod(a,b);7.2.2 函数的递归调用 2023/1/2938 Program Design
18、in C LanguagePage 变变量量的的作作用用范范围围也也称称变变量量的的作作用用域域,即变量可以存储或访问的范围。即变量可以存储或访问的范围。变量的作用域是指变量的变量的作用域是指变量的可见性可见性。变量的作用范围变量的作用范围7.3.1 变量的作用域 2023/1/2939 Program Design in C LanguagePage局部变量局部变量:在一个函数内部定义的变量。在一个函数内部定义的变量。局局部部变变量量的的作作用用范范围围仅仅限限于于本本函函数数,即即只只有有在在本函数内才能使用它们,其他函数不能使用它们。本函数内才能使用它们,其他函数不能使用它们。说明:说明
19、:不不同同函函数数中中可可以以使使用用相相同同名名字字的的变变量量,它它们们代代表表不不同的对象,互不干扰。同的对象,互不干扰。形参也是局部变量。形参也是局部变量。可可以以在在一一个个复复合合语语句句中中定定义义变变量量,这这些些变变量量只只在在本本复合语句中有效。复合语句中有效。1、局部变量局部变量7.3.1 变量的作用域 2023/1/2940 Program Design in C LanguagePage局部变量举例main()int x,y;float f1,f2;hanshu(int x,float y)int a,b,c;7.3.1 变量的作用域 2023/1/2941 Prog
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 语言程序设计 12 函数 2012
限制150内