计算思维培养的“递进式”活动设计研究
王静文 淄博实验中学 255090
崔国亮 淄博实验中学 255090
高中信息技术新教材的编程和算法教学注重培养学生的计算思维,体现了新课标发展学生核心素养和学科能力的理念。本文旨在探究如何在课堂教学中设计丰富的学习活动、培养学生的计算思维,并引导学生产生思维迁移以解决实际问题。
一、递进式培养策略概述
信息技术学科与时俱进,不再局限于知识技能和工具操作,而注重培养学生数字化环境下的思维方式,使学生能够合理运用信息技术解决实际问题。为了培养学生的计算思维,新教材的编程和算法教学采用项目式学习方式,让学生在做中学、在学中做。在项目式学习中,应用和实践是学习的载体,活动过程即获得知识和培养能力的过程。
高一学生以前没有接触过Python编程,面对具体的情境,学生能用自己的话说出解决问题的方法,但不知如何用计算机程序实现。比如,判断一个数的奇偶性,通常看它能否被2整除;转换成编程计算,则采用对2取模的方法,判断余数是否为0。学生的计算思维需要慢慢形成,可以从解决简单的问题开始培养,让学生在学习活动中一边熟悉基本语法,一边提升思维能力。
在教学中不断摸索,体会“用教材教”,而不是“教教材”。教材中的资源一般具有普适性,是优质资源,但是不一定满足所有学生的需求。教师可以根据学情,补充相关资源。因此,依据教材资源并结合信息学竞赛辅导资源,设计一系列学习活动,作为教材的补充,可以让活动内容由浅入深,在活动开展过程中递进式地培养学生的计算思维。
二、学习活动一脉相承
依据项目式学习因“需”定“学”的特点,基于课程标准,结合学生的学情,我们对教科版必修1《数据与计算》第2单元“编程计算”的教学内容进行整体规划,设计了一系列递进式学习活动。
活动1:求一个三位正整数每位上的数字
设计意图:理解通过整除和取模等运算拆分数字的方法;学会定义变量、使用赋值语句。拆分数字的方法也将用于后面的问题解决中。
算法分析:利用 “//”和“%”等算术运算符拆分一个三位数,分别得到每位上的数字。
小结:程序设计采用顺序结构。学生需要区分数学与Python中算术运算符的表示方法与运算功能。
活动2:输入一个三位正整数,判断它是不是回文数。若一个数字从左向右读与从右向左读都一样,我们就将其称之为回文数。
设计意图:结合前面拆分数字的算法提取出百位数和个位数,判断它们是否相等;熟练使用if分支语句进行条件判断。
算法分析:如果数字n的百位数字h和个位数字u相等,则n是回文数,否则不是。
小结:程序设计采用分支结构。学生已经掌握拆分数字的方法,在此基础上,设计判断回文数的算法变得容易一些。
活动3:反转任意位数的正整数,例如:输入123,输出321。
设计意图:理解反转数字的算法思想;了解while语句一般用于循环次数未知的情况。
算法分析:
(1)将x除以10取余,求得个位数,并将它添加到y中;
(2)将x除以10取整,去掉个位数;
(3)重复步骤(1)(2)直到x为0。
(4)输出y
小结:程序设计采用循环结构。算法中不仅包含拆分数字的方法,还包含组合数字的方法,具有一定的难度。活动中教师和学生一起将流程图补充完整,然后学生独自将程序补充完整。
活动4:输出所有的“水仙花”数。所谓的“水仙花数”是指一个三位数其各位数字的立方和等于该数本身 。
设计意图:枚举所有的三位数,使用拆分数字的方法,得到各位数字,然后通过计算进行判断;综合运用for循环和分支语句解决问题。
小结:解决这个问题采用了循环+分支的程序结构。学生学习的难点是for语句的循环过程和if语句条件的设置。学生需要注意:range()函数设置两个参数时,会生成一个左闭右开的数字区间;在if语句的条件中两个等号一起使用才能判断相等。
活动5:火柴棒摆数字问题。有任意数量的火柴棒,列出这些火柴棒所能摆出的自然数,要求火柴棒正好用完。
设计意图:在解决问题的过程中,学会使用自定义函数进行程序设计。通过对算法进行优化,学生加深对算法设计的理解。
算法分析:首先确定任意根火柴棒所能摆出的最大数字,火柴棒数量分为奇偶两种情况,偶数根能摆出的最大数字由snum//2个1组成;奇数根火柴棒则先取出三根摆放数字7,然后用剩余的火柴棒摆放(snum//2-1)个1。参考程序如下:
def match_num(num): #计算一个数字需要多少根火柴棒 f=[6,2,5,5,4,5,6,3,7,6] if num==0: total=f[0] else: total=0 while (num>0): x=num % 10 total=total+f[x] num=num//10 return total | #主程序 snum=int(input('请输入火柴棒数量:')) if snum%2==0: n=snum//2 maxnum=int(n*'1') else: n=snum//2-1 maxnum=int('7'+n*'1') print("你可以拼出这些数字:") for i in range(maxnum+1): if match_num(i)==snum: print (i) |
算法优化:上述程序中使用“*”运算符返回一个重复若干次的字符串,在Python语言中适用,在VB和C++等语言中都不适用。运用for循环计算任意根火柴棒所能摆出的最大数字,会使算法更加通用,而且不会增加算法的时间复杂度。相应代码修改如下:
if snum%2==0:
maxnum=0
n=snum//2
else:
maxnum=7
n=snum//2-1
for i in range(n):
maxnum=maxnum*10+1
小结:在程序设计中使用了自定义函数。理解自定义函数的难点是函数的调用过程:程序执行从主程序开始,在主程序中遇到自定义函数的调用语句时,才会转到自定义函数执行,自定义函数执行完成将返回值带回给主程序。
拓展活动:十进制转换R进制
算法分析:把十进制非负整数转换为R进制,可使用短除法,即“除R取余,逆序排列”。前面拆分十进制数字重复执行对10取余、再整除10的操作;而十进制转换R进制则重复执行对R取余、再整除R的操作。
小结:十进制转换二进制本来是一个难点,学生不易理解,但是在前面解决了一系列数字问题之后,将解决问题的思维迁移过来,这个问题就迎刃而解了。
在以上活动中所设计的的程序从顺序结构到分支结构、循环结构,再到分支+循环结构,程序结构不断升级。简单的拆分数字方法在后面的活动中不断使用,探究内容保持在学生的最近发展区内。在课堂上,学生积极思考、寻找解决问题的方法。编写代码、调试程序、纠正错误的过程,也使学生感受到编程的乐趣,激发了学生的学习兴趣。
三、教学反思贯穿始终
学生在学习编程与算法之前,可能存在畏难情绪,认为程序代码晦涩难懂,算法设计比较复杂,通过整体规划学习活动,引导学生步步为营,在算法学习中找到乐趣。算法教学是一项连续性工程,学生计算思维的形成也不是短期能实现的,这就需要教师不断反思、不断摸索,梳理教学思路,形成系统的知识框架,引领学生踏上算法学习之路,在路上递进式地培养学生的计算思维。
(本文系山东省淄博市教育科学重点课题“高中学生信息素养的现状调查及提升策略的研究”研究成果之一。)