《图片形式的》ppt课件

上传人:tian****1990 文档编号:74608669 上传时间:2019-01-28 格式:PPT 页数:79 大小:1.59MB
返回 下载 相关 举报
《图片形式的》ppt课件_第1页
第1页 / 共79页
《图片形式的》ppt课件_第2页
第2页 / 共79页
《图片形式的》ppt课件_第3页
第3页 / 共79页
《图片形式的》ppt课件_第4页
第4页 / 共79页
《图片形式的》ppt课件_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《《图片形式的》ppt课件》由会员分享,可在线阅读,更多相关《《图片形式的》ppt课件(79页珍藏版)》请在金锄头文库上搜索。

1、,第7章 函数,本章内容包括 函数的基本概念和函数的定义方法; 函数的调用、函数参数和函数的值; 函数的嵌套调用; 函数的递归调用; 数组做函数参数; 变量的类型:全局变量和局部变量;静态存储变量和动态存储变量; 函数的分类:外部函数和内部函数。,1.如果有两个同学参加学生会主席的竞选,现已统计出两个人的总得分,怎么确定谁当选? (用函数来实现),提出问题,相关知识点,7.1 函数的定义、函数参数和函数的值 7.2 函数的调用,7.1.1 C语言对函数的规定,1、一个源程序文件由一个或多个函数组成 2、一个c程序由一个或多个源程序文件组成 3、c程序的执行从main函数开始到main()函数结

2、束 4、所有函数都是平行的,函数不能嵌套定义 5、函数按使用角度分:标准函数、自定义函数,按形式分:无参函数、有参函数,7.1.2 函数定义的一般形式,1、 无参函数的定义形式 类型说明符 函数名() 声明部分 语句 ,3、可以有“空函数” 类型说明符 函数名() ,2、有参函数的定义形式 类型说明符 函数名(形参列表) 声明部分 语句 ,现在我们试着写出问题1的函数。 (1) 两个数求最大值,定义两个形参x,y,从x,y中找到最大者,最大者的类型即函数类型。 可得函数的首部: int max ( int x, int y ) (2) 写出函数体,实现两个数求最大值 int max ( int

3、 x, int y ) int z; z=xy?x:y; /* z为x,y中得最大者 */ return (z); 注意:return (z)的作用是将z的值作为函数值带回主调函数中。即将最大值带回,说明: (1) 形参列表样式 : int x , int y ,注意:每个形参都有类型; (2) 函数类型原则上要求与return后表达式类型一致,如不一致,表达式类型强制转换成函数的类型; 如果函数的确不需要返回值,设为void型; (3) return语句作用,一是:带返回值到函数调用处; 二是:将流程返回函数调用处;如果该函数没有返回值,可以省略return , 最后的 也具有将流程返回调用

4、处的功能。 (4) 如何确定一个函数是否需要返回值? 想一想,我们真的将问题1完全解决了吗?,7.2 函数的调用,1、函数调用的一般形式: 函数名(实参列表); 回顾函数定义的一般形式: 函数类型 函数名(形参列表),2、C程序的一般结构: main() 语句 函数名(实参列表); /* 函数调用 */ 语句 函数类型 函数名 (形参列表) /* 函数定义 */ 函数体 return语句 ,1.如果有两个同学参加学生会主席的竞选,现已统计出两个人的总得分,怎么确定谁当选? (用函数来实现),解决问题,例7.1求两个数的最大值。 main() int a,b,c; a=12; b=34; c=m

5、ax(a,b); /* 函数调用 */ printf(“max=%dn”,c); int max ( int x, int y ) /* 函数定义 */ int z; z=xy?x:y; return (z); ,分析例7.1的执行过程,a,b,12,34,x,y,12,34,主函数开始执行,定义变量a,b,c,a,b赋初值,主函数执行下述语句时, c=max(a,b); 传值给被调用函数 int max( int x, int y),被调用函数开始执行,定义变量z,z存放最大值,c,z,主函数执行下述语句 z=xy?x:y;,34,被调用函数执行下述语句时, return (z); 带返回值

6、z给主函数 c=max(a,b);,34,注意 被调函数执行完,主函数继续执行,输出最大值。 printf(“max=%dn”,c);,2.设某班50人,写一程序统计某一单科成绩各分数段的分布人数,每人的成绩随机输入,并要求按下面格式输出统计结果(“*”表示实际分布人数)。 059 * 6084 * 85100 *,问题的深化,算法思想: (1) 定义一个输出n个“*”的函数。 (2) 在main函数中统计各分数段的人数,分别用n1,n2,n3来存放 (3) 在函数调用时,n1作实参,传给形参n,输出059的分布人数,n2作实参,传给形参n,输出6084的分布人数,n3作实参,传给形参n,输出

7、85100的分布人数。,例7.2 成绩分布情况(为简化问题,我们输入10个成绩) #include void star(int n) int i; for (i=0;in;i+) printf(“*“); printf(“n“); ,main() int i,j,n1,n2,n3,score; i=1; n1=n2=n3=0; while ( i=0 ,1.猜年龄。5个小朋友排着队作游戏,第1个小朋友10岁,其余的年龄一个比一个大2岁,第5个小朋友的年龄?,提出问题,相关知识点,7.3 函数的嵌套调用 7.4 函数的递归调用,7.3 函数的嵌套调用,嵌套调用的定义: C语言的函数调用可以嵌套,

8、即在调用一个函数的过程中,可以再调用另一个函数;,例如: int f1(int n) main() int y; int a; if (n5) y=f2(n); scanf(“%d”, ,7.4 函数的递归调用,1、什么是递归调用 递归就是某一事物直接或间接地由自己组成。 故在调用一个函数的过程中,又出现直接或间接地调用 该函数本身,称为函数的递归调用; 2、递归的方式:直接递归、间接递归,1.猜年龄。5个小朋友排着队作游戏,第1个小朋友10岁,其余的年龄一个比一个大2岁,第5个小朋友的年龄?,解决问题,算法思想: 设age(n)是求第n个人的年龄,那么,根据问题1的题义,我 们可知: age

9、(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=10,可以用数学公式表述如下: 10 (n=1) age(n)= age(n-1)+2 (n1),下面用图表示求第5个人年龄的过程。,例7.3问题1的源代码: age ( int n ) /* 求年龄的递归函数 */ int c; /* c用作存放函数的返回值的变量 */ if ( n=1 ) c=10; else c=age(n-1)+2; return c; main() printf(“age(5)%d”,age(5); ,采用递归方法求1+2+3+n的

10、和. 该问题的递归公式: 1 (n=1) sum(n)= sum(n-1)+n (n1) 当n为1时,函数值为1是递归出口.,采用递归方法求n!. 该问题的递归公式: 1 (n=1或n=0) Fia(n)= Fia(n-1)*n (n1) 当n为1或0时,函数值为1是递归出口.,2.计算机协会在举办“数学趣味游戏”,老师对婷婷说,我给你一个整数,若它是偶数,将它除以2;若它是奇数,将它乘以3加1。得到的结果再继续判断,是偶数,除以2;是奇数,乘以3加1,最后,看看这个数变成几?你会发现,不管我给你的是什么数,最终,它会变成1。现在,你编程验证以下。,问题的深化,算法思想: 这是“角谷猜想”的问

11、题。 (1) 输入一个整数 (2) 如果是,转(4)结束。否则转(3) (3) 如果是偶数,;否则;转(2) (4) 输出 从中可以看出是递归出口,用递归函数实现第(3)步,例7.4 角谷猜想 main() int n; printf(“input a number:“); scanf(“%d“, ,3.相传古代印度布拉玛神庙中有一个僧人,他每天不分白天黑夜,不停地移动那些圆盘,据说,当所有64个圆盘全部从一根杆上移到另一根杆上的那一天就是世界的末日。这就是著名的汉诺塔(Hanoi)问题。如图:一次只能移动一个盘,且不允许大盘放在小盘的上面。,自主学习,算法思想: 怎样编写这种程序?思路上还是

12、先从最简单的情况分析起, 搬一搬看,慢慢理出思路。 1、在A柱上只有一只盘子,假定盘号为1,这时只需将该盘从A搬至C,一次完成,记为 move 1 from A to C,2、在A柱上有二只盘子,1为小盘,2为大盘。 第(1)步将1号盘从A移至B,这是为了让2号盘能移动; 第(2)步将2号盘从A移至C; 第(3)步再将1号盘从B移至C; 这三步记为: move 1 from A to B; move 2 from A to C; move 3 form B to C;,3、在A柱上有3只盘子,从小到大分别为1号,2号,3号 第(1)步将1号盘和2号盘视为一个整体;先将二者作为整体从A移至B,给

13、3号盘创造能够一次移至C的机会。这一步记为 move( 2, A, C, B); 意思是将上面的2只盘子作为整体从A借助C移至B。 第(2)步将3号盘从A移至C,一次到位。记为 move 3 from A to C; 第(3)步处于B上的作为一个整体的2只盘子,再移至C。这一步记为 move( 2, B, A, C); 意思是将2只盘子作为整体从B借助A移至C。,4、从题目的约束条件看,大盘上可以随便摞小盘,相反则不允许。在将1号和2号盘当整体从A移至B的过程中move(2, A, C, B) 实际上是分解为以下三步 第(1).1步:move 1 form A to C; 第(1).2步:mo

14、ve 2 form A to B; 第(1).3步:move 1 form C to B; 经过以上步骤,将1号和2号盘作为整体从A移至B,为3号盘从A移至C创造了条件。同样,3号盘一旦到了C,就要考虑如何实现将1号和2号盘当整体从B移至C的过程了。实际上move(2, B, A, C)也要分解为三步: 第(3).1步:move 1 form B to A; 第(3).2步:move 2 form B to C; 第(3).3步:move 1 form A to C;,5、看move(2, A, C, B)是说要将2只盼自从A搬至B,但没有C是不行的,因为第(1).1步就要将1盘从A移到C,给

15、2盘创造条件从A移至B,然后再把1盘从C移至B。看到这里就能明白借助C的含义了。因此,在构思搬移过程的参量时,要把3个柱子都用上。,6、定义搬移函数move(n, A, B, C),物理意义是将n只盘子从A经B搬到C move(n, A, B, C) 分解为3步 (1)move(n-1, A, C, B)理解为将上面的n-1只盘子作为一个整体从A经C移至B; (2)输出n:A to C,理解将n号盘从A移至C,是直接可解结点; (3)move(n-1, B, A, C)理解为将上面的n-1只盘子作为一个整体从B经A移至C。 这里显然是一种递归定义,当解move(n-1, A, C, B)时又可想到,将其分解为3步: 第1步:将上面的n-2只盘子作为一个整体从A经B到C,move(n-2, A, B, C); 第2步:第n-1号盘子从A直接移至B,即n-1:A to B; 第3步:再将上面的n-2只盘子作为一个整体从C经A移至B,move(n-2, C, A, B);,源代码:,int step=1 ; /* 整型全局变量,预置1,步数 */ void move(int , char ,char,char); /* 声明要用到的被调用函数 */ void main() int n;

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

当前位置:首页 > 高等教育 > 大学课件

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