当前位置:首页 期刊杂志

从小学典型数学问题出发在编程学习中培养计算思维

时间:2024-07-28

董烨华

(浙江省绍兴市第一中学,浙江 绍兴 312000)

1 引言

计算思维是个体运用计算机科学领域的思想方法和在形成问题解决方案的过程中产生的一系列思维活动。[1]计算思维的本质是抽象。[2]编程教学是计算思维培养的重要手段。目前,面向小学生的编程课程,以Scratch一类的可视化编程和乐高机器人一类的实体设备编程为主。像C++这类注重算法学习的编程课程是比较小众的,究其原因在于C++编程解决的问题较抽象、思维难度较大。笔者面向小学高年级学生开设C++编程课程,培养学生计算思维,尝试将编程解决的问题与小学数学课堂典型问题结合,使得教学更“平易近人”。

2 开展C++编程教学的抽象基础

瑞士知名教育学家、心理学家皮亚杰提出了儿童认知发展理论。根据该理论,小学高年级儿童认知发展正处于具体运算阶段向形式运算阶段过渡,已经适合抽象思维的培养。抽象是计算思维的核心。在小学高年级通过编程培养学生计算思维,正是抓住了学生抽象思维发展的关键时期。在教学中,要提升并借助学生的形象思维能力,培养学生的抽象思维能力,最终使学生在问题解决过程中能习惯运用计算思维。

小学高年级学生已经具备了良好的语言学习基础。语言语法的突出特点是其抽象性。除了语音和词汇均各有其抽象性,语法的抽象性是所有这些抽象基础上的更高层次的抽象[3]。面向小学生的C++编程教学,一方面,要以问题解决为中心,弱化语句语法学习,减少学生因为语法的抽象对问题解决感到困扰,语法学习做到够用就行。例如,C++的循环结构有for循环、while循环、do…while循环,在实际教学中可以先只学一种for循环,直到学生能熟练运用,再拓展介绍其他循环语法。再例如,for循环在实际编程中可以有很多灵活变化的写法,教学时要尽量从最一般的格式入手,在之后学习中根据问题需要再做格式上的加减操作。另一方面,要利用好学生原有自然语言抽象概念、数学语言抽象概念,将其迁移到编程学习中,帮助学生完成二次抽象,即计算思维相关的抽象。可以让学生将C++语法保留字作为英语单词记忆,记住了单词的含义也就大致理解该保留字的C++语法意义。然后,要求学生习惯用自然语言将问题解决的算法思路讲出来。实践表明,通过以上问题解决中自然语言和C++代码的抽象含义对应,学生很快理解了if语句语法,掌握速度和理解Scratch编程相应功能模块无明显差异,后者是自然语言和Scratch图标抽象含义的对应。

3 数学学科核心素养与计算思维培养

计算思维源于数学思维与工程思维,数学思维最大的认知特征便是:概念化,抽象化,模式化。《普通高中数学课程标准》提炼的数学学科核心素养为:数学抽象、逻辑推理、数学建模、直观想象、数学运算、数据分析,而这些正与计算思维过程中分析数据、界定问题、分解问题、抽象特征、建立结构模型、算法实现等环节高度对应。所以,从数学问题出发在编程学习中提升计算思维能力,具备良好的迁移基础,可以实现数学学科核心素养和信息技术学科核心素养双发展。

3.1 分析、界定与分解

分析、界定与分解是在收集、分析数据基础上实现数据表征、概念界定、明确问题实质,并将一个复杂的问题分解成若干易处理的子问题的过程。教学中可以从典型数学问题出发,将问题解决过程中分析、界定与分解的思维过程进行强化。例如,人教版《数学》三年级下册的一个面积计算问题(以下简称例1):客厅的长是6米,宽是3米;正方形地砖的边长是3分米;问铺满客厅地面一共要用多少块地砖。经过分析,我们可以得出问题涉及:正方形、长方形、边长、长、宽、面积等概念,问题的实质是与面积有关,涉及不同长度单位的换算,是整数运算。问题可以分解为:①求客厅地面面积问题;②求地砖面积问题;③求两个面积之间的关系问题。还可以分解为:①求客厅地面的长对应几块地砖的问题;②求客厅地面的宽对应几块地砖的问题;③已知客厅地面长和宽分别对应地砖数,求总地砖数问题。

3.2 抽象与建模

抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。计算思维下的抽象可以归纳为三个逐级上升的层次:概念抽象→数学抽象→计算抽象。[4]建模就是建立结构模型,是为了理解事物而对事物做出的一种抽象,同样可以对应概念建模、数学建模、计算建模三个层次。回到例1,之前的教学中学生应该已经理解了正方形、长方形、长、宽、面积等抽象概念,在本问题中是把地砖抽象为边长为3分米正方形这个数学模型,地面抽象为长6米、宽3米的长方形模型。如果采用例1中第二种问题分解方式,还需要分别从地面和地砖边长中抽象出线段模型。

计算建模是要让这个模型可以被运算,可以交给计算机帮助运算解决,要考虑从具体个例到一般情况的抽象泛化。例1中提供的数据符合长方形的长和宽是正方形边长的倍数,针对这组特殊数据,可以在整数运算范围下,采用前面提到的两种方式来分解问题、抽象建模。如果把问题数据一般化,可能出现客厅地面面积不能被瓷砖面积整除的情况,建模就要考虑小数运算,还要从工程思维的角度分析,不凑整的面积地砖怎么拼,1/3块地砖算不算用掉一块。于是在计算建模的时候,需要加上一些约束条件。如果条件保证客厅地面面积数据一定能被瓷砖面积数据整除,又会出现前面第一种问题分解方式在某些数据情况下不符合实际的情况,比如长6米、宽1米的客厅地面和3分米边长的地砖,虽然两者面积可以整除,但实际铺设的时候地砖是要切割了的。所以,围绕典型数学问题,教师需要在教学中帮助学生巩固相关概念,明确数学模型;要引导学生提炼出可运算、一般化的计算模型。

3.3 设计算法

算法的概念源自数学,在数学中,算法通常是指能够使用计算机来解决的某一类问题的步骤或程序,这些步骤或程序必须是明确和有效的,而且能够在有限步骤之内完成。[5]浙教版《信息技术必修一数据与计算》教材中给出广义的概念,“算法”是解决问题或者完成任务的一系列步骤,解决的问题不仅仅指传统意义上的计算任务(算术),还可以是社会生活中各种事务的处理。在计算机学科领域内,“算法”指的是用计算机解决问题的步骤,是为了解决问题而需要让计算机有序执行的、无歧义的、有限步骤的集合,需要解决的问题包含数值计算和非数值计算的数据处理。根据广义的算法概念,可以认为计算思维不仅适用于数学学科和计算机学科,也适用于其它各个学科领域的问题解决过程,是一种通用思维。数学学科和计算机学科中“算法”的定义高度一致,可见,从解决数学问题出发培养学生计算思维是一条最直接的路径。例1面积计算问题,在计算建模基础上,分解的子问题①、②、③,可以设计成有先后关系、依次执行的三个算法步骤:①→②→③或者②→①→③,每个子问题又有相应的算术运算步骤。

4 从小学典型数学问题出发的编程学习实例

4.1 从常用编程语法教材中发掘学习实例

在C++语言入门教材里一般都会用到一些小学数学相关的例题和练习题,对于大部分教材用户,小学数学问题已经不存在数学建模的困难,所以这些题目的作用主要是帮助熟悉C++语法,但在面向小学生的教学中,这些题目往往是开展计算思维培养的好素材。教师要善于把数学问题和小学数学课堂结合起来,为最终通过计算机编程解决搭建良好的思维情境。例如,判断闰年问题是编程常用例题,教师可以从人教版《数学三年级下册》第六课“年、月、日”找到数学基础。教学中可以结合数学教材,完成闰年等概念抽象,同时明确什么是判断闰年问题。接着,通过分析闰年形成的原因,让学生了解数学教材里判断闰年的规则“公历年份是4的倍数的,一般都是闰年;但公历年份是整百数的,必须是400的倍数才是闰年”。下一步,把年份抽象成一个数字,问题就转换为对年份数字的判断,完成计算建模。将闰年判断规则整理为可操作的算法步骤:判断年份数字能被4整除但不能被100整除,或者判断能被400整除。最后,用C++代码实现,语法要求并不高,套用IF语句格式就行。另外,像“鸡兔同笼”问题也是很好的例题,人教版数学教材里先让学生通过列表分析“鸡、兔、脚”之间的关系,所以编程教学中需要从枚举算法入手,之后可以拓展解析算法,这样会更符合计算思维解决问题的过程。

4.2 从小学数学教材入手开发学习实例

教师可以从数学教材中找适合运用计算思维的问题实例。例如,人教版《数学五年级上册》第七节“植树问题”。植树问题是指在一定的线路上,根据总路程、间隔长和棵数进行植树的问题。编程解决的问题简单描述为“总路程为L米的马路,在一边每间隔S米种M棵树,一共要种几棵树”。抽象建模:树用点来表示,植树的沿线用线来表示,这样就把植树问题转化为一条非封闭或封闭的线上的点与被均分的线段之间的关系问题。算法设计:根据问题描述,如果线段两端都植树,计算公式:总数=(L÷S+1)×M。代码编写只要定义相应int类型变量,顺序结构可以实现。

可以对教材中的数学问题进行拓展。例如,植树问题进行拓展,描述为“长度为L米的马路上有一排树,树从头到尾间隔1米种植,现在马路中的一段要建十字路口,要把从A米起到B米之间的树移走,问还有多少棵树”。抽象建模仍然是线上的点与被均分的线段之间的关系问题。算法可以0到A-1的线段上点的个数加上B+1到L的线段上点的个数,也可以是0到L的线段上点的个数减去A到B的线段上点的个数。

将上述植树问题再进一步拓展,就是一道经典的全国信息学奥林匹克联赛试题“校门外的树”(NOIP2005普及组第二题),问题简单描述:某校大门外长度为L米的马路上每间隔1米种着一棵树,把马路看成一个数轴,即数轴0到L的位置都种有一棵树,马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点的坐标表示,这些坐标都是整数,区域之间可能有重合的部分,现在要把这些区域中的树移走,问马路上还剩多少棵树。问题拓展到这里,学生对其数学模型已经很清楚了,但在计算的时候如果分别考虑地铁区域的起始点和终止点坐标,一段一段来计算会十分复杂。计算建模可以考虑按建地铁区域要求将所有树都移走后数轴的最终状态,0到L的数轴上一些点有树一些点没有。所以,C++编程中定义长度为L的数组,模拟这个数轴状态变化就行。

5 结束语

C++语言在小学被认为是编程界面枯燥、学习难度大的一种编程语言。笔者认为,字符化编程界面并不是孩子们缺少兴趣的原因,看烦了都市五颜六色的霓虹,你会发觉寂静夜空的美丽。编程学习中的抽象和算法设计的复杂,才是真正让孩子们感到困难的,而这些正是计算思维培养的最核心内容。对于小学高年级的孩子来说,在编程学习中过多地将时间花费在如Scratch图形对象的设计上或者机器人编程硬件设备的组装上,而问题本身的算法难度不提升,那么,一则培养效率低下,二则会阻碍孩子抽象能力的发展。从小学数学问题出发在小学高年级开展编程教学是计算思维培养一条顺理成章之路。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!