6.3 函数的嵌套调用和递归调用(教案)-《C语言程序设计》同步教学(电子工业版)

2024-11-18
| 6页
| 109人阅读
| 1人下载
普通

内容正文:

课程单元教案 本课编号 18 本课课时 4学时 内容提要 项目6 函数应用 任务3 函数的嵌套调用和递归调用 任务4 数组名作为函数参数 教学目的 1、掌握函数嵌套调用语法和功能。 2、掌握函数递归调用语法和功能。 3、掌握数组名作为函数参数的语法和功能。 4、掌握字符数组名作为函数参数的语法和功能。 知识能力 结构 掌握函数嵌套调用和递归调用的方法;掌握如何使用数组名作为函数参数。 教学重点 难点 重点:函数嵌套调用;数组名作为函数参数。 难点:函数递归调用。 教学手段 方法 教学方法:项目任务驱动教学法、提问式、启发式 教学手段:课堂讲授法、操作演示法、多媒体教学 思考题与 习题 1、函数递归调用适合哪种情况。 2、编写函数判断一个字符串是否是回文。 3、递归实现猴子吃桃问题。 教学内容进程设计 项目导入:综合实践6 学生成绩管理系统功能模块化设计 项目描述:利用自定义函数将学生成绩管理系统中的功能独立出来,进行模块化设计。 问题导入:如何实现学生成绩信息系统功能模块化设计? 根据课前预习及搜集的资料,对函数的概念有一个初步的了解,以方便进行下面知识内容的学习。 任务3 函数的嵌套调用和递归调用 3.1函数嵌套调用 在C语言中,不允许函数嵌套定义,但允许函数嵌套调用。 嵌套调用:在被调函数中又调用其它函数。如下图所示: 例:利用函数嵌套实现程序设计,求1!+2!+3!+4!+5! 算法分析: (1)编写求阶乘的函数f1; (2)编写求和的函数f2,嵌套调用函数f1; (3)编写主函数,其中调用函数f2; int f1(int n) //求阶乘函数 { int f=1,i; for(i=1;i<=n;i++) f=f*i; return f;} int f2(int h) //求和函数 { int i,s=0; for(i=1;i<=h;i++) s=s+f1(i); return s;} main() //主函数 { int sum; sum=f2(5); printf("s=%d ",sum);} 3.2 函数递归调用 递归调用,即一个函数在它的函数体内调用它自身。在递归调用中,主调函数又是被调函数。递归调用包括直接递归和间接递归两种,如图所示: 直接递归 间接递归 说明:(1)执行递归函数将反复调用其自身,每调用一次就进入新的一层。 (2)必须要有一个明确的递归结束条件,称为递归出口。 (3)递归是无终止的自身调用,通常用if语句控制,只有在某一条件成立时才继续执行递归调用,否则递归终止。 (4)递归调用在每次调用时,一定要更新形参的值,使之趋于递归终止,否则递归就无法结束。 例2:利用函数递归调用求5! 递归方式: int f1(int n){ //求阶乘函数 if(n==1) return 1; else return n*f1(n-1);} main() { //主函数 int s; s=f1(5); printf("s=%d ",s);} f1是求阶乘的函数,下图为求5!的递归过程: 任务4 数组名作为函数参数 4.1 数组名作为函数参数 数组名作为函数参数的定义格式如下:       类型 函数名称(类型标识符 数组名称[]) 函数调用的格式如下: 函数名称(数组名称) 例:数组中存放了一名学生5门课程的成绩,求平均成绩。 #include<stdio.h> float aver(float a[]) { int i; float ave,s=0; for(i=0;i<5;i++) s=s+a[i]; ave=s/5; return ave; } main() { float score[5],ave; int i; printf("请输入五门课的成绩:"); for(i=0;i<5;i++) scanf("%f",&score[i]); ave=aver(score); printf("平均成绩是:%5.2f ",ave); } 说明:(1)用数组名作函数参数时,形参和对应实参必须是类型相同的数组,都必须有明确的数组说明。 (2)数组名作函数参数时进行的是地址传送,即把实参数组的首地址赋予形参数组名。此时形参数组和实参数组为同一数组,共同拥有一段内存空间。 4.2 字符数组名作为函数参数 C语言中的字符串是用字符数组来存放的,需要将函数的参数定义成字符数组。 例2:编写用户自定义函数实现字符串复制功能。 #include "stdio.h" void strcopy(char str1[ ],char str2[ ]) { int i=0; while(str2[i]!='\0') { str1[i]=str2[i];i++;} str1[i]='\0';} main( ) { char s1[80],s2[80]; gets(s2); strcopy(s1,s2); puts(s1); } 将字符数组名作为函数参数时,使用的也是地址传递方式。函数调用时,形参并不分配存储空间,而是将实参的存储空间地址传递给形参,使形参指向同一存储空间。字符数组名作为函数参数的传递过程如图所示: 随堂实训练习: 1、编写函数求一组成绩中的最大数。 2、编写函数实现两个字符串的连接(不用strcat())。 3、输入两个正整数,用递归函数求两个数的最大公约数。 教学小结 1.掌握函数嵌套调用的形式、用法。 2.掌握函数递归调用的形式、用法。 3.掌握数组名作为函数参数的格式和使用方法。 4.掌握字符数组名作为函数参数的格式和使用方法。 学科网(北京)股份有限公司 $$

资源预览图

6.3 函数的嵌套调用和递归调用(教案)-《C语言程序设计》同步教学(电子工业版)
1
6.3 函数的嵌套调用和递归调用(教案)-《C语言程序设计》同步教学(电子工业版)
2
6.3 函数的嵌套调用和递归调用(教案)-《C语言程序设计》同步教学(电子工业版)
3
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。