你的课学生“听懂”了吗?

2016-09-10 07:22边楚女
中国信息技术教育 2016年12期
关键词:调用语句程序

边楚女

大家也许或多或少看过白岩松、汪涵或何炅主持的节目,他们主持各成风格,但有一个共同特质,就是他们的主持很舒服,很走心,很接地气。他们为什么让观众看明白、听走心了呢?我想应该是他们精心的案头工作、深厚的文化底蕴、清晰的主持逻辑和从观众出发考量的人文情怀走进了观众的心。教学与主持有很多相通的地方,值得我们对比反思。很多年前,我听过一位物理老师的一节课,至今仍记忆犹新。这位老师给我留下的最深印象是上课思路特别清晰,话不多,语速不快,句句聚焦要点,学生的学习积极性都被带动起来,感觉45分钟的课一眨眼就结束了。试想,如果教师没有从学生角度出发的教学设计,没有清晰的上课思路,没有简洁明快的语言,课又怎么能让学生听懂呢?

接下来,以《自定义函数》一课为例,聊一聊我是如何努力让学生“听懂”这节课的,这是一节有一定设计难度的课,分享出来供大家讨论、批评和指正。我设定这一课时的主要教学目标为:理解函数的概念,了解函数在模块化程序设计中的作用;通过递进式的四个任务,初步掌握自定义函数的构造方法和应用;进一步理解模块化程序设计思想的应用价值。

● 课堂教学

1.梳理回顾常见函数

经过一段时间学习,特别是前一节课《过程——走进模块化思想》的铺垫,学生们初步了解了VB程序设计的模块化思想:每个模块分工合作,各自完成相应任务,模块之间也可以相互调用。可以再看看你们熟悉的标准函数(如下页表),事实上这些函数也是程序模块,只不过这些程序模块已经编好,被事先放入VB程序中,需要的时候直接调用就可以了,所以这些函数也被称为内部函数。例如,程序中有a=Abs(x)语句,当程序运行到这个语句时,会自动调用VB程序内部的Abs函数模块,然后把计算好的值送到Abs(x)调用点上,再把值赋给a。

教学阐析:本节课的重点是自定义函数的构造和应用,事实上学生熟悉的标准函数也是一种自定义函数,只不过程序员事先编好了这些函数的程序模块供用户调用。为了让学生有清晰的认知,教师切入课堂主题时一定要让其明白函数的本质,而不要在内部函数和自定义函数上纠结。上表中还列出了函数名的关联英语,因为以前在讲解这些函数时就已经告诉学生标准函数命名的“英语情结”,这次梳理回顾时统一展示出来,能强化学生的“望文生义”,促进他们进一步理解和记忆这些函数。

2.引入自定义函数

除了这些内部函数外,我可不可以过过程序员的瘾,由自己来构造函数,在需要时随时调用呢?当然可以。学生们可以依据如下的格式来构造一个函数。

Function 函数名(参数表) As 类型名

语句块

(说明:语句块中至少有一个语句是“函数名=表达式”,这样,表达式的结果才能作为函数的返回值)

End Function

这些根据实际需要构造的函数,我们有个约定俗成的名字叫“自定义函数”。

教学阐析:自定义函数的格式比较抽象,不建议花时间讲解,实践操作才是最好的“讲解”。因此,我只是把这个格式展示给学生,然后通过具体的实践任务来理解这个格式应用。

3.完成“绝对值函数”的构造和应用

我们不妨先来构造一个绝对值函数,也许学生会奇怪,这个函数不是已经有了吗?呵呵!你懂的!(停顿一会,让学生先消化一下再进行说明)。然后我严格按照这个格式来完成绝对值函数的构造。在代码窗口输入“Function jdz(x As Double) As Double”,Function是函数的英语,它有“功能”的意思,暗喻函数本身就是一个功能模块。我把绝对值函数名改成了jdz,可以吗?Why not?虽然我们从标准函数的取名中能感受到“正常”的程序员通常是以函数的英文缩略来表示函数,但事实上你完全可以取一个自己喜欢的个性化名字。

参数表中的x类似于数学中的自变量,这个自变量是什么类型的,你就定义它是什么类型。由于绝对值函数的自变量值一般为实数,所以你可以将其定义为Double类型。As后面的类型名该怎么定义?你只要思考jdz(x)的值是什么类型,也就是说,绝对值计算好后的值是什么类型,就定义成什么类型,这里定义为Double,我想你们肯定能够接受。

接下来输入语句块内容,具体代码如下页图1所示,在前面的函数格式结构中有一个说明:语句块中至少有一个语句是“函数名=表达式”,这样,表达式的结果才能作为函数的返回值。这句话表达比较笼统,我试着这样解释帮助学生理解:“函数的目的是什么,当然是想得到一个值,所以表达式计算好后要把值给函数,然后这个函数值会被送到其他程序模块中调用该函数的调用点上。”学生不理解也没关系,多练习几次就能明白。我演示讲解完后,学生自主完成绝对值函数构造。

函数构造好了就要发挥作用。我现在想求|a|和-a2+|a|-2的值,该怎么调用刚刚构造好的函数?我边输入图1调用模块的程序边讲解调用方法,并问学生:“Command1_Click模块在调用函数时用了jdz(a),而不是jdz(x),为什么?”

在学生完成调用模块的程序后,我让学生用F8键逐语句调试程序,感受函数的执行过程。然后让学生把jdz(a)改成jdz(x),再用F8调试,发现出现“Byref参数类型不符”错误警示,学生若有所思。

教学阐析:这个任务的重点是让学生初步了解函数构造结构,努力理解“对Function函数名(参数表) As 类型名”和“至少有一个语句是函数名=表达式”这两个实践难点,并了解函数调用的原理。在具体的教学中,虽然我心里非常清楚这些教学目标,但并没有刻意强调难点,更没有扯着嗓门告诉学生这个有多么多么重要,而是很放松地进行聊天式演示讲解。因为教师的任务就是把复杂的问题简单化,深入浅出地让学生轻松理解难点。反复地刻意强调只会给学生造成紧张的心理暗示。

PS:我在巡视时发现,学生自定义绝对值函数的名称真是百花齐放。是呀!给学生一个空间,他们就会释放想象和创意!

4.完成“最大公约数函数”的构造和应用

接下来的任务是让学生给程序填空,该程序先构造“求两数最大公约数”函数,然后再调用该函数求出三个数的最大公约数,程序共有两个空(如图2)。当学生完成填空后运行程序,发现出现了“赋值号左边的函数调用必须返回变体或对象”的错误(如图3)。在学生经过思考调试改正错误后,我再与他们交流:在构造函数时,左边的函数名不能加参数表,但在调用函数时,必须要有参数表,参数名以当前模块的变量名为准。

教学阐析:两个填空递进式地深化了函数的理解难点,填完空后运行程序产生的错误又引发了知识冲突,学生在解决知识冲突的过程中进一步突破难点,夯实知识基础。而且参数表从第一个任务的一个变量变成两个变量,拓展了学生的认知,为后面的学习搭建了支架。

5.完成“判断闰年”任务

紧接着学生要完成一个“判断闰年”程序的改错任务,这个程序是让用户在文本框1中输入一个年份,如果是闰年,文本框2显示红色,否则显示蓝色。程序代码和运行结果界面如图4所示。

这个任务先由学生自主研究。学生的研究过程模拟如下:先运行程序,出现“参数不可选”错误警示,并指向leap="yes"位置,这是调用函数的模块。错误原因是函数名后没有加参数,把leap改成leap(y)或leap(a),改成leap(y)的学生调试时出现了“ByRef参数类型不符”,错误原因是调用时的参数没有用调用模块的变量参数名,所以leap(a)才是对的。继续调试,出现了“赋值号左边的函数调用必须返回变体或对象”的错误,这是前一个任务的同类错误,学生把两个leap(y)改成leap后再调试,发现出现“类型匹配错误”提示,leap="yes"语句出现黄色警示,可是错误真的在这个语句吗?你们觉得呢?

教学阐析:“判断闰年程序”的改错任务集中凸显了函数的三个关键点:一是“Function函数名(参数表) As类型名”语句的正确使用;二是对语句块中至少有一个语句是“函数名=表达式”的理解和运用;三是其他模块调用函数时参数的正确使用。通过前两个任务的铺垫和本任务的提升,学生基本厘清函数的构造和运用。

6.完成“四舍五入函数”编写

学生要完成的最后一个任务是编写“四舍五入函数”。为助力学生建构该函数的结构,我提供给学生两道他们以前做过的练习题:

习题1:在计算平均重量x时,结果中产生了许多位小数,若需要对x保留一位小数,并对第二位小数进行四舍五入,则下列表达式中正确的是:

(A)Int(x*10+0.5)/10

(B)Int(x*100+0.5)/100

(C)Int(x*10)/10

(D)Int(x+0.5)

习题2:银行给用户计算利息时,结果中会产生很多位小数,但在支付时,是以“元”为单位,按“分”结算的,即结果保留二位小数,并对第三位小数进行四舍五入。假设结算的利息是x元,上述算术问题的表达式应是:

(A)Int(x*10+0.5)/10

(B)Int(x*100+0.5)/100

(C)Int(x*100)/100

(D)Int(x*100+0.5)/10

一些学生在较短时间里完成了任务,另一些学生还陷在困惑中,于是我把三个注释语句给他们看(如图5),这给了他们一些灵感,所以又有一些学生做出来了,但还有一些学生依旧找不到方向,这时,我再把答案展示给学生,并讲解原理和方法。

教学阐析:课堂最后,学生独立经历函数构造和调用的完整实践过程,有利于培养其解决问题的整体能力。同时,分层、分步提供帮助,满足了不同层次学生的学习需要。

● 课堂综述

在与同行交流时,大家普遍认为《自定义函数》这节课在教与学两个层面上都有一定难度。那怎么让学生真正听懂——听得轻松,学得扎实呢?我试图从三个方面来把握:一是在教学设计上充分吃透教材文本,深度理解教学内容,站在学生的角度反复推敲和实践,梳理出自定义函数的关键点和难点。二是在把握教学关键点和难点的前提下,设计真正有效的任务。通过多次实践和选择,我确定了学生要完成四个任务。这些任务以模仿实践、初步理解难点、巩固关键点、自主实践为推进逻辑,螺旋上升,层层递进落实关键点,突破理解难点。三是上课实施时主要是让学生通过实践操作来真正掌握函数的构造和运用,而不是通过不断地分析、强调来“说懂”学生,因为学生不是教懂的,而是通过自我学习“学懂”的。这节课主要是让学生初步掌握函数的构造和应用,下节课则会通过几个提升任务让学生从更大的格局和视野来理解函数的应用价值。

● 观点总结

“让学生听得轻松明白、学得扎实有效”,这句话简单明了,却需要教师用最大的智慧、最实的行动和最真的反思去诠释。一节课上,如果教师能真正站在学习者的角度开展教学设计,有由浅入深、层层递进、逻辑清晰的教学过程,有语言简练、指向性明确的有效语言,有让学生放松学习的氛围,有让学生主动思考实践的空间,学生就能更好地明白这节课应该怎么去学。“教学过程本质上就是认识的过程”,因此,所谓的“听懂”,不是把学生讲懂、教懂,更不仅仅是我教你做,而是要激发学生主动开展自我认知、积极投入实践来实现自我发展。教师要做的是帮助学生澄清问题边界,提供问题解决支架,助力学生更好地通过实践来建构知识体系。

伟大的物理学家爱因斯坦曾说过,“教育,是人们遗忘了学校灌输的所有知识后,仍能留存的东西”。我听懂了:很多所谓的知识会被淡忘或不断更新,但那些真正生发于学生自我的体悟,能成长为学生生命中坚实的力量,伴其行走天涯,笑傲江湖。

2016年4月28日,我发了一条微信:举重若轻,这是上课的最高境界。我无心再去阐析这条微信,因为此时的我,虽心有猛虎,却更愿细嗅蔷薇!因为,学生正在静静聆听……作为一线教师,都不可避免会探讨一个问题:什么样的课才算是一节好课?我曾提出过一节好课的标准:学生听得懂,学生有兴趣,学生有发展。一节课,首先应该做到的是“学生听得懂”——让学生听得轻松明白,学得扎实有效。每一位教师都在努力达到这个要求,但不可否认,在听课时常会邂逅这些场景:由于教师没有清晰的课堂逻辑和执教思路,所以学生听得糊里糊涂,他们不清楚“老师到底想让我们做什么”“老师想带我们到哪里去”;教师情绪高涨,嗓门洪亮讲个不停,把学生当成被动接受知识的容器,学生虽听得累却只能默认教师的“权威”;一些本可以用几句话讲明白的问题被绕得很复杂,教学重点被教师反复强调,学习难点被渲染得很玄乎,学生的思考和学习背上心理负担;课堂上充满低层次的你问我答和教师一言堂的“霸权主义”,学生看似在听,在配合教师做出反应,事实上并没有真正进入学习状态;等等。不知我们是否听到,这些场景的背后有很多学生在无声呐喊:“亲爱的老师,你的课,我听不懂!”这些让学生听不懂的课,到底是哪里出了问题呢?

猜你喜欢
调用语句程序
给Windows添加程序快速切换栏
简化化学平衡移动教学程序探索
“程序猿”的生活什么样
基于Android Broadcast的短信安全监听系统的设计和实现
英国与欧盟正式启动“离婚”程序程序
基本算法语句
我喜欢
利用RFC技术实现SAP系统接口通信
作文语句实录
C++语言中函数参数传递方式剖析