激活算法与程序设计教学的若干策略
林挺
【内容摘要】《信息技术基础》模块中调整变化最大的是算法部分,对算法基础要求作了增强。本文结合教学实践,探讨了《算法与程序设计》模块有效教学的有关问题。
【关键词】信息技术 以学定教 寓教于乐 重视实践
高中信息技术深化课程改革,将《算法与程序设计》模块中最基础、最核心的部分筛选出来,作为算法与程序设计基础,纳入到《信息技术基础》模块中,巧妙地将两者合“二”为“一”,目的是为了突出信息技术学科的本体性知识。那么,如何把抽象而枯燥的算法与程序设计知识教得生动活泼又有效呢?
一、以学定教,紧密联系实践促进学生理解
1.实施启发教学,引导学生仔细观察、分析问题
模仿QQ软件的登录界面设计的VB实例是人品计算器。首先教师展示人品计算器的界面,学生欣喜地在自己的机器上运行程序,输入一个名字后按“确定”按钮得到人品值。接着教师提出问题,作品中共包含几个对象?隶属于几个控件类?然后,请学生回顾操作流程,记录程序界面上的变化,并描述作品的功能:①文本框1中显示提示文字“请输入姓名”,字体颜色为灰色。②单击文本框1后,“请输入姓名”消失。当输入姓名时,字体颜色由灰色变成黑色。③输入姓名后,即文本框1不为空,单击“确定”按钮,在文本框2中显示人品值(两位的随机整数),否则不做任何操作。④单击“清除”按钮,清除文本框1和文本框2中的内容。最后,要求学生设计界面,添加相应的对象,并根据刚才得出的功能编写对象的事件处理过程代码,实现问题的解决。
2.把难点内容、专业术语、理论知识具体化、感性化、趣味化
Visual Basic是一种可视化、面向对象、以事件驱动为运行机制的程序设计语言。对象、属性、方法、类、事件、事件处理过程是VB的基本概念,这些术语比较抽象,学生理解上会有困难,因此要用通俗的语言,结合VB实例进行讲解。对象是客观存在的事物,一个人、一个按钮都是一个对象。事件是由用户在对象上激发的一种动作,即你做了什么动作。
3.回归算法本质,联系实践促进概念的理解和掌握
在《算法与程序设计》模块教学中,面向对象程序设计的基础知识是一个很大的难点,特别是对象、属性、事件这些概念,往往老师讲了两三遍,学生还是似懂非懂。当代认知心理学家安德森把人类掌握知识的表征形式分为:陈述性知识与程序性知识。陈述性知识学得快,忘得也快,这也说明能通过课堂实践进行教学的内容要尽量在机房中通过实践解决问题。而程序性知识一旦学会,就不大会被遗忘。从两者的联系上来看,陈述性知识是获得学习程序性知识的基础。学生在学VB前,已经从画图和PS软件中知道了工具箱的作用和用法,这为他们学习新的知识提供了保障。同时,程序性知识的获得也为获取新的陈述性知识提供了可靠的保证。学生根据观察出现在窗体上的各类对象的属性窗口以及代码窗口的内容,理解并掌握了类——对象,对象 ——属性,对象——事件这些抽象的概念。例如在机房上课,可以不像以前那样先介绍VB界面,而是先让学生自己观察VB界面,不难发现它和以前接触过的画图软件、PS软件一样,都有工具箱,工具箱的用法大家都知道,那就自己动手试试看吧。很快,学生根据要求在窗体上拖出了各类对象,并按照提示修改了相应的属性,在这个过程中,教师提醒学生观察属性窗口,体会“同类对象具有相同的属性,不同类对象具有不同的属性”、“同类对象虽然有相同的属性,但其属性值不一定相同”。第二步,教师演示编写一个Form1_ Load ()过程,利用代码再次针对各个对象修改相应的属性,再让学生自己动手试一试。这样,“对象的属性值可以在设计时设置,也可以在运行时修改”就不难理解了。第三步,让学生观察代码窗口中的首尾两行,再运行,引导学生理解Form1_Load()过程中的代码是在对象Form1装载时被运行的。类似的,请学生编写Commanad1_Click()过程和Text1 _Change()过程,并通过“启动”运行加深理解。
二、寓教于乐,运用实例有效串联知识点
1.用小游戏引导学生进入程序的殿堂
程序设计的教学中,学生遇到的第一个问题可能就是分支结构的if语句,其中涉及的语法知识要求又多,即要讲授有行if语句,又要讲授列if语句,而且讲授例子又比较枯燥,比如书本上的实例:“二元一次方程”。对于这个数学例子学生非常熟悉,很容易产生倦怠心理。而如果选择的题目过于复杂,学生又难于理解,从而根本不从谈起学生的兴趣,最后变成了乏味的知识传授。怎样改变这种乏味的教学,提高教学的有效性,就成了教学难点,笔者设计了一个电视中的小游戏:“幸运52猜价格”,先在幻灯片中显示一个价格在1~100元的日用品,再通过事先制作好的小程序来让学生在5次内猜出商品的价格,根据学生所猜测的数值多少,电脑提示“太高了;太低了;不错哦,竟然蒙对了;你永远也猜不到了!”在经过几轮的参与后,让同学首先思考第一问题,怎样让电脑实现判断“太高了;太低了;不错哦,竟然蒙对了!”先给出一个产品的实际价格,并让学生试着用伪代码或自然语言进行描述。这里采用实际的价格,而不是采用随机数,即避免了“随机整数生成”难点对于本节课中if语句的干扰,又让学生有一种真实的感觉,从而即分散了教学中的难点,又提高了学生的学习兴趣。教学中建议先用行if语句来进行讲授,让学生了解每一个判断的过程,再逐步提升到列if语句,再通过计算机来进行实现。等学生掌握后再来提第二个问题,怎样来实现5次的限制,从而实现“你永远也猜不到了!”从而推出计数及判断语句的嵌套,并用程序进行实现。这样由浅入深的设计即有利于学生理解,又可以让学生通过这种游戏的例子,寓教于乐中逐步体会判断语句的用法。
2.用有意义的VB实例吸引学生的眼球,提高课堂教学的趣味性
将算法与程序设计跟日常生活联系起来,通过贴近学生生活的实例,拉近师生之间的距离。比如:使用随机函数制作人品计算器,利用图像框与计时器控件制作动画播放器,设计一个简易计算器完成加、减、乘、除基本运算,利用枚举算法逐一列举实现密码破解,利用枚举算法统计2001到2400年间的闰年,利用解析算法推导公式计算出租车的费用。
3.运用化整为零的策略借助VB实例串联基础知识点
由于信息技术课每周二节,时间间隔较长,学生上下节知识串联难度较大。针对这种情况,我想能不能利用信息技术课的特点,让学生在实践中学习,在实践中掌握巩固相关知识点。具体做法是每节课以案例学习为主,各个知识点用项目进行管理,对教学进行重新整理,将各个知识点落实在例子中,并通过不同的实例巩固各个知识要点。例如在第一节的例子中,要求圆面积,这里涉及到的两个变量S和R均为实数(Double)。在第五节的例子中,求前N个自然数之和,这里要求学生掌握整数型变量(Integer),学生编完程序,调试成功后,再要求把程序改为求前N个自然数之积,这时问题出现了:“数据溢出!”然后教师顺势引出长整型(Long)、单精度实数型(Single)。虽然在不同的时间,不同的例子中出现不同的数据类型,但学生们都掌握了什么时候该用什么数据类型的依据:程序设计要考虑程序运行时变量占用的内存空间,够用就好。
把知识点分解到例子中学习,还要注意小步调前行。这样一方面是对前几节课所学内容的巩固,又学了新的知识。即使在同一节课中,安排的内容也要循序渐进。
例如在FOR循环语句的教学中,第一步,先让学生掌握在窗体上显示一个“*”可以用Print语句,第一个任务一下子就完成。但当连续演示显示一颗星时,窗体上纵向出现了一连串“*”,分析原因:在窗体上显示内容前要先用CLS语句清空。
第二步,在窗体上显示一列“*”,大家根据For循环语句的结构,也很快地完成了。
第三步,在窗体上显示一排“*”。老师分析Print语句的实质是显示完内容后,自动换行。在Print语句后加“;”,可以实现显示内容后,光标停在当前位置。理解了这一点,第三个任务也完成了。
第四步,在窗体上显示一组正方形的“*”,很显然,这需要双重循环。很多同学在进行尝试后大喊“不行,都显示到一排上去了。”我让大家打开Word,输入一排“*”后,问“接下来怎么做?”大家异口同声地回答:“回车”。“怎么实现?”有个别学生做恍然大悟状:“哦,用一个不加‘;的Print语句来实现换行。”“这个Print语句的位置应该在哪里?”“里层循环的Next语句后面。”好了,第四个任务过关。
第五步,在窗体上显示一组平行四边形的“*”。我在巡视课堂的过程中发现有个别同学先在Word中输出*,再分析,再编写程序。我马上请“IT小神童”帮大家分析:在每行“*”之前要加入若干个空格,空格的个数和行号有关,具体的表达式为:第i行要有N-i个空格。
在规定动作完成之后,再让同学们自由发挥,显示一组三角形的“*”。大家根据刚才分析的思路动手实践,做出了各种形状的三角形。从而摒弃了“老师演示——学生模仿”单一重复的做法,实现了课堂生成。
4.强化作品的“建模”理念
通过设计一个完整的VB作品,让学生明确VB程序设计的步骤大致分为:(1)建立界面以及界面中的对象;(2)设置各个对象的属性;(3)编写对象的事件处理过程代码;(4)调试、运行程序;(5)保存工程,生成可执行文件。在设计作品的过程中,潜移默化地渗透“对象”的意识,强化“建模”理念。
三、上机实践,实现编程与调试的相互结合
技术高考采取纸笔+上机的考试形式,这就要求学生的VB学习除了掌握基本概念和基本知识外,还要有较强的程序调试能力。当编写好一个程序时,必须要经过调试程序这道关卡,准确地知道程序的执行情况。一旦提示错误信息,根据出错信息或“调试”功能找到出错的语句,分析出错的原因。比如缺少某个对象、结果溢出、类型不匹配、数组元素下标越界、子程序或函数未定义、无效的过程调用或参数等。通过修改代码纠正错误,学生从中可以学到更多的东西。因此,教师要多给学生一些犯错的机会,这样学生会成长的更快。
学生作业中有些错误是共性的,有些错误甚至是出人意料的,教师可以从错误中学到很多新的内容。例如在做“猜数游戏”这个作业时,有学生举手说为什么他编的程序每次猜的数都只能是0。我仔细看了他的代码,没有错误,再仔细分析,发现是在定义全局变量N(被猜的那个随机数)时他输成了A,也就是被猜的那个数N变成了局部变量,那么每次运行调试时,代码全都能过,就是被猜的那个数没有定义过,所以只能是零。由于当时还没有讲到过程与函数,全局变量和局部变量不能多讲,我只让那位学生先把A改成N。通过这件事,我意识到在调试过程中碰到的问题可以为以后的学习打下伏笔,由此,我要求学生在调试过程中碰到的错误以注释语句的形式保存在代码中,一方面可以加深印象,另一方面可以为以后的学习作铺垫。
总之,算法与程序设计本身是抽象的,教师要创设情景,引导学生分析问题,通过问题解决,把难点内容、专业术语、理论知识具体化、感性化、趣味化,学生必定学得生动活泼。此外学生本身就是快乐的发现者和创造者,尽量让学生独立操作,表达多角度进行创造性思维活动以充分挖掘出学生巨大潜能,让学生或为课堂学习的主人,不但会让我们的课堂充满趣味,更为重要的是培养了学生探究,合作交流自主学习的能力。
【参考文献】
[1] 薛锦云. 程序设计方法[M]. 高等教育出版社.
[2] 高淑印. 基础教育算法与程序设计模块内容标准解读[J]. 中国电化教育,2012,(10).
[3] 胡志洪.《算法与程序设计》课程的有效教学[J]. 软件导刊(教育技术),2012,(1).
(作者单位:浙江省台州市黄岩区灵石中学)
【内容摘要】《信息技术基础》模块中调整变化最大的是算法部分,对算法基础要求作了增强。本文结合教学实践,探讨了《算法与程序设计》模块有效教学的有关问题。
【关键词】信息技术 以学定教 寓教于乐 重视实践
高中信息技术深化课程改革,将《算法与程序设计》模块中最基础、最核心的部分筛选出来,作为算法与程序设计基础,纳入到《信息技术基础》模块中,巧妙地将两者合“二”为“一”,目的是为了突出信息技术学科的本体性知识。那么,如何把抽象而枯燥的算法与程序设计知识教得生动活泼又有效呢?
一、以学定教,紧密联系实践促进学生理解
1.实施启发教学,引导学生仔细观察、分析问题
模仿QQ软件的登录界面设计的VB实例是人品计算器。首先教师展示人品计算器的界面,学生欣喜地在自己的机器上运行程序,输入一个名字后按“确定”按钮得到人品值。接着教师提出问题,作品中共包含几个对象?隶属于几个控件类?然后,请学生回顾操作流程,记录程序界面上的变化,并描述作品的功能:①文本框1中显示提示文字“请输入姓名”,字体颜色为灰色。②单击文本框1后,“请输入姓名”消失。当输入姓名时,字体颜色由灰色变成黑色。③输入姓名后,即文本框1不为空,单击“确定”按钮,在文本框2中显示人品值(两位的随机整数),否则不做任何操作。④单击“清除”按钮,清除文本框1和文本框2中的内容。最后,要求学生设计界面,添加相应的对象,并根据刚才得出的功能编写对象的事件处理过程代码,实现问题的解决。
2.把难点内容、专业术语、理论知识具体化、感性化、趣味化
Visual Basic是一种可视化、面向对象、以事件驱动为运行机制的程序设计语言。对象、属性、方法、类、事件、事件处理过程是VB的基本概念,这些术语比较抽象,学生理解上会有困难,因此要用通俗的语言,结合VB实例进行讲解。对象是客观存在的事物,一个人、一个按钮都是一个对象。事件是由用户在对象上激发的一种动作,即你做了什么动作。
3.回归算法本质,联系实践促进概念的理解和掌握
在《算法与程序设计》模块教学中,面向对象程序设计的基础知识是一个很大的难点,特别是对象、属性、事件这些概念,往往老师讲了两三遍,学生还是似懂非懂。当代认知心理学家安德森把人类掌握知识的表征形式分为:陈述性知识与程序性知识。陈述性知识学得快,忘得也快,这也说明能通过课堂实践进行教学的内容要尽量在机房中通过实践解决问题。而程序性知识一旦学会,就不大会被遗忘。从两者的联系上来看,陈述性知识是获得学习程序性知识的基础。学生在学VB前,已经从画图和PS软件中知道了工具箱的作用和用法,这为他们学习新的知识提供了保障。同时,程序性知识的获得也为获取新的陈述性知识提供了可靠的保证。学生根据观察出现在窗体上的各类对象的属性窗口以及代码窗口的内容,理解并掌握了类——对象,对象 ——属性,对象——事件这些抽象的概念。例如在机房上课,可以不像以前那样先介绍VB界面,而是先让学生自己观察VB界面,不难发现它和以前接触过的画图软件、PS软件一样,都有工具箱,工具箱的用法大家都知道,那就自己动手试试看吧。很快,学生根据要求在窗体上拖出了各类对象,并按照提示修改了相应的属性,在这个过程中,教师提醒学生观察属性窗口,体会“同类对象具有相同的属性,不同类对象具有不同的属性”、“同类对象虽然有相同的属性,但其属性值不一定相同”。第二步,教师演示编写一个Form1_ Load ()过程,利用代码再次针对各个对象修改相应的属性,再让学生自己动手试一试。这样,“对象的属性值可以在设计时设置,也可以在运行时修改”就不难理解了。第三步,让学生观察代码窗口中的首尾两行,再运行,引导学生理解Form1_Load()过程中的代码是在对象Form1装载时被运行的。类似的,请学生编写Commanad1_Click()过程和Text1 _Change()过程,并通过“启动”运行加深理解。
二、寓教于乐,运用实例有效串联知识点
1.用小游戏引导学生进入程序的殿堂
程序设计的教学中,学生遇到的第一个问题可能就是分支结构的if语句,其中涉及的语法知识要求又多,即要讲授有行if语句,又要讲授列if语句,而且讲授例子又比较枯燥,比如书本上的实例:“二元一次方程”。对于这个数学例子学生非常熟悉,很容易产生倦怠心理。而如果选择的题目过于复杂,学生又难于理解,从而根本不从谈起学生的兴趣,最后变成了乏味的知识传授。怎样改变这种乏味的教学,提高教学的有效性,就成了教学难点,笔者设计了一个电视中的小游戏:“幸运52猜价格”,先在幻灯片中显示一个价格在1~100元的日用品,再通过事先制作好的小程序来让学生在5次内猜出商品的价格,根据学生所猜测的数值多少,电脑提示“太高了;太低了;不错哦,竟然蒙对了;你永远也猜不到了!”在经过几轮的参与后,让同学首先思考第一问题,怎样让电脑实现判断“太高了;太低了;不错哦,竟然蒙对了!”先给出一个产品的实际价格,并让学生试着用伪代码或自然语言进行描述。这里采用实际的价格,而不是采用随机数,即避免了“随机整数生成”难点对于本节课中if语句的干扰,又让学生有一种真实的感觉,从而即分散了教学中的难点,又提高了学生的学习兴趣。教学中建议先用行if语句来进行讲授,让学生了解每一个判断的过程,再逐步提升到列if语句,再通过计算机来进行实现。等学生掌握后再来提第二个问题,怎样来实现5次的限制,从而实现“你永远也猜不到了!”从而推出计数及判断语句的嵌套,并用程序进行实现。这样由浅入深的设计即有利于学生理解,又可以让学生通过这种游戏的例子,寓教于乐中逐步体会判断语句的用法。
2.用有意义的VB实例吸引学生的眼球,提高课堂教学的趣味性
将算法与程序设计跟日常生活联系起来,通过贴近学生生活的实例,拉近师生之间的距离。比如:使用随机函数制作人品计算器,利用图像框与计时器控件制作动画播放器,设计一个简易计算器完成加、减、乘、除基本运算,利用枚举算法逐一列举实现密码破解,利用枚举算法统计2001到2400年间的闰年,利用解析算法推导公式计算出租车的费用。
3.运用化整为零的策略借助VB实例串联基础知识点
由于信息技术课每周二节,时间间隔较长,学生上下节知识串联难度较大。针对这种情况,我想能不能利用信息技术课的特点,让学生在实践中学习,在实践中掌握巩固相关知识点。具体做法是每节课以案例学习为主,各个知识点用项目进行管理,对教学进行重新整理,将各个知识点落实在例子中,并通过不同的实例巩固各个知识要点。例如在第一节的例子中,要求圆面积,这里涉及到的两个变量S和R均为实数(Double)。在第五节的例子中,求前N个自然数之和,这里要求学生掌握整数型变量(Integer),学生编完程序,调试成功后,再要求把程序改为求前N个自然数之积,这时问题出现了:“数据溢出!”然后教师顺势引出长整型(Long)、单精度实数型(Single)。虽然在不同的时间,不同的例子中出现不同的数据类型,但学生们都掌握了什么时候该用什么数据类型的依据:程序设计要考虑程序运行时变量占用的内存空间,够用就好。
把知识点分解到例子中学习,还要注意小步调前行。这样一方面是对前几节课所学内容的巩固,又学了新的知识。即使在同一节课中,安排的内容也要循序渐进。
例如在FOR循环语句的教学中,第一步,先让学生掌握在窗体上显示一个“*”可以用Print语句,第一个任务一下子就完成。但当连续演示显示一颗星时,窗体上纵向出现了一连串“*”,分析原因:在窗体上显示内容前要先用CLS语句清空。
第二步,在窗体上显示一列“*”,大家根据For循环语句的结构,也很快地完成了。
第三步,在窗体上显示一排“*”。老师分析Print语句的实质是显示完内容后,自动换行。在Print语句后加“;”,可以实现显示内容后,光标停在当前位置。理解了这一点,第三个任务也完成了。
第四步,在窗体上显示一组正方形的“*”,很显然,这需要双重循环。很多同学在进行尝试后大喊“不行,都显示到一排上去了。”我让大家打开Word,输入一排“*”后,问“接下来怎么做?”大家异口同声地回答:“回车”。“怎么实现?”有个别学生做恍然大悟状:“哦,用一个不加‘;的Print语句来实现换行。”“这个Print语句的位置应该在哪里?”“里层循环的Next语句后面。”好了,第四个任务过关。
第五步,在窗体上显示一组平行四边形的“*”。我在巡视课堂的过程中发现有个别同学先在Word中输出*,再分析,再编写程序。我马上请“IT小神童”帮大家分析:在每行“*”之前要加入若干个空格,空格的个数和行号有关,具体的表达式为:第i行要有N-i个空格。
在规定动作完成之后,再让同学们自由发挥,显示一组三角形的“*”。大家根据刚才分析的思路动手实践,做出了各种形状的三角形。从而摒弃了“老师演示——学生模仿”单一重复的做法,实现了课堂生成。
4.强化作品的“建模”理念
通过设计一个完整的VB作品,让学生明确VB程序设计的步骤大致分为:(1)建立界面以及界面中的对象;(2)设置各个对象的属性;(3)编写对象的事件处理过程代码;(4)调试、运行程序;(5)保存工程,生成可执行文件。在设计作品的过程中,潜移默化地渗透“对象”的意识,强化“建模”理念。
三、上机实践,实现编程与调试的相互结合
技术高考采取纸笔+上机的考试形式,这就要求学生的VB学习除了掌握基本概念和基本知识外,还要有较强的程序调试能力。当编写好一个程序时,必须要经过调试程序这道关卡,准确地知道程序的执行情况。一旦提示错误信息,根据出错信息或“调试”功能找到出错的语句,分析出错的原因。比如缺少某个对象、结果溢出、类型不匹配、数组元素下标越界、子程序或函数未定义、无效的过程调用或参数等。通过修改代码纠正错误,学生从中可以学到更多的东西。因此,教师要多给学生一些犯错的机会,这样学生会成长的更快。
学生作业中有些错误是共性的,有些错误甚至是出人意料的,教师可以从错误中学到很多新的内容。例如在做“猜数游戏”这个作业时,有学生举手说为什么他编的程序每次猜的数都只能是0。我仔细看了他的代码,没有错误,再仔细分析,发现是在定义全局变量N(被猜的那个随机数)时他输成了A,也就是被猜的那个数N变成了局部变量,那么每次运行调试时,代码全都能过,就是被猜的那个数没有定义过,所以只能是零。由于当时还没有讲到过程与函数,全局变量和局部变量不能多讲,我只让那位学生先把A改成N。通过这件事,我意识到在调试过程中碰到的问题可以为以后的学习打下伏笔,由此,我要求学生在调试过程中碰到的错误以注释语句的形式保存在代码中,一方面可以加深印象,另一方面可以为以后的学习作铺垫。
总之,算法与程序设计本身是抽象的,教师要创设情景,引导学生分析问题,通过问题解决,把难点内容、专业术语、理论知识具体化、感性化、趣味化,学生必定学得生动活泼。此外学生本身就是快乐的发现者和创造者,尽量让学生独立操作,表达多角度进行创造性思维活动以充分挖掘出学生巨大潜能,让学生或为课堂学习的主人,不但会让我们的课堂充满趣味,更为重要的是培养了学生探究,合作交流自主学习的能力。
【参考文献】
[1] 薛锦云. 程序设计方法[M]. 高等教育出版社.
[2] 高淑印. 基础教育算法与程序设计模块内容标准解读[J]. 中国电化教育,2012,(10).
[3] 胡志洪.《算法与程序设计》课程的有效教学[J]. 软件导刊(教育技术),2012,(1).
(作者单位:浙江省台州市黄岩区灵石中学)