论文部分内容阅读
教材对学生学习的重要性是不言而喻的。因此,教材的编写应该本着严谨、科学、精益求精的态度。但是,笔者在教学中发现浙江教育出版社出版的高中信息技术教材《算法与程序设计》中存在一些值得商榷的问题。现举例说明,以期抛砖引玉,为教材的修订提供参考。
一、教材第23页“变形金刚包装问题的算法”和第97页的“程序实现”
教材通过问题分析,确定了“变形金刚包装问题”中x和y的变化范围。据此,给出了解决此问题的枚举算法:即逐一列举x和y的值,并判断是否是问题要求的解。在程序实现中,使用了嵌套循环的方法。
在逐一列举x值的情况下,Y的值是否也需要逐一列举呢?很显然,这是不必要的。x的值确定以后,y的值实际上是确定的:y=(1200-5*x)/12。如果y是一个整数,则这种装盒方案是可行的,即找到了一个解;否则,就不是一个解。因此可以设计如下算法:
(1)(计数器初始化)c←0。
(2)(x初始化) x←0。
(3)(x变化完?)若x>240则输出方案个数c,算法终止。
(4)(检查一组可能解)若(1200-5*x)/12是整数,则:输出x,y, c←c+1。
(5)(下一个可能的x)x←x+1。
(6)(继续)转到(3)。
与该算法对应的VB程序如下:
Dim x, a, c As Integer
c = 0
For x = 0 To 240
a = 1200 - 5 * x
If a Mod 12 = 0 Then
List1.AddItem Str(x) + “ ” + Str(a / 12)
c = c + 1
End If
Next
Text1.Text = Str(c)
在枚举算法中,为了提高解决问题的效率,必须尽可能地使可能解的罗列范围最小(教材95页第6行)。教材中的算法使用了嵌套循环的办法,致使解的罗列范围过大,时间复杂度为O(n2);而上面的算法只使用了一个循环语句,时间复杂度为O(n),两者效率的差别是显而易见的。
算法教学是以培养学生的算法思维能力为目的的。符合学生的特点,即学生的知识水平、理解能力、认知结构、思维习惯等,是对教材中算法的基本要求。学生通过学习,不仅要学会如何设计算法,还要学会如何判断算法的优劣,从而能在考虑时间花费、存储空间耗费(即时间复杂度和空间复杂度)问题的基础上,设计出效率更高的算法。
二、教材第89页“Leap函数”
Leap函数的功能是判断y年是否是闰年,若是,就返回1,否则,就返回0。公历闰年的判定遵循的规律为: 四年一闰,百年不闰,四百年再闰。教材第74页“问题与练习”第3题明确地给出了判定某一年是否是闰年的标准,即符合以下条件之一的年份即为闰年:
(1)能被4整除而不能被100整除。
(2)能被400整除。
据此,学生可以很容易地写出是否是闰年的判断表达式:
y Mod 4 = 0 And y Mod 100 <> 0 Ory Mod 400 = 0
由此,写出Leap函数的代码:
Function Leap(y As Integer) As Integer
If y Mod 4 = 0 And y Mod 100 <> 0 Or y Mod 400 = 0 Then
Leap = 1
Else
Leap = 0
End If
End Function
教材中的Leap函数使用了If语句的嵌套,使程序结构变得复杂。同时,判断条件与给出的两个判断标准也没有对应关系,而是将两种情况混合在一起进行判断。先在外层I f语句中判断y能否被100整除,再在嵌套的I f语句中判断能否被400整除,或者被4整除。实际上,条件“y Mod 100 = 0”包含在条件“y Mod 400 = 0”中,这种条件的分割很不合理。
尽管教材中设计的Leap函数能实现问题所要求的功能,但是,判断条件混乱,程序结构不清晰,不利于学生的理解。
三、教材第31页“冒泡排序”
教材中将冒泡排序定义为“冒泡排序是在一列数据中把较小的数据逐次向上推移的一种排序技术”,这种描述是不严谨的。实际上,将较大数据逐次向下推移也是冒泡排序。
数据排序涉及到两种基本操作:①比较两个数据的大小;②将数据从一个位置移动到另一个位置。对于冒泡排序,有以下几个特征:
(1)从数据序列的一端开始比较,逐次推移到另一端。
(2)比较两个相邻的数据,若为逆序,则将两个数据交换位置。
(3)每趟比较的数据规模是递减(每次减1)的, 每趟
比较的结果是将该趟比较范围内的一个最小数据排在其它数据的前面,或者将最大数据排在后面。
(4)判断冒泡排序结束的条件是“在一趟排序过程中没有进行过交换位置的操作”。
在冒泡排序的过程中,关键字较小的数据好比水中的气泡逐趟向上飘浮,关键字较大的数据好比石块往下沉,这就是冒泡排序名字的由来。
四、教材章节的安排
教材为了突出算法在教材中的核心地位,区别于以前以程序语言教学为中心的教材编写模式,将“算法实例”与“算法实例的程序实现”分开,单独列为第二章。实际情况是,这种安排并不科学,内容编排上过分强调知识体系的系统性与逻辑性,反而给学习、教学带来了很大的不便。
转变以程序语言教学为中心的观念,实施以算法设计为主体的教学,不能矫枉过正。突出算法的核心地位,关键不在形式上,而是在内容上。程序语言也是算法的一种表示形式,算法和算法的程序实现联系非常密切,二者的关系是相辅相成的。第二章“算法实例”和第五章“算法实例的程序实现”的内容具有对应关系,联系紧密,人为分割,只能增加学生学习和教学的不便。建议将这两章合并为一章,放在教材的最后。
另外,第23页图2.1.3中“x←1”应改为“x←0”,第26页图2.2.2中“数据输入完?”改为“r=0?”更为合适,第97页附图2.1.3中“x←1”应改为“x←0”, “x>100?”应改为“y>100?”。
参考文献
1 严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,1997
一、教材第23页“变形金刚包装问题的算法”和第97页的“程序实现”
教材通过问题分析,确定了“变形金刚包装问题”中x和y的变化范围。据此,给出了解决此问题的枚举算法:即逐一列举x和y的值,并判断是否是问题要求的解。在程序实现中,使用了嵌套循环的方法。
在逐一列举x值的情况下,Y的值是否也需要逐一列举呢?很显然,这是不必要的。x的值确定以后,y的值实际上是确定的:y=(1200-5*x)/12。如果y是一个整数,则这种装盒方案是可行的,即找到了一个解;否则,就不是一个解。因此可以设计如下算法:
(1)(计数器初始化)c←0。
(2)(x初始化) x←0。
(3)(x变化完?)若x>240则输出方案个数c,算法终止。
(4)(检查一组可能解)若(1200-5*x)/12是整数,则:输出x,y, c←c+1。
(5)(下一个可能的x)x←x+1。
(6)(继续)转到(3)。
与该算法对应的VB程序如下:
Dim x, a, c As Integer
c = 0
For x = 0 To 240
a = 1200 - 5 * x
If a Mod 12 = 0 Then
List1.AddItem Str(x) + “ ” + Str(a / 12)
c = c + 1
End If
Next
Text1.Text = Str(c)
在枚举算法中,为了提高解决问题的效率,必须尽可能地使可能解的罗列范围最小(教材95页第6行)。教材中的算法使用了嵌套循环的办法,致使解的罗列范围过大,时间复杂度为O(n2);而上面的算法只使用了一个循环语句,时间复杂度为O(n),两者效率的差别是显而易见的。
算法教学是以培养学生的算法思维能力为目的的。符合学生的特点,即学生的知识水平、理解能力、认知结构、思维习惯等,是对教材中算法的基本要求。学生通过学习,不仅要学会如何设计算法,还要学会如何判断算法的优劣,从而能在考虑时间花费、存储空间耗费(即时间复杂度和空间复杂度)问题的基础上,设计出效率更高的算法。
二、教材第89页“Leap函数”
Leap函数的功能是判断y年是否是闰年,若是,就返回1,否则,就返回0。公历闰年的判定遵循的规律为: 四年一闰,百年不闰,四百年再闰。教材第74页“问题与练习”第3题明确地给出了判定某一年是否是闰年的标准,即符合以下条件之一的年份即为闰年:
(1)能被4整除而不能被100整除。
(2)能被400整除。
据此,学生可以很容易地写出是否是闰年的判断表达式:
y Mod 4 = 0 And y Mod 100 <> 0 Ory Mod 400 = 0
由此,写出Leap函数的代码:
Function Leap(y As Integer) As Integer
If y Mod 4 = 0 And y Mod 100 <> 0 Or y Mod 400 = 0 Then
Leap = 1
Else
Leap = 0
End If
End Function
教材中的Leap函数使用了If语句的嵌套,使程序结构变得复杂。同时,判断条件与给出的两个判断标准也没有对应关系,而是将两种情况混合在一起进行判断。先在外层I f语句中判断y能否被100整除,再在嵌套的I f语句中判断能否被400整除,或者被4整除。实际上,条件“y Mod 100 = 0”包含在条件“y Mod 400 = 0”中,这种条件的分割很不合理。
尽管教材中设计的Leap函数能实现问题所要求的功能,但是,判断条件混乱,程序结构不清晰,不利于学生的理解。
三、教材第31页“冒泡排序”
教材中将冒泡排序定义为“冒泡排序是在一列数据中把较小的数据逐次向上推移的一种排序技术”,这种描述是不严谨的。实际上,将较大数据逐次向下推移也是冒泡排序。
数据排序涉及到两种基本操作:①比较两个数据的大小;②将数据从一个位置移动到另一个位置。对于冒泡排序,有以下几个特征:
(1)从数据序列的一端开始比较,逐次推移到另一端。
(2)比较两个相邻的数据,若为逆序,则将两个数据交换位置。
(3)每趟比较的数据规模是递减(每次减1)的, 每趟
比较的结果是将该趟比较范围内的一个最小数据排在其它数据的前面,或者将最大数据排在后面。
(4)判断冒泡排序结束的条件是“在一趟排序过程中没有进行过交换位置的操作”。
在冒泡排序的过程中,关键字较小的数据好比水中的气泡逐趟向上飘浮,关键字较大的数据好比石块往下沉,这就是冒泡排序名字的由来。
四、教材章节的安排
教材为了突出算法在教材中的核心地位,区别于以前以程序语言教学为中心的教材编写模式,将“算法实例”与“算法实例的程序实现”分开,单独列为第二章。实际情况是,这种安排并不科学,内容编排上过分强调知识体系的系统性与逻辑性,反而给学习、教学带来了很大的不便。
转变以程序语言教学为中心的观念,实施以算法设计为主体的教学,不能矫枉过正。突出算法的核心地位,关键不在形式上,而是在内容上。程序语言也是算法的一种表示形式,算法和算法的程序实现联系非常密切,二者的关系是相辅相成的。第二章“算法实例”和第五章“算法实例的程序实现”的内容具有对应关系,联系紧密,人为分割,只能增加学生学习和教学的不便。建议将这两章合并为一章,放在教材的最后。
另外,第23页图2.1.3中“x←1”应改为“x←0”,第26页图2.2.2中“数据输入完?”改为“r=0?”更为合适,第97页附图2.1.3中“x←1”应改为“x←0”, “x>100?”应改为“y>100?”。
参考文献
1 严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,1997