多函数程序设计

上传人:ji****72 文档编号:51275562 上传时间:2018-08-13 格式:PPT 页数:28 大小:205.50KB
返回 下载 相关 举报
多函数程序设计_第1页
第1页 / 共28页
多函数程序设计_第2页
第2页 / 共28页
多函数程序设计_第3页
第3页 / 共28页
多函数程序设计_第4页
第4页 / 共28页
多函数程序设计_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《多函数程序设计》由会员分享,可在线阅读,更多相关《多函数程序设计(28页珍藏版)》请在金锄头文库上搜索。

1、第13讲 多函数程序设计-3*1解析C程序设计第2章 简单程 序设计 上节重点 变量作用域 变量的存储类型 本节重点 嵌套调用 递归调用Date2解析C程序设计第2章 简单程序设计函数设计的原则 函数的功能要单一,不要设计多用途的函数 函数的规模要小,尽量控制在50行代码以内 1986年IBM在OS/360的研究结果:大多数有错误的函数 都大于500行 1991年对148,000行代码的研究表明:小于143行的函数 比更长的函数更容易维护 参数和返回值的规则 参数要书写完整,不要省略 对函数的入口参数进行有效性检查 没有参数和返回值时,用void填充 每个函数只有一个入口和一个出口,尽量不使用

2、全局变量 尽量少用静态局部变量,以避免函数具有“记忆”功能Date3解析C程序设计第2章 简单程序设计例:求三个数最大值最小值的差 定义函数分别求: 两个数的最大值 两个数的最小值 再在主函数中调用它们求三个数的最大 值和最小值,再求差。不要求三个数的不要求三个数的 最大值,因为相最大值,因为相 比之下,求两个比之下,求两个 数最大值这个函数最大值这个函 数在今后的复用数在今后的复用 率会更高。率会更高。Date4解析C程序设计第2章 简单程序设计程序#include #include int Max(int a,int b); /函数声明 int Min(int a,int b); /函数声

3、明 void main() int a,b,c,max,min; /定义printf(“请输入三个整数:“);scanf(“%d,%d.%d“, max=Max(Max(a,b),c); /计算1、求三个数的最大值(调用函数) min=Min(Min(a,b),c); /计算2、求三个数的最小值(调用函数) printf(“%d“,max-min); /输出 /函数功能:求两个数的最大值 /形参:int a,int b /返回值:最大值, int int Max(int a,int b) /函数定义 return (ab)?a:b; /求两个数的最小值 /形参:int a,int b /返回值

4、:最大值, int int Min(int a,int b) /函数定义 return (a1double double Fac(intFac(int n) n) if(n=1) if(n=1) return 1; return 1;else else return n* return n*Fac(n-1)Fac(n-1); ; 写成函数写成函数 ?Date6解析C程序设计第2章 简单程序设计例5程序#include double Fac(int n) if(n=1) return 1;elsereturn n*Fac(n-1); void main() int n;printf(“pleas

5、e input a number:n“);scanf(“%d“,printf(%2d!=%f,n,Fac(n); f(10)f(10) return 10*f(9 );return 10*f(9 );f(9)f(9) return 9*f(8 return 9*f(8 ) ); ;f(1)f(1) return 1return 1; ;f(2)f(2) return 2*f(1);return 2*f(1); 执行过程执行过程 ?调用函数调用函数 递推递推依次返回依次返回 回归回归 递归:函数嵌套调用自身递归:函数嵌套调用自身Date7解析C程序设计第2章 简单程序设计递归 迭代double

6、Fac(int n) if(n1 n*(n-1)! n1n!=(1*2)*3)*n)n!=(1*2)*3)*n)Date8解析C程序设计第2章 简单程序设计递归与迭代的比较递 归迭 代控制结构选择结 构循环结构终止条件边界条件循环条件求解方向nn-1112n优点解题思路简单 缺点递归调 用执行过程复 杂,效率低效率高例: n!n! 1 n=1 1 n=1n*(n-1)! n1 n*(n-1)! n1n!=(1*2)*3)*n)n!=(1*2)*3)*n)Date9解析C程序设计第2章 简单程序设计什么问题可以用递归来解决? 问题具有如下特点: 问题较复杂,不易用迭代法直接求解 该问题可以分解成

7、若干子问题,子问题除了规 模较原问题小以外,其它均相同。 最终,总有一个问题不能再分解。复杂问题复杂问题 边界问题边界问题n n=1n n=1或或2 2规模减小规模减小依次递推求得复杂问题的解依次递推求得复杂问题的解Date10解析C程序设计第2章 简单程序设计例5-4 求解Hanoi(汉诺)塔问题 古代有一个梵塔,塔内有三个柱子A、B 、C,僧侣们想把A拄子上的一摞盘子移 动到C柱子上。最初A拄子上有大小不等 的64个盘子,且小的在上,大的在下。 在移动过程中,大盘子只能在下,小盘 子只能在上,并且每次只能移动一个盘 子,可以借助于B柱子。6463621ABCDate11解析C程序设计第2章

8、 简单程序设计问题分析 解决Hanoi(汉诺)塔问题的方法可以表述如下: 老和尚移动64个盘子的步骤 第1步,请第2个和尚将前63个盘子从A柱子移到B柱子; 第2步,自己将最下面的第64个盘子从A柱子移到C柱子; 第3步,再请第2个和尚将63个盘子从B柱子移到C柱子。 第2个和尚移动63个盘子的步骤 第1步,请第3个和尚将前62个盘子从A柱子移到C柱子; 第2步,自己将最下面的第63个盘子从A柱子移到B柱子; 第3步,再请第3个和尚将62个盘子从C柱子移到B柱子。 依此类推,直到第63个和尚完成了2个盘子的移动,最后 由第64个和尚完成1个盘子的移动。这个过程称之为“回推 “过程。 每个人的工

9、作是:移动每个人的工作是:移动n n个盘子从个盘子从A A到到B(B(借助借助C)C)的步骤的步骤 第第1 1步,请别人将步,请别人将n-1n-1个盘子从个盘子从A A柱子移到柱子移到C C柱子;柱子; 第第2 2步,自己将最下面的第步,自己将最下面的第n n个盘子从个盘子从A A柱子移到柱子移到B B 柱子;柱子; 第第3 3步,再请别人将步,再请别人将n-1n-1个盘子从个盘子从C C柱子移到柱子移到B B柱子柱子 。 一个特例:当一个特例:当n=1n=1的时候的时候Date12解析C程序设计第2章 简单程序设计move函数/* 定义函数:显示移动过程int no:表示第no个盘子char

10、 from:表示源柱子char to:表示目的柱子 */ void move(int no,char from,char to) printf(“Move %3dth disk:%c - %cn“,no,from,to); Date13解析C程序设计第2章 简单程序设计hanoi函数 /* 定义函数:借助by柱子将n个盘子从from柱子移动到to柱子int n:表示n个盘子 char from:表示源柱子char to:表示目的柱子,char by:表示要借助的柱子 */ void hanoi(int n,char from,char by,char to) if (n=1) move(n,f

11、rom,to); else hanoi(n-1,from,to,by); move(n,from,to); hanoi(n-1,by,from,to); Date14解析C程序设计第2章 简单程序设计#include /* 包含头文件 */ void move(int,char,char); /* 自定义函数的声明 */ void hanoi(int n,char,char,char); /* 自定义函数的声明 */ void main() /* 主函数,无参数,无返回值 */ int n; /* 定义整型变量n,存放盘子总数 */printf(“Input the number of dis

12、kes: “); /* 提示输入n的值 */scanf(“%d“, /* 输入n的值 */printf(“The step to moving %3d diskes:n“,n);hanoi(n,A,B,C); /* 借助B柱子将n个盘子从A移到C */ /* 定义函数:显示第no个盘子的移动过程,从from到to */ void move(int no,char from,char to) printf(“Move %3d : %c %cn“,no,from,to); /* 定义函数:借助by柱子将n个盘子从from柱子移动到to柱子*/ void hanoi(int n,char from,

13、char by,char to) if (n=1) move(n,from,to); else hanoi(n-1,from,to,by); move(n,from,to); hanoi(n-1,by,from,to); 完整程序Date15解析C程序设计第2章 简单程序设计运行输出:Input the number of disks: 3 The step to moving 3 disks: Move 1: A B Move 2: A C Move 3: B C Move 4: A B Move 5: C A Move 6: C B Move 7: A BDate16解析C程序设计第2章

14、简单程序设计语法:函数的递归调用 在调用一个函数的过程中又直接或间接 地调用函数本身 f( ) f( );f1( ) f2( );f2( ) f1( );特殊形式的函特殊形式的函 数嵌套数嵌套重点重点直直接递归接递归间间接递归接递归Date17解析C程序设计第2章 简单程序设计练习3(例5-6):写递归函数计 算fabonacci数列的第n项fib(n)fib(n)n n (n n0 0,1 1) /* /* 递归结束条件递归结束条件* */ / fib(n-2)fib(n-2)fib(n-1) fib(n-1) (n1n1) /* /* 递归方式递归方式 * */ /Date18解析C程序设计第2章 简单程序设计练习3程序#include long fib(int n); /* 自定义函数声明 */ void main() long s;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号