版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、什么是函数?函数的定义函数的调用函数的嵌套调用问题:最大公约数与最小公倍数题目描述写两个函数int max_gys(int m,int n)和int min_gbs(int m,int n),分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。【提示】1、可以使用辗转相除法(欧几里德算法)求两个数的最大公约数。2、把两个数的乘积除以这两个数的最大公约数,得到的商就是这两个数的最小公倍数。int max_gys(int m,int n)#includeint main(void)int max_gys(int m,int n); int min_gbs(
2、int m,int n);int a,b,c,d;scanf(%d %d,&a,&b); c=max_gys(a,b); d=min_gbs(a,b); printf(%d %dn,c,d); return 0;int r; while(n!=0)r=m%n; m=n; n=r;return m;int min_gbs(int m,int n)int r; r=(m*n)/(max_gys(m,n); return r;函数的嵌套调用C语言的函数定义是互相平行、独立的,也就是说,在定义函数时,一个函数内不能再定义另一个函数,即不能嵌套定义,但可以嵌套调用函数,即在调用一个函数的过程中,又调用另
3、一个函数。 执行main函数的开头部分; 遇函数调用语句,调用函数a,流程转去a函数; 执行a函数的开头部分; 遇函数调用语句,调用函数b,流程转去函数b; 执行b函数,如果再无其他嵌套的函数,则完成b函数的全部操作; 返回到a函数中调用b函数的位置; 继续执行a函数中尚未执行的部分,直到a函数结束; 返回main函数中调用a函数的位置; 继续执行main函数的剩余部分直到结束。main函数a函数b函数调用a函数调用b函数 结 束函数的嵌套调用【例7.5】输入4个整数,找出其中最大的数。用函数的嵌套调用来处理。#include int main(void)int max4(int a,int
4、b,int c,int d);数声明int a, b, c, d, max;int m; m=max2(a,b);的大者,放在m中m=max2(m,c);的大者,放在m中m=max2(m,d); 的大者,放在m中return(m);/调用max2函数,得到a和b中/对max4的函/调用max2函数,得到a,b,c中/调用max2函数,得到a,b,c,d中printf(Please enter 4 interger numbers:);scanf(%d %d %d %d,&a,&b,&c,&d);/把m作为函数值带回main函数/调用max4函数,得到max=max4(a,b,c,d);4个数中
5、的最大者/定义max2函数int max2(int a,int b)if(a=b)return a; elsereturn b;printf(max=%d n, max);return 0;/若ab,将a作为函数返回值/定义max4函数int max4(int a,int b,int c,int d)/若a=b ? a : b); /返回条件表达式的值,即a和b中的大者(2) 在max4函数中,3个调用max2的语句可以用以下一行代替:m=max2(max2(max2(a,b),c),d); /把函数调用作为函数参数甚至可以取消变量m,max4函数可写成先调用“max2(a,b)”,得到a和b
6、中的大者。再调用“max2(max2(a,b),c)”(其中 max2(a,b)为已知),得到a,b,c三者中的大者。最后由“max2(max2(max2(a,b),c),d)”求得a,b,c,d四者中的大者。程序改进int max4(int a, int b, int c, int d)int max2(int a, int b);/对max2的函数声明return max2(max2(max2(a,b),c),d);函数的递归调用函数的递归调用在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。f函数f1函数f2函数调用f函数调用f2函数调用f1函数直接递归间接递归
7、程序中不应出现无终止的递归调用,而只应出现有限次数的、有终止的递归调用,这可以用if语句来控制,只有在某一条件成立时才继续执行递归调用;否则就不再继续。int f(int x)int y,z;z=f(y);/在执行f函数的过程中又要调用f函数return (2*z);函数的递归调用【例7.6】有5个学生坐在一起,问第5个学生多少岁,他说比第4个学生大2岁。问第4个学生岁数,他说比第3个学生大2岁。问第3个学生,又说比第2个学生大2岁。问第2个学生,说比第1个学生大2岁。最后问第1个学生,他说是10岁。请问第5个学生多大。【解题思路】要求第5个学生的年龄,就必须先知道第4个学生的年龄,而第4个学
8、生的年龄也不知道,要求第4个学生的年龄必须先知道第3个学生的年龄,而第3个学生的年龄又取决于第2个学生的年龄,第2个学生的年龄取决于第1个学生的年龄。而且每一个学生的年龄都比其前1个学生的年龄大2。可以用数学公式表述如下:age(n)=10(n=1)age(n)=age(n-1)+2 (n1)递归求解可分成两个阶段:第1阶段是“回溯”,第2阶段是“递推”。要经历若干步才能求出最后的值。age(5)=age(4)+2age(5)=18age(4)=age(3)+2age(4)=16age(3)=age(2)+2age(3)=14age(2)=age(1)+2age(2)=12age(1)=10如
9、果要求递归过程不是无限制进行下去,必须具有一个结束递归过程的条件。例如,age(1)=10就是使递归结束的条件。#include int main(void)int age(int n);/对age函数的声明printf(第5个学生的年龄是:%dn,age(5);return 0;age(n) n=5age(n) n=4age(n) n=3age(n) n=2age(n) n=1int age(int n)/定义递归函数int c;if(n=1)/c存放函数的返回值变量/如果n等于1age(5)=18age(4)=16age(3)=14age(2)=12age(1)=10c=10;elsec=
10、age(n-1)+2;return(c);/年龄为10/如果n不等于1/年龄是前一个学生的年龄加2(如第4个学生年龄是第3个学生年龄加2)/返回年龄mainage(5)输出age(5)c=10c=age( 1)+2c=age( 2)+2c=age( 3)+2c=age( 4)+2注意分析递归的终止条件。函数的递归调用【例7.7】用递归方法求n!。n!=! ! = ( = , )( )解题思路: * !fac(n) n=5fac(n) n=4fac(n) n=3fac(n) n=2fac(n) n=1fac(5)=120fac(4)=24fac(3)=6fac(2)=2fac(1)=1f=1f=
11、fac(1)*2f=fac(2)*3f=fac(3)*4f=fac(4)*5mainfac(5)输出fac(5)/定义fac函数#include int main()int fac(int n)int f;if(n0)/fac函数声明int fac(int n);int n;int y;/n不能小于0printf(n1时,n!=n*(n-1)printf(%d!=%dn,n,y);return 0;注意程序中的变量是int型,如果用多数C编译系统为int型数据分配4个字节,能表示的最大数为2 147 483 647,当n=12时,运行正常,输出为479 001 600。如果输入13, 企图求1
12、3!,是得不到预期结果的,因为求出的结果超过了int型数据的最大值。可将f, y和fac函数定义为float或double型。函数的递归调用【例7.8】Hanoi(汉诺)塔问题。古代有一个梵塔,塔内有3个座A,B,C。开始时A 座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64 个盘子从A座移到C座,但规定每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座。要求编程序输出移动盘子的步骤。ABC解题思路:老和尚会这样想:假如有另外一个和尚能有办法将上面63个盘子从一个座移到另一座。那么,问题就解决了。此时老和尚只须这样做:
13、 命令第2个和尚将63个盘子从A座移到B座; 自己将1个盘子(最底下的、最大的盘子)从A座移到C座; 再命令第2个和尚将63个盘子从B座移到C座。第2个和尚又想:如果有人能将62个盘子从一个座移到另一座,我就能将63个盘子从A座移到B座,他是这样做的: 命令第3个和尚将62个盘子从A座移到C座; 自己将1个盘子从A座移到B座; 再命令第3个和尚将62个盘子从C座移到63个子ABCB座。解题思路:为便于理解,先分析将A座上3个盘子移到C座上的过程: 将A座上2个盘子移到B座上(借助C座)。 将A座上1个盘子移到C座上。 将B座上2个盘子移到C座上(借助A座)。其中第步可以直接实现。第步又可用递归
14、方法分解为:将A座上1个盘子从A座移到C座; 将A座上1个盘子从A座移到B座; 将C座上1个盘子从C座移到B座。第步可以分解为:将B座上1个盘子从B座移到A座上; 将B座上1个盘子从B座移到C座上; 将A座上1个盘子从A座移到C座上。将以上综合起来,可得到移动3个盘子的步骤为:AC,AB,CB,AC,BA,BC,AC。共经历7步。由此可推出: 移动n个盘子要经历(2n-1)步。AB移动前CABCABCABC解题思路:由上面的分析可知: 将n个盘子从A座移到C座可以分解为以下3个步骤: 将A座上n1个盘借助C座先移到B座上; 把A座上剩下的一个盘移到C座上; 将n1个盘从B座借助于A座移到C座上
15、。上面第步和第步,都是把n1个盘从一个座移到另一个座上,采取的办法是一样的,只是座的名字不同而已。为使之一般化,可以将第步和第步表示为:将x座上n1个盘移到y座(借助z座)。只是在第步和第步中,x, y, z和A, B, C的对应关系不同。对第步,对应关系是x对应A,y对应B,z对应C。对第步,是: x对应B,y对应C,z对应A。因此,可以把上面3个步骤分成两类操作:将n1个盘从一个座移到另一个座上(n1)。这就是大和尚让小和尚做的工作,它是一个递归的过程,即和尚将任务层层下放,直到第64个和尚为止。hanoi函数 将1个盘子从一个座上移到另一座上。这是大和尚自己做的工作。move函数void
16、 hanoi(int n, char x, char y, char z)#include int main(void)void hanoi(int n, char x, char y, char z);/对hanoi函数的声明int m;printf(input the number of diskes:); scanf(%d,&m);printf(The step to move %d diskes:n,m);hanoi(m, A, B, C);return 0;void move(char x, char y);/对move函数的声明if(n=1)move(x, y);elsehanoi
17、(n-1, x, z, y);move(x, z);hanoi(n-1, y, x, z);void move(char x, char y) /定义move函数printf(%c-%cn, x, y);/定义hanoi函数/将n个盘从x座借助y座,移到z座在本程序中,调用递归函数hanoi,其终止条件为hanoi函数的参数n的值等于1。显然,此时不必再调用hanoi函数了,直接执行move函数即可。在本程序中move函数并未真正移动盘子,而只是输出移盘的方案(表示从哪一个座移到哪一个座)。数组作为函数参数问题:回文判断题目描述编写一个函数intisPalindrome(chars,intn)
18、,判断参数表示的字符串是否是回文,如果是返回1,否则返回0。在主函数中调用它,调用方法为 isPalindrome(s,n) , 其中实参n=strlen(s)-1;判断输入的字符串s是否是回文,如果是,输出“yes”,如果不是,输出No。#include #include int main(void)int isPalindrome(char a,int n); int i, T, n;char s100; scanf(%d,&T); for(i=1;i=T;i+)scanf(%s,s); n=strlen(s)-1;if (isPalindrome(s,n)printf(Yesn);elseprintf(Non);return 0;int isPalindrome(char a,int n)int i;for (i=0; i=n; i+)if (ai!=an-i) return 0;return 1;数组元素作为函数实参数组元素可以用作函数实参,但是不能用作形参。因为形参是在函数被调用时临时分配存储单元的,不可能为一个数组元素单独分配存储单元(数组是一个整体,在内存中占连续的一段存储单元)。在用数组元素作函数实参时,把实参的值传给形参,是“值传递”方式。数据传递的方向是从实参传到形参,单向传递。数组元素作函数实参【例7.9】输入10个数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消防设施、器材维护管理制度
- 总包单位质量责任制度
- 我省信访工作责任制度
- 打磨工岗位责任制度
- 扫黄扫非工作责任制度
- 技师岗位责任制度
- 抚宁区经济责任制度
- 报人员责任制度
- 挂车司机岗位责任制度
- 控烟领导小组责任制度
- 学前儿童家庭与社区教育(学前教育专业)PPT全套完整教学课件
- 电动机检修作业指导书
- TS30测量机器人Geocom中文说明书
- 化工厂监控系统解决方案
- GB/T 3565.1-2022自行车安全要求第1部分:术语和定义
- GB/T 3452.4-2020液压气动用O形橡胶密封圈第4部分:抗挤压环(挡环)
- GB/T 15382-2021气瓶阀通用技术要求
- GB/T 15242.4-2021液压缸活塞和活塞杆动密封装置尺寸系列第4部分:支承环安装沟槽尺寸系列和公差
- 公共管理核心与前沿课件
- 磁粉检测技术(ii级)学习培训模板课件
- 新员工跟进转正面谈记录表
评论
0/150
提交评论