《中职《C语言程序设计》教案第10课输出100以内的素数.docx》由会员分享,可在线阅读,更多相关《中职《C语言程序设计》教案第10课输出100以内的素数.docx(5页珍藏版)》请在优知文库上搜索。
1、课题输出100以内的素数课时2课时(90min)教学目标知识目标:(1)掌握函数的嵌套调用和递归调用方法(2)掌握局部变量和全局变量的区别和典型用法(3)了解变量的存储类别能力目标:逐步建立模块化的程序设计思想素质目标:发扬精益求精的工匠精神,养成严谨认真的工作态度教学重难点教学重点:函数的嵌套调用,函数的递归调用,局部变量与全局变量,变量的存储类别教学睚点:函数递归调用的构建教学方法问答法、讨论法、i并授法、实践法教学用具电脑、投影仪、多媒体课件、教材教学过程主要教学内容及步骤课前任务【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过APP或其他学习软件,完成课前任务同学们已经学过
2、了if-else语句的嵌套,请同学们以此类比,有找函数嵌套的定义。【学生】完成课前任务考勤【教师】使用APP进行签到【学生】班干部报请假人员及原因问题导入【教师】请同学们扫码观看“如何判断素数”视频(详见教材),讨论并回答以下问题:什么是素数,判断一个数是否为素数的流程图如何绘制?【学生】思考、举手回答传授新知【教师】讲解函数的嵌套调用,函数的递归调用,局部变量与全局变量,变量的存储类别一、函数的嵌套调用【教师】多媒体观看“函数的嵌套调用“视频(详见教材),让学生理解函数嵌套调用的概念,函数嵌套调用的使用方法C程序中函数的定义是相互平行的,在定义函数时,一个函数不能包含另一个函数。但是,一个函
3、数在被调用的过程中可以调用其他函数,即可以嵌套调用.【课堂练习】【教师】出示【例5-4】,组织学生编写代码使用函数的嵌套调用,计算两个正整数m和n的最小公倍数。*【学生】编写程序、运行、对比结果【教师】解析例题假设计算m和n的最小公倍数和最大公约的函数分别为sct(m,n)和gcd(m.n)由数学知识可知,两个正整数m和11的最小公倍数等于两数之积除以它们的最大公约数,公式为sct(m,n)=gcd(m,n)因此,定义主函数调用sct()函数,sct()函数再调用gcd()函数。(参考程序详见教材)【运行结果】程序运行结果如图5-6所示(详见教材)【程序说明】由于SCd()函数的定义在主函数之
4、后,所以在主函数的开始要对SCd()函数进行声明;同样,在scd()函数的开始也要对gcd()函数进行声明。二、函数的递归调用*【教师】多媒体观看“函数的递归调用”视频(详见教材),让学生了解函数递归调用的形式,递归调用的使用方法【课堂讨论】*【教师】请学生分组讨论以下问题请同学们以小组为单位,讨论函数嵌套调用时,自己是否可以调用自己?【学生】讨论、总结、回答【教师】总结学生的回答递归调用分为直接递归调用和间接递归调用两类。直接递归调用是在调用f()函数的过程中直接调用f()函数;间接递归调用是在调用R)函数的过程中调用1()函数,而在调用fl()函数的过程中又调用f()函数。【课堂讨论】【教
5、师】请学生分组讨论以下问题请同学们继续以小组为单位,讨论函数嵌套调用时,无终止地调用自身,会导致什么后果,及如何避免这种情况的发生。*【学生】讨论、总结、回答【教师】总结学生的回答【课堂练习】【教师】出示【例55】,组织学生编写代码用递归调用方法求s=l+2+3+.+n的值。*【学生】编写程序、运行、对比结果【教师】解析例题这是一个等差数列求和的问题,故前n项的和为前n-1项的和加上n编写程序,可定义一个函数sum(),其返回值为sum(n-l)+n,当n=l时,其返回值为1.(参考程序详见教材)【运行结果】程序运行结果如图5-9所示(详见教材)三、局部变量与全局变量【教师】介绍变量作用域的概
6、念,局部变量与全局变量的定义任I可变量都有其有效作用范围,称为变量的作用域。根揄乍用域的不同,可将变量分为局部变量和全局变量。1 .局部变量局部变量也称“内部变量,它是在函数内定义并使用的,之前程序中用到的变量绝大多数属于局部变量。2 .全局变量全局变量也称外部变量,它是在函数外部定义的变量,全局变量可以为本文件中其他函数所共有。它的有效范围从定义变量的位置开始,到本源程序文件结束。全局变量提供了函数间数据联系的渠道,有效地解决了函数只能通过retu111语句带给主调函数一个运算结果的问题。【课堂练习】【教师】出示【例56】,组织学生编写代码分析以下程序的运行结果。*【学生】编写程序、运行、对
7、比结果【教师】解析例题(参考程序详见教材)【运行结果】程序运行结果如图5-10所示(详见教材)【程序分析】在此程序中,定义了两个名为c的变量。在函数f()中使用的变量c是全局变量,故输出3;在主函数中定义的变量c是局部变量,全局变量c失效,故输出5。小提示(1)主函数中定义的变量是局部变量,只在主函数中有效。同样,主函数也不能使用其他函数中定义的变量。(2)函数的形参也属于局部变量,作用范围仅限于函数内部。(3)在不同函数中,可以使用相同名字的局部变量,它们代表不同的对象,互不干扰。(4)在一个函数中既可以使用本函数中的局部变量,也可以使用有效的全局变量。但当全局变量与局部变量同名时,在局部变
8、量的作用范围内,全局变量不起作用。(5)虽然全局变量可以加强函数间的数据联系,但降低了函数的独立性,因此,宙陇要时尽量不用全局变量.四、变量的存储类别【教师】介绍变量的存储方式,变量的定义形式,定义不同存储类型变量的注意事项变量的存储方式有“动态存储和静态存储两种.动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,函数调用完毕立即释放。如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元.静态存储变量通常在程序编译时就分配了存储单元并一直保持不变,直至整个程序结束。前
9、面所讲到的全局变量即属于此类存储方式.【课堂问答】*【教师】随机遨请学生回答以下问题请同学们思考,动态存储变量与静态存储变量最大的区别在什么地方?*【学生】聆听、思考、回答【教师】总结学生的回答动态存储变量包括自动变量(auto海口寄存器变量(register)两种,静态存储变量包括全局变量(extern)和静态变量(static)两种。因此,变量定义的完整形式如下:存储类型说明符数据类型说明符变量名,变量名;例如,以下语句定义了不同存储类型的变量。autocharcl,c2;/*定义cl,c2为自动字符变量,aulo可以省略*/registerinti;/*定义i为整型寄存器变量*/exte
10、rndoublemax;/*定义max为double类型全局变量*/staticinta,b;/*定义a,b为静态类型变量*/定义不同存储类型的变量时,应注意以下四点.(1)自动变量的建立和撤销都是由系统自动进行的,是函数中使用得最多的一种局部变量。未进行初始化时,自动变量的值是不确定的。对同一函数进行两次调用时,两次调用之间自动变量的值是不保留的。(2)寄存器变量不是保存在内存中,而是直接存储在CPU的寄存器中,所以访问速度极快。通常,在程序中频繁使用的血或Char类型的局部自动变量和形参,可以定义为register类型变量。不同系统对register变量个数有限制。(3)全局变量全部存放在
11、静态存储区域中,在程序开始执行时给全局变量分配存储区,程序执行完毕才释放。全局变量如果没有初始化,则默认初始值为Oe(4)静态变量通常做局部变量,若希望在函数调用结束后仍然保留某局部变量的值,可以将该局部变量定义为静态局部变量。分提示(1)当一个变量被声明为静态局部变量时,编译时就会分配存储空间,在整个程序运行期间都不释放。因此,函数调用结束后,它的值并不消失。(2)静态局部变量是在编译过程中赋初值的,且只赋一次初值,在程序运行时其初值已定,以后每次调用函数时,都不再赋初值,而是保留上一次函数调用结束时的结果。(3)静态局部变量在定义时如果未赋初值,编译系统会将整型变量初始化为0,将实型变量初
12、始化为0.0,将字符型变量初始化为0.【课堂问答】【教师】随机邀请学生回答以下问题请同学们分析程序(详见教材)的运行结果?【学生】聆听、思考、回答【教师】总结学生的回答【运行结果】程序运行结果如图5-11所示(详见教材)o【程序说明】主函数中定义的k、m、P均为自动局部变量,第一次调用func()函数时,函数中的局部变量i的初值为2,静态局部变量m的初值为O,在函数调用结束时,i=i+m+l=3,m=i+a+b=8.返回m的值给主函数,故第一次输出为8由于被定义为静态局部变量,m不会在函数调用结束后释放,即m的值仍为8。在第二次调用func()函数时,i的初值为2,而m的初值为8(上次调用结束
13、时的值),在函数调用结束时,i=iml=ll,m=i+a+b=16,故第二次输出为6沙素养之窗工欲善其事,必先利其器。”意思是要做好一件事,准备工作非常重要。C语言利用函数进行程序设计,函数是学好C程序设计的重要基础。基础扎实,才能挑战未来的难题,才能行稳致远。我们要在踏实中学真知,在细节处求真理,一步一个脚印,方能学好C语言。五、任务实施*【教师】多媒体观看“输出100以内的素数”视频(详见教材),让学生熟悉该程序的设计思路,代码实现1.任务分析本任务的关键是如何判断素数。素数是指在一个大于【的自然数中,除了1和它自身外,不能被其他自然数整除的数。根据定义,测试自然数k能否被2,3,,k-1
14、整除,只要能被其中一个数整除,则k不是素数,否则是素数。由于一个数的因子不可能大于其平方根,因此可以缩小检测范围,只需判断它能否被2JF整除。定义函数isPrime()用于判断一个数是否为素数,该函数有一个整型参数,以便接收从调用函数传递过来的一个自然数,该函数的返回值为1或O,如果从调用函数传递过来的自然数是素数,则返回1,否则返回Oe定义函数Prime()用于输出100以内的素数,该函数多次调用函数isPrime(),构成了函数的嵌套调用。2 .参考程序(详见教材)3 .运行结果程序运行结果如图512所示(详见教材)。【学生】聆听、思考、理解、记录课堂实训【教师】介绍课堂实训目的、实训内容
15、,要求学生按照实训要求完成实训任务一、实训目的(1)能够声明、定义和调用用户自定义函数。(2)会使用函数的嵌套调用编写程序。(3)会定义和调用递归函数。(4)能够识别变量的作用域和生存期.二、实训内容.阅读程序,判断运行结果(详见教材)2 .程序填空(1)函数fac()的功能是使用递归法求n的阶乘(n的阶乘是所有小于等于n的正整数的积),请填空。(2)假设m是一个3位数,编写程序输出由m的个位、十位、百位反序而构成的3位数(如123反序为321).请在ProgramEnd填入若干语句,勿改动主函数或其他函数中给出的内容.(详见教材)3 .程序设计(1)编写程序,实现输入整数并求其绝对值后输出。要求:求绝对值功能用自定义函数实现。(2)编写递归函数,输出I100的所有偶数。【学生】按要求完成实训内容,并将实训过程中遇到的问题和解决办法记录在表5-1中(详见教材)课堂小结【教师】简要总结本节课的要点本次课介绍了函数的嵌套调