基于高中生计算思维培养的算法与程序教学探究
——以Visual Basic 中的循环结构为例
2020-04-16南京师范大学附属扬子中学
南京师范大学附属扬子中学 张 沁
一、案例背景
计算思维(Computational Thinking)于2006 年由美国卡内基·梅隆大学计算机科学系主任周以真(Jeannette M. Wing)定义为:计算思维是运用计算机科学的基础概念进行问题求解、系统设计,以及人类行为理解等涵盖计算机科学之广度的一系列思维活动。可以理解为,计算思维是利用计算机求解问题的一种思维活动。2017 年,我国教育部制定的《普通高中信息技术课程标准》(以下简称《新课标》)中,首次提出了学科核心素养,并把计算思维作为高中信息技术学科的四大核心素养之一。《新课标》指出,计算思维是个体运用计算机科学领域的思想方法,在形成问题解决方案的过程中产生的一系列思维活动。而算法与程序实现,即利用计算机对问题的求解,是对计算思维的体现。
在高中信息技术课程结构中,将“数据与计算”作为必修部分的模块1。由此可见,“数据与计算”在整个高中信息技术学科教学中占据重要地位。该模块中关于“算法与程序实现”内容的学业要求为:依据解决问题的需要,设计和表示简单算法;掌握一种程序设计语言的基本知识,利用程序设计语言实现简单算法,解决实际问题。算法即解决问题的方法和步骤,它是程序的灵魂。而程序则是算法思想的体现。目前,在高中信息技术课程教学中,“算法与程序实现”这部分内容的教学一直是比较难以处理的内容。学生对此内容比较陌生,长期缺乏计算思维的训练,他们不知道如何利用计算思维分析问题,更谈不上解决问题。而“计算思维”的提出,使信息技术课程教学从注重实践操作的技术素养层面上升到注重思维素养培养的层面。因此,对于此内容的教学如何开展?如何培养学生的计算思维?我将以《循环结构》这一节课为例,探索算法与程序的教学方法以及培养学生计算思维的方法。
本节课《循环结构》是教科版高二信息技术选修《算法与程序设计》教材的第二章的第三节的第三部分内容,既是对前面学习内容的巩固,例如界面操作、Visual Basic 基本语句的掌握,也是对下一章《算法的程序实现》学习的基础。程序的基本结构有顺序结构、选择结构和循环结构,掌握程序的基本结构是学习算法和程序设计必须掌握的内容。经过前面内容的学习,学生已经初步熟悉了Visual Basic 界面,对编程有了初步的了解和尝试,已经学习了基本操作(如程序的保存、运行)、数据的输出(如print 语句)、顺序结构和选择结构的特点等。
二、案例描述
(一)新课引入
带领学生回忆上节课的内容,如:Visual Basic 的界面、程序的保存与运行、数据的输出等。
教师提问1:如何在窗体上单击一次,打印出1 个“*”符号?(click事件、print 语句)
生:给出程序:
得到预期的运行结果。
【设计意图】
复习上一节课的知识点,并为后面的学习做铺垫。这个任务的难度较低,容易实现,学生能够轻松掌握,降低其畏难情绪,引起学生的兴趣。
教师提问2:如何在窗体上单击一次,打印出10 行“*”符号?
【设计意图】
学生利用目前掌握的知识,思考、修改问题1 的程序,能够较容易地解决此问题,提高学生学习的积极性。学生认识到“;”的作用。如果加分号,下次输出就会紧接着输出。如果不加分号,下次输出就会换行输出。在程序实现时,要注意程序语句的使用规范,根据实际问题,使用相应的程序语句。
教师提问3:如何在窗体上单击一次,打印出100 行“*”符号?甚至1000 行“*”符号?
生1:思考,感到困惑。
生2:重复执行print“*”语句100 次,但是这样写程序,行数太多了,人工操作很难实现。能让计算机自动执行吗?
表1
【设计意图】
与学生目前掌握的知识产生冲突,激发学生的学习兴趣,引出本节课的内容——循环结构。
(二)新课讲授
师:刚才有同学说重复执行print“*”语句100 次,但是手动编写100行重复的代码,太耗费精力了?人工操作很难实现。如何让计算机自动执行print“*”语句100 次呢?我们可以使用循环结构。
师:循环结构For…Next…语句讲解(略)。
教师提问4:给出程序片段:
如何修改程序,实现在窗体上单击一次,打印出10 行“*”符号?
生:学生思考、探究、尝试,修改程序,查看运行结果。
表2
【设计意图】
设计打印“10”行,方便验证循环语句的结果是否正确。学生先运行教师提供的程序,观察程序的运行结果,体会循环结构中各语句的作用。然后,学生修改部分程序即可实现,上手快,初步感受循环结构的使用方法。并且,不同的学生,给出了不同的解决方法,体会到程序实现的自由与乐趣。
师:引导学生思考,引入两个变量,双重循环。一个变量i 控制“*”的行数,一个变量j 控制“*”的个数。
师:给出程序片段:
生1:思考,怎样修改程序,使“*”打印3 行。
生2:每行“*”的个数以2 递增,即:“*”的个数为1、3、5,“*”的个数为奇数,可以利用步长来控制。
生3、生4、生5:观察老师给出的程序片段,思考现有程序和实际问题的关联之处,修改,尝试。
【设计意图】
教师给出程序片段,学生思考,修改程序,试错,最终得到预期的结果。开阔了学生的思维,学生提出了不同的解决方案,即不同的算法,使学生们感受到程序的乐趣和魅力。在程序和算法教学中,应提供给学生想象的空间,应鼓励学生大胆思考、尝试、实践,不拘泥于某一种“标准答案”。
表3
【设计意图】
通过互相关联的小任务,层层递进,激发学生主动参与,积极思考,考查学生综合运用知识的能力。学生由浅入深,由易到难,逐渐理解算法的意义,掌握程序实现的方法。从而,有效地培养了学生的计算思维,学生渐入佳境。
(三)本课总结(略)
三、案例反思
计算思维的培养有助于提高学生发现问题和解决问题的能力,提高学生综合运用知识的能力。目前,程序设计语言有很多种,如Visual Basic、C、C++、Python 等,无论哪种程序设计语言,它们都是利用计算机来解决实际问题,都需要将具体的问题抽象化,它们的内在是相通的,算法是程序的核心。通过程序教学,可以有效地培养学生的计算思维。在程序教学中,应注意以下几点:
(一)精选实例
良好的课堂引入使教学事半功倍,这就需要老师精选合适的实例。比如在本节课的开始,我设计的第一个小问题是如何在窗体上单击一次,打印出1 个“*”符号?学生知道是用Print“*”这条语句。接着提问如何单击一次,打印出10 行“*”符号?学生很容易就想到用10 行Print“*”语句。接着我再次提问如何单击一次,打印出100 行“*”符号?甚至1000行“*”符号?这个问题与学生此时的认知水平产生冲突,学生会想到用100 行Print“*”语句,但人工这样做,工作量太大了,不易实现。怎样解决此问题呢?从而引出本节课的内容——循环结构,也就顺理成章了。“兴趣是最好的老师”,在程序教学中,应让学生主动参与,变被动为主动,让学习成为学生的一种自主的需要。学生有了兴趣和热情,学习的积极性提高了,学习的效果自然也会提高。
(二)夯实基础
程序设计的语句一定要解释到位,有些地方特别容易被忽视。如果不解释到位,程序的运行结果就会大相径庭。正所谓,差之毫厘,失之千里。比如:本节课的一个知识点,“;”的含义一定要使学生理解。如果Print“*”后面加了“;”就是紧接着输出后面的语句,运行下来的结果就不是10 行“*”,而是一行10 个“*”,容易被人忽略的“;”使程序的运行结果完全不一样。我们在程序教学中,一定要注意将基础的知识点解释到位,程序语句的规范使用,这样才能避免因一些小问题而导致程序运行结果达不到预期的效果。
(三)层层递进
在本节课的开始,结合上一节课的知识点,通过简单的任务,学生能够利用现有知识轻松地解决实际问题,使学生体会利用程序解决问题的过程。再通过下一个任务,与学生现有知识产生冲突,激发学生积极思考,探寻解决问题的方法,引出本节课的知识要点。在这之后,又通过与上一个任务关联的任务,激发学生联想,思考,找出并分享解决问题的不同的方法。通过多个层次分明,互相关联的任务,由浅入深,由易到难,符合学生的认知规律,使学生能够在任务的解决中,逐渐理解算法的意义,逐渐掌握程序设计的方法,即利用计算机解决问题的能力,从而有效地培养学生的计算思维。
(四)勇于尝试
程序实现是灵活的,千变万化的,具有不唯一性。同一结果,不同的程序语句同样都能实现,这就是程序的乐趣和魅力所在。我们应给与学生们想象的空间,引导学生积极思考,勇于尝试,不断完善和改进程序。例如本节课,对于同一任务,学生找到了各自的解决方法,并通过程序的分享,开阔了学生的视野,体会到程序设计的乐趣,条条大路通罗马。
总之,在对学生计算思维的培养中,应注重知识迁移能力的培养,使学生能够综合分析实际问题,并采用合适的方法来解决问题。应注重学生的体验,激发学生的学习兴趣,让学生积极思考,主动参与,从而有效地培养学生的计算思维。