《C语言程序设计基础》教案第18课函数的使用(二).docx
教案首页周次第周时间年月日专业班级:授课章节单元7:函数的使用(二)授课方式理论课口实验课口实训课教学做一体化课程日教学时数2学时,教学目的理解函数递归调用及实现过程,会使用带参数的宏,掌握函数与变量的作用域及存储类型。教学组织教学内容教学过程设计及时间分配1 .函数的递归2 .带参数的宏3 .函数的作用域及存储类型4 .变量的作用域及存储类型5 .案例与实践操作1 .复习讲授互动10分2 .函数的递归讲授15分3 .带参数的宏演示、讲授10分4 .函数的作用域与存储类型演示、操作15分5 .变量的作用域与存储类型演示、讲授25分6 .随堂练习案例10分7 .小结、作业及实验安排讲授5分教学重点重点:函数的递归调用难点:带参数的宏教学难点教学手段理论讲授、演示、对比讲解、案例分析双语教学recursion递归parameter-参数作业及思考题作业:单元总结与单元练习知识拓展:模块化程序设计参考资料1 .谭浩强主编的C语言程序设计(清华大学出版社)。2 .丹尼斯里奇C语言程序设计(第二版)。3 .NCRE考试用教程C语言程序设计(高等教育出版社)。4 .网络教学资源:国家精品课网站。本讲内容学法指导对于函数递归的使用,首先要理解函数的定义,在此基础上理解自身调用自身,使用画图等形式,对递归有深刻一些的理解。课程:C语言程序设计学年第学期授课教师:单元7-2函数的使用(教案)教学内容及教学过程说明步骤一复习函数的定义函数的调用函数的参数传递步骤二讲授7.3函数的递归7.3.1递归问鹿的引入【例77】自定义函数SUm实现自然数求和:sum=7o根据以前所学内容,编写程序代码如下:互动intsum(intn)return(l+n)*n2;或intsum(intn)inti,s;fbr(i=I;i<=n;i+)s=s+i;returns;现在从另一个角度去分析。自然数求和是一个等差数列求和,数列求和过程存在这样一个递归关系:前n项和等于前n-1项的和加上n,所以求和过程可以描述成如下公式:,、1(=1)sum(n)=sum(n-1)+«(n>1)根据公式可以看出:(1) 如果n=l,则SUm(I)=1,返回结果1;(2) 如果n>L则sum(n)=sum(n-l)+n»返回结果sum(n-l)+n。由此可以对自定义函数sum重新描述如下:实例intsum(intn)if(n=l)return(l);elsereturn(sum(n-l)+n);自定义函数sum在函数体中出现了对自身调用的语句return(sum(n-l)+n)5,像这样的函数调用就称为函数递归调用。将本例程序代码进行完整描述,然后分析一下函数递归调用的过程。特殊说明#include<stdio.h>intsum(int);/函数声明voidmain()intn,s=0;scanf("%d"n):s=sum(n);函数调用printf("s=%dn",s);)intsum(intn)函数定义if(n=l)retum(l);elsereturn(sum(n-l)+n);)重点732使用函数递归解决问题使用递归方法解决问题的关键是如何找出递归关系,又如何使递归调用结束,不至于无限期地调用下去,即给出递归调用的终止条件。所以使用递归方法解决问题的第一步就是建立递归关系;第二步就是找出递归调用的终止条件。【例78用递归方法求fac(n)=n!°程序实现代码如下:初学者易犯的错误分析引导#include<stdio.h>inifac(intn)函数定义if(n=三1n=0)return1;elsereturnn*fac(n-l);)voidmain()intn,m=1;Printf(“请输入一个非负整数:");难点重点重点分析注意启发难点scanf("%d"n);m=fac(n);函数调用printf("%d!=%dn",n.m);)7.4用带参数的宏定义代替公式型函数在【例7-5】中定义了一个求两个整数中最大值的函数max,通过函数定义可以看出,最大值的求得是通过一个公式型的表达式实现的,即z=x>y?x:y;o象【例7-5】这样,通过一个公式表达式来求得函数返回值的函数称为公式型函数。类似还有计算圆的周长(L=211r)圆的面积(S=11r2)等。【例79】用带参数的宏定义求两个数的最大值。#include<sidio.h>#defineMAX(x,y)x>y?x:y用带参数的宏定义求两个数的最大值voidmain()(inta,b,c;Printf("请输入两个整数:”);scanf("%d%d",&a,&b);c=MAX(a,b);Printf("最大值为:%d.n',c);)带参宏定义的一般形式为:#define宏名(形参列表)字符串说明:(1) 宏名一般用大写字母表示。(2) 形参列表中的形参多于一个时,各个参数之间用逗号隔开,形参不分配内存单元,因此不必作类型定义。(3) 字符串中要用到形参列表中的各个形参。带参宏调用的一般形式为:宏名(实参表“7.5函数和变的作用域及存储类型7.5.1 函数的作用域及存储类型此时函数定义的形式如下所示:存储类型函数返回值类型函数名(形式参数列表)函数首部(函数体;)函数的存储类型默认为extern,extern型函数称为“外部函数”,static型函数称为“内部函数”,也称为“静态函数”。7.5.2变的作用域1 .局部变量局部变量也称为内部变量。局部变量是在函数内定义并使用的,之前各单元的程序中用到的变量均属于局部变量。2 .全局变量全局变量也称为外部变量,它是在函数外部定义的变量,其作用域是整个源程序文件,也就是说整个源程序文件中的各个函数均可使用。全局变量定义的一般形式为:注意启发重点extern类型说明符变量名Il=初始值1,变量名2匚初始值2,;7.5.3变的存储类型变量的存储方式有“动态存储”和“静态存储”两种。动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。静态存储变量通常是在程序编译时就分配存储单元并一直保持不变,直至整个程序结束。前面所讲到的全局变量即属于此类存储方式。动态存储变量包括auto(自动变量)和register(寄存器变量)两种存储类型;静态存储变量包括extern(全局变量)和StatiC(静态变量)。因此变量定义的完整形式应为:存储类型说明符数据类型说明符变量名,变量名;步骤三课堂小结1.递归调用2.作用域步骤四实验与作业1.实验内容(D【例7-例】利用VC环境实现该程序(3)实训指导34教学总结