内容正文:
课程单元教案
本课编号
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.掌握字符数组名作为函数参数的格式和使用方法。
学科网(北京)股份有限公司
$$