计算思维视野下算法与程序设计题的学生解题能力培养

    詹建兵

    

    

    《普通高中信息技术课程标准(2017年版)》将计算思维作为信息技术的学科核心素养,同时指出,在算法与程序设计模块中学生需要“理解利用算法进行问题求解的基本思想、方法和过程,掌握算法设计的一般方法,能描述算法,分析算法的有效性和效率,利用程序设计语言编程以实现算法,并能有意识、负责任地应用算法解决实际问题”。随着浙江省学考和选考的分离,选考中算法与程序设计模块的分值明显增加,这充分体现了计算思维的核心地位。于是,笔者在自己的教学中从知识技能落实、解题步骤思考及学习效果总结这三个层面构建并尝试计算思维视野下算法与程序设计题的学生解题能力培养策略。

    ● 注重知识技能落实,夯实学生的思维基础

    1.加深印象,巩固基础知识

    算法与程序设计模块的主要内容是系列常用算法的思想及其程序实现,这些内容的学习巩固应该从对算法基本思想的理解开始,到用自然语言及流程图描述算法,最后形成模块化的程序代码。通过层层递进实现计算思维中概念界定、变量假设、数学模型创建、问题解决等过程;同时也让学生加深对相应算法内容的印象,巩固算法基础知识。

    2.举一反三,理解算法变式

    对于常用算法的考查,在高中信息技术学考选考题中一般都通过设置相应算法变式进行。纵观历次考试真题,在9次选考的程序设计题中共有4次出现了冒泡排序,涉及知识点分别是冒泡排序优化、冒泡排序中数据移动的过程、剔除重复数据并排序、冒泡排序奇偶数列排序的变式等。另外,在选考题中还经常涉及数组基础知识的变式内容,如桶思想应用、矩阵变换思想、字符的加解密等问题。因此,在复习中应该引导学生在掌握常用算法的基本思想后要多进行举一反三,以拓展思路,理解算法变式。

    3.上机操作,梳理综合程序

    由于算法与程序设计模块的综合题是浙江省高中信息技术学考选考的压轴题,其题型多变,程序复杂,综合性强,这就需要学生在掌握基本知识点的基础上具备将多个程序整合重组的能力(根据所需要解决的问题,运用嵌套的选择语句或循环语句等将多个程序组合成一个程序)。笔者在复习时通过组织学生进行上机操作来培养学生该方面的能力,如让学生编写一个课间操排队程序。由于学生在编写该程序时既用到了运算量、基本语句及程序的多重嵌套等基础知识,又用到了数据库数据读取、排序算法及数据去重等多种数据处理技能。因此,通过对该程序的编写调试,有效夯实了学生分析问题、合理运用算法编程解决问题的思维基础,从而提升了学生的解题能力。

    ● 注重解题步骤思考,强化学生的思维意识

    算法与程序设计模块综合题是改错题或填空题,题目已给出了相应的代码轮廓,需要学生按出题者的思维完成对题意的分析并解题。另外,选考试题阅读量大,考试时间紧,通常在十分钟左右就要解决一道综合题。因此,考试中有效的解题方法与技巧必不可少。

    1.明确要求,把握关键点

    阅读题中主要是文字描述,并将要实现的功能重点圈出,若程序实现有先后顺序(特别是涉及字符加解密类别的程序设计题),则可将各类功能按照一、二、三排列,简要写在边上。读懂了题目意思后,再结合所给的例图进行具体数值的带入运算,检验程序是否按刚才所读懂的功能进行。例如,2020年1月的选考题,文字题目中仅仅说明了要实现的功能效果,而具体实现的步骤都体现在所给的例图中。此外,把握题目关键点后,可以先想一想如果自己要编写该程序,应通過怎样的流程来实现,将思维从人的思想转换为运用计算机可以实现的方式分析问题、建模处理,为之后的解题提供参考。

    2.划分模块,分析程序功能

    明确自然语言及例图所描述的算法实现步骤之后,为了提高解题效率可以直接开始阅读代码。程序设计选考题的程序代码通常由很多语句组成(少则十几行,多则可达到五六十行),看起来十分复杂。因而阅读代码的第一步是根据各类语句的基本结构进行区域划分,明确循环语句、选择语句如何执行,梳理程序的功能效果。另外,对于循环语句要特别注意多重循环嵌套的效果,对于选择语句要特别注意是行还是块If语句。

    3.对应流程,生成解题思路

    虽然审题时已经尝试按照自己的思路设计程序代码,但是相同的功能可以用不同的代码来实现,更何况程序设计选考题是按出题者的思路去解题。因此,划分完程序代码模块后需要马上通过代码去理解出题者的思路。结合前两步的算法思想梳理及功能模块划分,一一对应,明确填空或改错所在的代码位置及其大致要实现的效果。另外,有些程序设计选考题的程序代码中给出的注释可能包含关键信息(提示某个变量具体存储的内容或者是接下来一段代码总体实现的功能等),这对解题起到了很好的提示作用。

    4.结合思路,完成相应代码

    理顺算法实现过程及代码后应该就能明确本空格所要实现的功能,再联系其前后代码,开始填空或改错。首先,找出当前代码中算法的关键点,回忆本题是否有相关的基本算法,警惕其中易错点。例如对分查找算法,要明确对分查找的原理、对分查找的范围、每一次对分查找中点数组元素下标及通过flag逻辑变量跳出循环的方式、If与ElseIf语句的不同实现效果等。其次,注意填空或改错在程序中的位置,其填写内容大致可以总结为“循环前赋值、循环中变化、循环后输出”。循环前一般考查的都是赋值语句,可能是从VB界面中获取值,也可能是类似于0、1、2之类的数字;循环中的改错或填空应根据题意去写,可能是变量的变化,也可能是条件的判断;循环后的一般就是结果的输出。另外,改错题还应注意修改前和修改后内容的相似之处。

    5.代入检验,提高正确率

    为了进一步提高正确率,笔者建议在完成代码后最好将填好的内容代入原代码进行检验。在条件类的填空或改错中,首先要注意逻辑运算符号的优先级,其次还应该联系全文,查看是否有多个判断条件,特别注意是否需要加上逻辑变量flag的条件。在带有数值的填空或改错题中,需要注意各类变量的数据类型及是否需要+1、-1等数学运算。

    笔者认为,算法与程序设计模块综合题的解题步骤可按上述的五个步骤展开,逐一分析,抽丝剥茧,运用计算思维完成程序功能分析、建模处理、梳理流程及最终解题。上页图1所示为2018年11月选考的第16题的解题过程。

    ● 注重学习效果总结,巩固学生的思维水平

    1.知识技能总结,明确掌握程度

    课堂学习完成后,通过填写算法总结表(样表如图2)来罗列所学习的基本知识点。算法总结表的主要内容包括算法思想及特点、数组元素值变化、基本代码、代码变式等。

    2.练习效果反馈,细化解题过程

    每次考试或练习结束后组织学生填写练习效果反馈表(样表如图3),将典型例题抄写在试题区或直接剪下来贴在表中,从解题结果和思路启示等方面进行本次练习反馈。解题结果主要从概念界定、变量假设、数学模型创建等出发,结合练习中出现的一系列常见问题来分析题目做错的原因;思路启示主要是对一些新型解题思路进行汇总,如算法变式等。