相信学生生长的力量
――小学程序设计“自定义函数”教学片段与反思
程序设计是小学信息技术课程选修部分内容,笔者在学校的校本课程中开设了FreeBasic程序设计课程,函数的定义在程序设计中是一个重点,更是一个难点,它需要学生把原有的顺序结构程序设计思想,改进为模块化程序设计思想,对于小学生而言需要教师的引导,也需要引导过程中放手学生探索。
一、自定义函数也是函数:理解什么是函数
师:同学们,今天我们来学习自定义函数,在前面的学习中我们学习过那些函数?
生:int、abs、sqr、tab、rnd函数。
师:这些函数是FB自带的我们把它们称为标准函数,这些函数有什么作用?
生:int函数是取整用的,abs函数是计算一个数的绝对值的,sqr函数是计算一个数的平方根的,tab函数是定位用的,rnd函数是产生一个随机数的。
师:通过这些函数,我们知道了函数有那些特征?
生:每一个函数都有一个功能,调用这个函数后都会有一个返回值,函数名都起的很好,一看就知道是干什么的。
师:大家总结的很好,我们定义函数一定要有个完整的功能,并且能见名而知功能,这样既方便别人阅读我们写的程序,也会形成自己独特的命名规则。
[反思] 在学生的旧知上找到新知的生长点,是学生成长的源泉。要自定义函数,首先要明确函数的作用,通过对于标准函数的复习,学生总结出函数的作用,并且通过讨论函数的命名,发现给函数命名也很有学问,最好与函数的功能有联系,不能一自定义函数就是同一个函数名,不方便自己和别人读懂程序。通过根据功能命名,这样日积月累的学习,学生就会储备很多自定义函数,也会记住很多英语单词,为领会模块化程序设计打下基础。
二、为标准函数写函数定义体:理解函数的调用过程
师:谁能给大家说一说这个程序的运行过程?
Dim As nteger x
Input x
Print Abs(x)
Sleep
生:定义一个整型变量x,从键盘为变量x输入一个值,打印出x的绝对值。
师:在打印abs(x)的值的时候,abs函数做了什么事情?
生:根据x的值判断返回不同的值,如果x>=0返回x,如果x<0返回-x。
师:请大家写一段程序来表示abs函数功能。
生:
If x>=0 Then
Print x
Else
Print -x
End If
师: abs函数是返回绝对值而不是打印,这里需要我们把要返回的值赋给函数名,完整的函数定义体为:
Function Abs(Byval x As Integer) As Integer
If x>=0 Then
Abs=x
Else
Abs=-x
End If
End Function
师:这段程序多了二句程序,请同学们猜一猜它们的作用?
生:function语句肯定的定义函数的命令,function后面跟函数名和参数,还要设定函数的返回值类型,end function为函数定义结束语句。
师:函数名的命名与变量名的命名规则相同,参数可以有一个,也可以有多个,定义一个参数相当于定义一个变量,函数体内如果还需要变量,可以在function语句下面定义。
师:Byval x As Integer的byval它其实是by和value二个单词合在一起简写而成,by bike大家都知道是骑自行车,而value在这儿的意思是值,Byval x As Integer按值传递。如调用abs(-5),把-5的值传递给参数x,在函数体中判断后返回5。
[反思]抓住学生的兴趣,引导学生积极探索,为学生的成长提供环境。学生对于标准函数的执行过程很感兴趣,就一条简单的函数调用,用能返回一个复杂的计算结果,针对学生的这种好奇心理,让学生自己说一说abs函数要做什么事情,然后写一写程序,最后教师在学生程序的基础上写出完整的函数定义体,学生感受到程序的成长过程,更让学生享受这样的成长。
在对于新语句的教学中,教师既要有必须的讲解也要大胆让学生发挥想象的力量,让学生猜一猜没有学过的几条语句的作用。在这样的学习过程中学生的探索欲望得到了满足,学生在理解函数功能的前提下琢磨出新语句的功能和用法,从而使学生对函数的定义有了进一步理解。
三、临摹标准函数的定义:掌握自定义函数的定义
师:我们已经对abs函数有了一个深入的理解,你能编写一个自己的绝对值函数吗?
生:能。
师:函数名还能用abs吗?
生:不能。
师:那怎么让别人一看就知道这个函数是自定义函数呢?
生:可以自定义函数名前面加一个“my”,代表我的函数。
Declare Function myAbs(Byval x As Integer) As Integer ‘教师添加这一行
Dim As Integer x
Input x
Print myAbs(x)
Sleep
End
Function myAbs(Byval x As Integer) As Integer
If x>=0 Then
myAbs=x
Else
myAbs=-x
End If
End Function
师:函数定义体上面的语句是主程序,在主程序第一行必须添加一条declare语句,声明我们定义了一个myAbs函数。
生:为什么自定义函数需要声明而标准函数不需要呢?
师:是因为标准函数被调用时,FreeBasic会自动到一个文件中执行标准函数的定义体,而自定义函数被调用时FreeBasic不认识这个函数,所以需要先声明,告诉FreeBasic我们定义了这个函数,当调用这个函数时去找函数定义语句function,找到函数的定义体执行。
师:在我们平常学习的时候,当我们写错了字,需要橡皮来擦一下,如果没有带橡皮要向别人借时,应该先向别人借,声明我借用橡皮,然后再用橡皮;如果自己有橡皮直接用就可以了。听了这个小故事,你能回答上面同学提的问题了吗?
生:标准函数是FreeBasic自带的函数,所以不需要声明直接使用,而自定义函数不是FreeBasic自带的函数,所以需要先声明再使用。
生:主程序和函数定义体内如果使用相同的变量会不会相互影响呢?
师:主程序和函数定义体是相互独立的,函数体内的变量名可以和主程序的变量名或其它函数中的变量名相同。这个也可以这样理解:要借橡皮的二个人是相互独立的,你的橡皮没有带,但你的同桌却有一块和你一模一样的橡皮,你借了你同桌的橡皮用了一下,对你自己的橡皮是肯定没有影响的。
生:求一个数绝对值自定义函数的另一种方法:
Function myAbs(Byval x As Integer) As Integer
If x<0 Then x=-x
myAbs=x
End Function
[反思]模仿是学习的入门,只有学生掌握了新知才有可能进行创新。通过模仿标准函数学生写出属于自己的第一个自定义函数,学生体会到成功的喜悦。学生对于这个绝对值函数要做什么非常清楚,对于怎么写也明白,虽然回避了一些难度,但让学生明确了学习目标,而且很多学生在自定义绝对值函数过程时发挥自己的创造性,写出了第二种方法,第三种方法等等,正是基于学生对于自定义绝对值函数的理解才让学生写出多种方法,所以模仿是为了创新。
在对于理解为什么要声明和变量的作用域,通过一个借橡皮的例子让学生把生活中的经历带到学习中去,从而找到新知识的最佳切入点,引导学生进行思考与探究,学生对于自定义函数的理解更加的深入和扎实。
四、分层递进的练习:熟练应用自定义函数
(一)课堂练习
1、定义自己的绝对值函数
2、定义自己的符号函数
3、求3!+5!+6!的值
4、求两个数中的大数
5、打印1~1000之间既是回文数又是素数的数
(二)上机练习
1、输入N个整数,求它们的最大公约数。(用函数实现求两个数的最大公约数)
2、验证哥德巴赫猜想:输入大于等于6的偶数,将其分解为两个素数的和。(用函数实现素数的判定)
如输入40,输出:
40=3+37
40=11+29
40=17+23
3、打印出1~10000之间的花朵数。(用函数实现花朵数的判定,求一个数的位数也定义为函数)
[反思]学生的成长需要一个循序渐进的过程。从课堂练习到上机练习,总体采用的是从易到难的过程,自定义函数的参数从一个参数到多个参数,自定义函数的个数从一个函数到多个函数,自定义函数的调用次数从一次调用到多次调用,自定义函数的调用从只有主程序调用到自定义函数也需要调用,通过这样一个有坡度的练习,让学生熟练的应用自定义函数,并且都是在原有的基础上有一定的提高,让学生每做一题对于自定义函数的理解都能更深入一层,让学生在快乐中不断成长,为他们以后深入学习程序设计打下坚实的基础。