初中生编程审题的常见问题及矫正策略
2018-11-30金志峰
■金志峰
我们在编程教学中,经常会遇到各类问题,其中较为常见的是学生在解题过程中的审题问题。在教学中,通过查看学生提交上来的程序文件,笔者总会遗憾地发现,学生不是没弄明白题目的意思,就是不能挖掘出题目隐含的条件。只要笔者把题目要求再读一读或者稍作解释,他们会马上反应过来并能修改正确。为此,笔者根据自身实际教学经验,谈一下初中学生编程审题的常见问题及教师教学针对性的矫正策略。
一、分清主次,耐心读题,深入理解
盲目审题是学生解题的一大障碍,教学中教师的巧妙引导显得尤为重要。审编程题首先是要理解题目中问题的描述部分,这其中含有这个题目的已知条件,解题的关键是将这些条件认真分析,加以整理,发现隐藏在其中的条件和规律,然后再选择正确的算法和数据结构加以解题。
有时候,编程题不会像数学题那样,直接将已知条件告诉你,再告诉你要求什么。出题者往往以故事开头,这些故事可能对问题的解决毫无帮助。例如,“秘密会谈”中一开始讲述了世界为什么会毁灭,各国重要人士将云集北京进行秘密会谈寻求解救策略……这些信息其实和解题基本无关,真正有用的信息是最后叙述的这些重要人士坐的地铁出发时间和速度,求这些人什么时间能到达北京。很多学生被一开始所讲的故事给迷惑了,都以为题目内容这么长,肯定很难做。
针对这种情况,笔者的策略是指导学生耐心读题、深入理解。对于很长且一时半刻不能理解的题目,教师需告诉学生要有耐心和信心,学会心理暗示:这题就是题目有点长且不太好懂,看懂了就很简单。我们关心的不是故事中说了什么,这些事是不是真有,而是要从故事中提取出有用的信息,知道真正要让我们处理什么样的数据,要得到什么结果。这样才有可能正确理解题意,从而深入解题。正是在笔者指导下用这种方法审题,多数学生很快就把上题做出来了。
二、重视变量,立足基础,灵活应用
在做题时,忽视条件中的变量数据范围是学生解题的又一大障碍。同一个题目,因变量的数据范围不同可能会影响到定义的变量和解题方法。教师该如何帮助学生有效避免这类问题呢?以下,笔者列出了学生由于未注意数据范围因素而可能会出现的问题及教师的辅导策略。
在Pascal中,每个变量具有一个特定的类型,它决定了变量的存储器的大小和布局、范围内的值可否存储在该存储器内。在实际审题过程中,学生往往会只注重解题方法,而忽视题目中变量的数据范围。例如,“Oliver的成绩”这道题目中的数据规模:
对于50%的数据,0<N<1000,0<M<19。
对于100%的数据,0<N<1000,0<M<30,且都为整数。
分析:M是Oliver的成绩变量的位数,一开始很多学生把M设置成longint类型,长整形变量最大范围是10位数,int64类型变量最大范围是19位。题目规定50%的成绩M是19位。所以,把M设置成长整型的学生测试成绩是0分,把M设置成int64类型的学生测试成绩是50分,只有用高精度方法做的学生才能得到100分。
针对这种情况,我们必须帮助学生打好自身基础,牢记各变量类型特点。我们还要帮助学生养成仔细分析数据范围的习惯。一般的试题都会告诉你数据范围,如30%的数据在一个小的范围,60%以内的数据在稍大的范围,100%的数据是更大的范围。首选目标是针对100%的数据范围进行仔细分析研究,尽量要拿全分。假如学生确实只能解决小数据的,应放弃全对的期望,切不能因贪心而导致一分未得。
三、考虑时空限制,充分分析,巧妙应变
评价学生程序的重要指标就是题目中所给出的时间和空间数据。通常,在竞赛中都有运行内存和测试点时间限制的数据说明。同一个题目如果数据限制差异大的话可能难度差异也很大。从某种意义上说,这些数据限制也暗示了可能的算法,数据小,也许是搜索派上用场的时候,数据大了,可能只能考虑动态规划、数学方法等高效的算法了。
例如,“乌龟棋”一题大意是有M张爬行卡片,分成4种不同的类型,每种类型的卡片上分别标有1、2、3、4四个数字之一,表示使用这种卡片后,乌龟棋子将向前爬行的格子数。用不同的使用顺序得分不同,求最多能得到的分数。(N≤350,M≤120,每张卡片不超过40)有学生定义了数组a:array[1..350,1..40,1..40,1..40,1..40]of longint。longint类型占用4个字节,此数组占用空间为:350*40*40*40*40*4/1024/1024=3417.97M。一般题目不会提供这么大的空间,所以即使下面的程序写得再好也会因爆空间而得0分。
分析:程序题目的说明部分会给出“运行内存上限”,常见的数据有128M、256M、512M。我们在写程序时,数据一定不能超过这个内存上限。
爆空间相当于编译不通过,测试直接零分。如何避免超内存上限呢?我们需要指导学生学会准确计算自己定义的数组占用空间值,可通过writeln(sizeof(数组名)div 1024 div 1024)表达式求出。若数组容量超空间,我们可以减小数组维数和个数,并应用哈稀表、循环队列等加以修正。我们还应让学生明白:由于空间复杂度和时间复杂度在一定条件下可以相互转化,所以,在时间要求允许的前提下可考虑利用多余的时间来减小空间的占用。
编程审题是学生解题过程中很重要的一个环节,我们千万不能忽视。学生不应在没有完全理解题意的情况下上来就写程序。江苏省信息奥赛高级教练员林厚从老师对学生有这样的要求:在信息奥赛解题过程中要把握好三个三分之一,即审题、编程、测试。每一题花在这三部分上的时间都要尽量平均,不要斩头去尾。这是非常有道理的,没有经验的学生几乎会把所有时间都放在编程这一部分上,忽视审题和测试。因此,想要正确解题的第一步就是做好审题环节。