沪版新教材项目式教学案例
2019-11-20候继仓孙波
候继仓 孙波
项目情境分析
本案例选自上海科技教育出版社的教材《信息技术(必修1 数据与计算)》第三单元算法与程序设计之项目七:以计算圆周率为例——设计简单数值数据算法。该项目通过设计简单数值型数据算法解决计算圆周率问题,对程序三种控制结构进行深入探究,并通过比较不同算法的运行时间感受算法效率,引导学生主动对程序或算法进行优化。本项目引导学生利用计算机科学领域的思想方法界定问题,抽象特征,并能设计合理的算法形成解决问题的方案,有效促进计算思维素养的逐步养成。
圆周率π是一个在数学及物理学中常用的数学常数,它是圆的周长与直径的比值,也等于圆的面积与半径平方之比。π是一个无限不循环小数,可以借助计算机编程,利用欧拉公式、沃利斯公式及随机投点法等方法来计算圆周率,并可比较不同算法的效率,有意识地对算法和程序进行优化。
项目活动安排
1.活动1:用沃利斯公式计算圆周率
活动要求:
(1)给出几个简单的累乘或累加公式,如5!=5*4*3*2*1,s1=1+3+5+7+9,s2=1+1/2+1/4+1/8+1/16+1/32,分别讨论它们的通项及累乘或累加变量的初值。
(2)分析沃利斯公式可知,这是一个累乘问题,通过观察找出通项公式,确定累乘变量的初值,确定控制循环的方法。注意:通项公式并不唯一,因此累乘变量初值和循环控制方法也会相应发生改变。
(3)分组讨论,结合循环控制方法,分别用自然语言和流程图描述沃利斯公式求解π的算法。
(4)根据小组讨论确定的算法,使用for循环或while循环编写Python程序,并调试运行。
2.活动2:对比两种计算圆周率的算法
活动要求:
(1)改写数学公式法求解圆周率的程序设计,要求可以输入精确度要求,并输出运行时间。
(2)多次运行程序,改变limit的值,得到不同的圆周率近似值,并在表格3-4中记录每次的运行结果。
(3)改写随机投点法的程序,要求可以输入总投点数,并输出运行时间。
(4)多次运行程序,改变总投点数,得到不同的圆周率近似值,并用表格3-4记录每次的运行结果。
(5)对比两种算法计算圆周率的运行情况,并填写表格3-5。
3.拓展思考
(1)用欧拉公式和沃利斯公式计算圆周率的时候,对累加器或累乘器变量初值的设置有什么不同?
(2)在随机投点法中,随着总投点数的增加,圆周率的值有什么变化?如何使圆周率的值更加精确?
(3)在日常生活中,哪些事情是反复操作的?类似于本节课学习的循环程序设计,你能举两个例子吗?
4.活动实施说明
(1)圆周率π是一个在数学及物理学中常用的数学常数,在这个问题的计算上,一代一代的数学家贡献出了自己的智慧,本项目中分别给出了欧拉公式、沃利斯公式和计算机模拟随机投点法来计算圆周率,让学生通过Python编程来实现用计算机从不同的方法和角度来解决问题,并对解决问题的效率进行比较,从而实现“运用基本算法设计解决问题的方案,能使用编程或其他数字化工具实现这一方案”的目标。
(2)活动1的难点是提取问题的基本特征,进行抽象处理,并用形式化的方法表述问题,重点是设计算法、理解并掌握如何构建一个循环结构来解决问题。该项目适用于学科核心素养要求在水平2的教学场合。
在本活动中,s=s*item这个式子为累乘的通项公式,对上述沃利斯公式来说,item的一种表示方式是item=(i/(i-1))*(i/(i+1)),i从2开始,每次增加2。解决本问题需要重复进行的工作就是:①构造item值,即item=(i/(i-1))*(i/(i+1)),i=i+2;②累乘item到s,即s=s*item。这里的循环控制条件是变量i的值达到指定值。i的初值为2,终值自己设定,每次加2。上述累乘算法可用自然语言描述,具体如图1所示。
活动1中用流程图描述算法时,要注意强调循环结构的画法,如图2所示。
(3)分别用for循环和while循环的程序设计实现沃利斯公式计算圆周率,对比两种循环的不同点(如图3)。本次两种循环均为确定次数的循环,for循环此时采用遍历结构中元素的个数来体现。while循环可以实现确定次数的循环,也可以实现不确定次数的循环。
(4)活动2是在活动1的基础上进行的,通过对两种算法做简单的改写和对比,让学生学会分析问题,确定算法,并正确组织问题解决过程中涉及的各种数据,体验不同算法的效率。程序中涉及到了Python对函数库的引用方法,格式是:from〈库名〉import〈函数名〉。
Python语言中time库是处理时间的标准库,math库用于进行科学计算,均为Python自带库,安装好Python之后可直接导入,不需另外安装。clock()函数以浮点数计算的秒数返回当前的CPU时间。两次调用clock()用来衡量不同程序的耗时。
(5)程序中用到了关系与运算符,特别要注意的是,Python中使用“=”表示赋值语句,使用“==”表示“等于”。此外,Python语言中支持连续比较,如判断x是否为100和200之间的一个数,其表达式为:100<=x>=200。
(6)注意在完成表3-4时会发现,运行程序,输入相同的limit值,会得到相同的pi的值,但是每次得到的运行时间是不一样的,这与系统运行的外部环境相关。在完成表格3-5时,应该强调这一比较的前提是在数据规模相同的情况下进行的。
(7)拓展思考(1)的意义在于让学生理解在用计算机解决相同问题时,根据算法的不同,其初值的設置是不一样的。拓展思考(2)是为了让学生体验随机投点法在数据量较小的情况下,不确定性很大,但是随着数据规模的增大,结果也越来越精确。拓展思考(3)是为了实现知识的迁移,总结利用计算机解决问题的过程和方法,并迁移到与之相关的其他问题解决中去。
项目学习目标
1.学科核心素养目标
能够采用计算机科学领域的思想方法界定问题、抽象特征;运用合理的算法形成解决问题的方案;总结利用计算机解决问题的过程和方法,并迁移到与之相关的其他问题的解决中。
2.内容目标
从生活实例出发,概述算法的概念与特征,运用恰当的描述方法和控制结构表示简单算法。掌握一种程序设计语言的基本知识,使用程序设计语言实现简单算法。通过解决实际问题,体验程序设计的基本流程,感受算法的效率,掌握程序调试与运行的方法。
3.学业目标
依据解决问题的需要,设计和表示简单算法;掌握一种程序设计语言的基本知识,利用程序设计语言实现简单算法,解决实际问题。
4.课时建议
活动1共2课时,建议连堂进行。活动2在活动1进行完之后开展,时间为2课时。