从一道高考算法试题谈起
山东省临沂二中 许永忠
2007年山东省高考试题(文、理)中有一道算法试题,摘录如下:
10.阅读右边的程序框图,若输入的 是100,则输出的变量 和 的值依次是( )
A.2550,2500
B.2550,2550
C.2500,2500
D.2500,2550
这是一道明显有错误的试题,然而到目前为止,还没有发现有人指出这一错误。这说明,人们都不认为这是错误的,或者认为这种错误是可以允许的。在中学课外资料中,类似的错误比比皆是。目睹这一状况,笔者认为很有必要谈一谈自己的看法,以避免类似错误屡屡发生。
1 错在何处
在中学算法这一章中,教材中介绍了两种循环结构:当型循环和直到型循环,其框图结构如下:
当型循环 直到型循环
两种循环的主要区别是:当型循环在条件成立时执行循环体,条件不成立时退出循环,先判断条件,条件成立后才执行循环体;而直到型循环是在条件不成立时执行循环体,条件成立时退出循环,先执行循环体,然后才判断条件。
在上面的试题中,如果看成是当型循环,则应在条件成立时执行循环体,向下的出口不应标“否”;如果看成是直到型循环,则判断框应放在循环体的最后而不是开始位置。因此,试题中涉及到的循环结构既不是当型循环也不是直到型循环。
2 错因分析
由以上分析可知,这是一道有错误的试题。然而这一错误,既没有影响考生答题,也没有引起人们足够的重视。这一现象的发生是有其潜在根源的。
2.1 教材和教师方面的原因
算法是新课标中新增的内容,以前中学从来没讲过算法。算法只在大学里讲,并且只在计算机相关专业才讲。许多数学教师在大学里虽然学过计算机语言,但一般不学算法,况且要求都很低。这就造成了数学教师在这方面的缺失。对于类似的错误,有些细心的教师虽有些疑问,但在中学也难以找到明白人商讨,加上各方面资料的误导,也都逐渐采取了默许的态度。
2.2 各种资料的误导
下面是两道流传甚广的中学算法题,在很多资料上都可以见到。
例1 以下给出的是某一算法的程序框图。这一算法的功能是_________。
(例1图) (例2图)
例2 如果上述程序运行的结果为S=132,那么判断框中应填入k___.
这是两道流传甚广的题目,其错误都与高考试题中的错误如出一辙。应该说,人们对今年高考算法题目中的错误之所以能接受,这些资料真可以说是“功不可没”。这使笔者想到一句俗话:“谬误传千遍便成真理”,然而这样的“真理”真的是真理吗?遗憾地是,在许多教材、教参和学生用书中,类似的错误还有很多。
3 对两种认识地分析
然而,笔者在教学中仍然发现有许多教师对这种错误有这样或那样的“理解”,找出各种理由试图说明上面的问题不是什么错误。这些错误认识归纳起来主要有两种。
(1)框图不是程序,只要逻辑上没有错误就行了
按照这种理解,上面框图是没有错误的。但是,我们不得不想想框图的作用。请注意,《普通高中数学课程标准(实验)》中所用的词语都是“程序框图”,并指出“经历将具体问题的程序框图转化为程序语句的过程,理解几种基本算法语句”。程序框图不同于一般的流程图。程序框图是为编写程序服务的,如果一个算法的程序框图无法转化为程序,那么再好的算法也是毫无意义的。这就好比盖楼要先画图纸,如果根据你画的图纸无法盖出楼来,那么这样的图纸意义何在?
不难发现,上面试题中的框图是无法用教材中的语句实现的。
(2)可以用其他语言实现,因此不能算是错误
笔者最近研究了一下Visual BASIC 2005,以上框图是可以用其中的语句实现的。这是否可以作为以上框图没有错误的一个旁证呢?我认为不能。
我们思考问题、命制试题、编写资料时都应以《普通高中数学课程标准(实验)》和相应的教材为依据,也就是要以学生的知识背景为依据。脱离了这一基本要求,也就脱离了目前中学的教学实际,也就出现了“超纲”现象。超纲历来是命题者的大忌。
毫无疑问,算法框图受程序语句和程序结构的制约。在教学中,我们不能超出这一制约。比如,如果我问“方程 有解吗?”小学生和初中生的回答肯定是“无解”,而学过复数的高中生会回答“有解”,而教师则会说“在实数范围内无解,而在复数范围内有解”。可见,同一个问题在不同的知识背景下答案是不同的。如果我把“写出方程 的一个解”这一问题放在初中试卷上,你认为合理吗?那么同样的,上面的试题放在目前知识背景下的学生的高考试卷上,你认为合理吗?
4 结束语
实际上,以上高考试题中的错误影响并不大,出现一次这样的错误并不可怕,可怕的是人们对这一错误的漠视甚至不认为是错误的这一现状。在各种教材、教参和学生资料的算法内容中,还在继续着类似的错误和其他许多错误。我们真诚期待广大教育工作者,特别是各种资料的编者们,能细致地研究研究相关内容,提高自身素质,避免错误的发生和流传。