程序设计教学的三化策略
2013-04-29王震
王震
摘要:在高中信息技术的程序教学中,很多教师采用程序填空的方法,虽然降低了难度,但学生的学习体验效果就会差很多。那么如何合理引导,降低程序的实现难度,同时也能积极发挥学生的主观能动性,让学生在自主探究中完成自己的作品。笔者结合多年教学经验,认为对于复杂的教学用例,可以采取分步化、模块化、预处理化等教学策略,让教学用例“高举低打”,实现学生程序设计能力的提升。
关键词:教学用例;分步化;模块化;预处理化
● 分步化策略
程序设计是一门相对抽象的学科,教师需要为学生提供一些可以实践的任务,让他们在多次的操作体验中掌握语法的使用,构建起知识体系。但对初学者来说,如果一个大任务一次性提出来,当学生缺乏编程经验时会难以接受。如果一个任务是在教师手把手的指导下完成的,学生失去探索的机会。因此可以考虑进行大任务有序分步处理。在具体操作中,教师将任务分解为有代表性的、相互独立的子任务,考虑子任务之间的关系和学生的认知顺序,将子任务依次展开,学生通过自主探索,一一实现,最终完成整个作品。
例如,在“对象、属性、事件”一节中,如果教师只对每个概念进行举例和阐述,让学生明白三个概念及意义,效果不理想,而采用任务驱动法,让学生根据任务逐一实践体验将达到事半功倍的教学效果。以下是笔者在这一节教学时选用的任务,以及分步化方法。
设计一个程序,要求:单击按钮时显示“Hello 老师”,单击窗体时显示“Hello 大家好”,单击标题时显示“Nice to meet you”,双击窗体时显示还原为“Hello world”。
这个用例的优点是代码量小,容易实现,同时程序的变化也比较丰富,容易激发学生的学习兴趣。然而,此时学生对各种对象、属性、事件还没完全理解,这样的任务对于大部分学生来说是相当困难的。因此,在实际教学中,首先提出的任务是:单击“改变”按钮时,显示“Hello 老师”,因为单击按钮是最常见的一个操作,以此入手简化难度。通过引导使学生对上述三个概念有了直观印象后,再提出“单击窗体”的任务,并引导学生分析现在事件的对象发生变化,变为“窗体”了,应该编写Form1.Click事件。接着提出“单击标签”任务,此时,几乎无需教师指点,学生已经明白怎么做了。最后,再提出“双击窗体”的任务,学生用刚才的方法不能解决问题,此时,教师引出双击事件“DblClick”。如此,逐一扩展对象和事件外延,对于学生准确理解这些概念很有帮助,通过这样一个任务,学生对VB面向对象、事件驱动的特性感悟更深。
任务的分步化,要考虑将任务分成哪几步,以什么顺序展开,教师要尽量考虑学生现有水平和任务本身顺序特点,设计出符合认知习惯,便于知识构建,由简到难的任务序列。
● 模块化策略
模块化是指解决一个复杂问题时自顶向下把系统划分成若干模块的过程。程序设计有两种顺序,一种是自顶向下,一种是自底向上,对于初学者来说,模块化自顶向下更容易接受,也更符合程序项目设计的一般步骤。自顶向下,往往先将任务划分成几个模块,每个模块还可以划分成更小的模块,学生只要将各模块一一编程实现,就会得到最终作品,模块化降低了问题解决的难度。
例如,综合实践课时,笔者布置了“益智游戏”的任务,任务为:在下页图中,一开始部分电灯是灭的,有随机的若干盏灯是亮的。通过程序能显示用户操作已用总时间。游戏的目标是用最少的开关操作次数将所有电灯变亮。
分析发现,这是一个相当复杂的任务,如果不加引导学生会无从下手,因为学生还缺乏模块化的思维。在此,将任务分解为三个模块:“初始化模块”、“计时模块”、“用户响应模块”。其中,第三部分是本任务中最重要,也是最复杂的部分。教师引导学生体验:处理复杂问题最有效的方法就是模块化,将一个大任务分解成几个小任务,将一个大问题化解为几个小问题。将本模块分成几个子模块:灯和开关状态控制模块、操作步数累加模块、游戏是否完成的判断模块。主要子模块实现描述如下:
灯和开关状态控制模块:
If Index <> 1 Then
For i = Index To 10 Step index
If Image1(i).Visible = False Then
Image1(i).Visible =true
Command1(i).Caption ="关"
Else
Image1(i).Visible = False
Command1(i).Caption = "开"
End If
Next i
Else
If Image1(1).Visible = False Then
Image1(1).Visible = True
Command1(1).Caption = "关"
Else
Image1(1).Visible = False
Command1(1).Caption = "开"
End If
End If
操作步数累加模块:
s = s + 1
Text1.Text = Str(s)
游戏是否完成的判断模块:
f = True
For i = 1 To 10
If Image1(i).Visible = False Then f = False
Next i
If f Then timer1.enabled = false
模块化是程序设计中一种很重要的设计理念。对于初学者来说,模块化的意义更在于减少认知的复杂度,构建项目工程理念。教师在教学中要合理地引导,把大任务划分成几个模块子任务,如有必要,子任务可再划分成更小的子任务。
● 预处理化策略
有一些任务涉及教学指导意见之外的内容,这些内容短时间之内学生无法准确掌握,而且涉入太深会影响学生认知,对此,可以采取预处理化的方式,即预先提供类似半成品的程序框架,与前面提到的半成品不同,这里涉及的语句比较少,对学生程序编写能力的训练影响不大。此处的重点在于正确把握一个度的问题,有些知识让学生学习可增加知识面,有些知识以学生目前的认知基础会产生恐惧及退缩,甚至会影响学习的兴趣。因此,我们可以简单明了,告诉学生其功能就行了。
例如,在教学用例“抽取幸运学生”中,图像需要动态显示,这需要使用loadpicture函数,该函数参数往往比较复杂,我们可以不深入剖析。任务描述如下:设计程序界面如下,单击“开始”按钮时,快速随机显示一张张学生照片,同时按钮变为“停”,单击“停”时抽取一名学生。
代码如下:
Private sub timer1_timer()
Ramdomize
Xh=int(rnd()*40)+1
Image1.picture=loadpicture(app.path &”\” & xh & “.jpg”)
End sub
教师要明确哪些内容要预先提供,哪些内容要留给学生发挥,这就要求教师清楚本学科的知识体系和学生的认知水平。
以上是笔者在较复杂教学用例处理时的三种思路,笔者一直主张在教学用例的选择上,不能因为考虑学生的基础而只选择一些学生“力所能及”的任务,忽略吃不饱的学生。教师帮一帮,学生跳一跳,就能够完成,实用性、趣味性很强的程序更能唤起学生的学习积极性。而且,这些用例拓展了知识的深度和广度,丰富了学生的体验,更能激发学生的想象力和创造力,如果学生完整地架构过一个程序,他就能够勇敢地尝试独自设计一个程序。