高中程序设计试题的设计与修改
孙秀峰
《普通高中信息技术课程标准(2017年版)》(以下简称《标准》)要求普通高中信息技术课程内容要紧扣数据、算法、信息系统和信息社会等学科大概念,培养学生信息意识、计算思维、数字化学习与创新、信息社会责任。计算思维是指个体运用计算机科学领域的思想方法,在形成问题解决方案的过程中产生的一系列思维活动,运用合理的算法形成解决问题的方案,并迁移到与之相关的其他问题的解决中。《标准》中对“必修课程模块1:数据与计算”中的程序设计的要求是:“掌握一种程序设计语言的基本知识,使用程序设计语言实现简单算法。通过解决实际问题,体验程序设计的基本流程,感受算法的效率,掌握程序调试与运行的方法。”这就明确了在这一轮课改中,普通高中信息技术课程需要进行程序设计语言的教学。在众多程序设计的语言中,Python作为一种面向对象的解释型计算机程序语言,具有简单、免费、开源、可移植性的特点,在信息技术新教材的编写时倍受青睐,成为首选。
在2003版课标实施的十多年里,笔者所在地区的普通高中信息技术选修课程没有选择“算法与程序设计”模块,很多高中信息技术教师也十多年没有教授过程序设计,因此,为了更好地学习和使用新教材,笔者所在地区组织了全体高中信息技术教师Python语言线上培训,在培训时一道关于循环结构的填空题引起了大家的热议。
● 试题及参考答案分析
題目如图1所示,这是一道经典的循环结构程序题。在分析本题答案之前先要了解range()和print()两个函数相关的参数含义。函数Range()格式:range(begin,end,step),如下页表1所示。函数Print()格式:print(value,…,ep='',end='\n',file=sys.stdout, flush=False),如下页表2所示。
参考答案为:①1,101;②s+i;③s。分析:①空需要填写的内容为变量i从1穷举到100,故填1,101;根据②空后面的提示,将变量i的值累加到累加器s中,故填s+i;③空就是要填输出累加器s的值,故填s。
本题的参考答案是教师和学生们很容易思考到的,也符合常规思维,但由于本题设计的填空关联度非常高、Python语言的range()函数的参数可省略和print()函数的格式灵活性等特点,教师们经过讨论发现本题除了参考答案外还有许多解,答案不是唯一的,无论是笔试还是机试,教师在批改作业时都会遇到麻烦。
● 多解详细分析
解法1:①空填“1,100,1”或“101”,②、③空不变。
分析:range(1,101,1)的步长为1,生成1,2,3,…,100的序列,range(101)表示从0开始计数,生成0,1,2,3,…,100的序列,循环执行后变量s中保存的结果是从1到100的和。range(101)多执行一次循环,结果不变;range(1,101,1)跟range(1,101)执行循环次数是一样的。
解法2:①空填“1,100”或“100”,②空不变,③空填s+100。
分析:range(1,100)生成1,2,3,…,99的序列,range(100)生成0,1,2,3,…,99的序列,循环执行后变量s中保存结果是从1到99的和,最后通过输出时s变量+100,如此也能求出1到100的和。当然,顺着这种填法,若①空填“99”、③空填s+100+99,输出结果也是1到100的和,如此思路还会填出多种组合的答案来,但缺少理由认为这些答案就是错误的,只是没有充分利用for语句功能而已。
解法3:①空填“100,0,-1”,②、③空不变。
分析:range()函数的步长参数可以为负数,生成的序列为倒序。例如,range(100,0,-1)生成从100至1、间隔为1的连续递减的等差数列序列100,99,98,…,2,1,从而求出从100到1的和。有时我们逆向思考,采用倒序也是解决问题的好方法。
解法4:①、②空不变,③空填“'和=',s”或“"和=",s”等。
分析:print()函数可输出多个value,value可以是数值也可以是字符串等,若加上字符串可清晰地显示输出的值是什么的结果,如此解输出为“和=5050”,结果指向性更明确。因为字符串的值可以任意选取,以及print()函数可以设置“sep=''”等多个参数,所以③空还能填出许多种答案,如print(s,sep='')等。
解法5:①、②空不变,③空填“5050”。
分析:高斯巧妙地用(1+100)×50很快就把本题结果计算出来了,如果有学生在③空就填“5050”,是正确还是错误呢?因为本题是计算1+2+3+…+100的和,程序不需要输入,程序结果是什么也是已知的,程序运行后结果显示也是正确的,如此填写很难确定是对还是错。当然,如果学生要这样填,只是本题程序运行结果显示正确,但并没有充分理解累加器s的作用,也没有理解程序设计的基本流程,不利于培养计算思维,也不利于分析和理解算法,所以教师在教学过程中需要加强算法引导防止此类现象发生。
● 试题修改及解析
由于在设计本题的题干时,填空的限制条件相对宽松,导致多解,综上分析,为使答案具有确定性,从而更好地培养学生的计算思维和编程能力,也方便教师讲解此题和批改作业,可进行如下几种修改。
修改1:若填写参考答案的结果,可增加题干限制性说明(如下页图2)。
解析:增加两处限制说明,学生解题时方向清楚,答案也就明确,考查学生的“双基”。
修改2:调整填空项(如下页图3)。
解析:将变量i的取值范围和输出固定,这样设计的填空既考查了学生Python语句的基本知识,又训练了学生的计算思维,培养了学生分析问题的能力。
修改3:设计成一道单项选择题,或设计成一道多项选择题。
设计成单项选择题时,选项可设为:
A. ①1,101? ②s+i? ③s
B. ①1,100? ②s+i? ?③s
C. ①1,100? ②+i? ?③s
D. ①1,101,1 ②s+i? ③i
设计成多项选择题时,选项可设为:
A. ①1,101? ②s+i? ③s
B. ①101? ?②s+i? ③s=,s
C. ①100,0,-1 ②s+i? ③s
D. ①100? ? ②s+i? ③s
多项选择题四个选項中有A、B、C为正确选项,若题干改为选择一个错误选项,那本题就变成一道单项选择题。
解析:由填空题改为选择题既考查了学生掌握相关知识点的熟练程度,也考查了学生的必备能力。
● 设计试题的思考
1.研究课程标准
课程标准是新课程改革的“魂”。《标准》明确了“高中信息技术学业评价一般包括纸笔测试、上机测试等方式”的评价方式,纸笔测试和上机测试各有所长,适合不同的评价内容和目标,应相互补充、综合运用。《标准》指出:纸笔测试的效率较高,在设计测试试卷时,要适度设置和增加要求学生通过理解和探究来解决的开放性题目,如问题解决分析等,以拓展纸笔测试在评价内容和评价目标等方面的广度和深度。上机测试可以评价学生使用技术工具的熟练程度,能够考查学生利用信息技术解决问题的能力。本轮改革没有考试大纲,只有通过不断地学习《标准》、学习不同出版社的新教材,才能掌握新课程改革的基本理念,才能科学地设计每一道题。
2.储备知识
“要给学生一杯水,教师要有一桶水”,同理,“要想出好一道题,需要储备十道题”。例如Python的知识储备,教师们可通过自学或MOOC、直播课学习,掌握语法规则,提升自身的编程能力和编程技巧,遇到问题时可在教研组或主备课活动时跟同事们研讨,也可通过QQ、微信群及时交流探讨,以达到熟练掌握和深刻理解的程度。知识储备丰富了,才能够设计出新颖、巧妙、表述严谨的试题。