编程:一种观察世界的新视角

2018-01-06 01:03胡金锦
电脑知识与技术 2017年35期
关键词:计算思维程序算法

胡金锦

摘要:让学生学习编程,引导学生深度思考算法及其工作流程,亲历问题建模、算法设计、程序实现及优化的完整过程,引领学生从计算机科学家视角分析问题、解决问题,对于学生而言,无疑是一种观察世界的全新视角。

关键词:算法;程序;计算思维;冒泡排序

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)35-0126-03

伴随面向对象程序语言的兴起,算法思维与建模能力的培养在高中信息技术课堂中一度被弱化,原因是编程环境的可视化和控件的事件响应,以及追求程序课堂的趣味性,让算法与程序设计课向多媒体技术方向发展。这样的课堂虽然没有抛弃程序基本语言的学习,但是漂亮的程序代码、严谨规范的语言风格、计算思维的训练却被忽视。我们在程序教学的路途中,常有茫然失措、忘了初心的感觉。

著名的计算机科学家、图灵奖得主艾兹格·迪杰斯特拉说:“我们所使用的工具影响着我们的思维方式和思维习惯,从而也将深刻地影响着我们的思维能力。”计算机给我们提供了一种全新的思维方式——计算思维。美国卡内基梅隆大学周以真教授认为:计算思维是人们运用计算机科学思想与方法进行问题求解、系统设计,以及人类行为理解等涵盖计算机科学广度的一系列思维活动。新课标将“计算思维”引入课堂,使信息技术课程教学从注重实践操作的技术素养层面上升到注重思维素养培养的层面。

下面,我们以《冒泡排序》为例来谈如何在程序设计课中落实计算思维的养成,以期抛砖引玉,与同行们一起努力建构更好的算法与程序设计教学模式。

1 第一层次思维:实际问题的抽象与量化

计算机思维的本质是以“0”和“1”为基础的数字量来反映真实世界。“模”“数”的转换是人类与计算机建立联系的纽带。因此,实际问题的抽象与量化是计算思维形成的第一层次。下面是我在课堂中引导学生体验实际问题抽象量化的一个课堂片段:

师:生活中,我们经常碰到排队的情况,比如:操场上排队做操、医院里排队看病。

我邀请第一排6位同学上来,要求学生按身高进行排序。“不对不对,生一应该排在生二后面……”,下面学生囔囔着。6位学生前前后后调整了几次总算排好了位置。

接着,我让后面一排6位同学先用记号笔把身高写在A4纸上,然后到上面排队,大家互相看看身高,不一会就排好了。

师(指着其中一位换到前面去的同学):请这位同学说说为什么第二次排队效率比较高。

这时学生一般会提到数字标明比较明确,方便比较大小。

(学生体验到了抽象与量化,在问题处理中的优势。)

师:学生身高抽象为数学量以后,使问题简洁明确,方便我们处理,所以下面的同学一看就知道顺序了。排队是一种排序——通过调整位置,把杂乱无章的数据变成有序数据。

师:当学生数量比较多,比如在操场上,我们就没法一眼看出谁身高第一、谁第二、谁第三……。其实,我们人脑的计算力是有限的,当随之人数的增加,数据规模就会扩大,人脑处理就会越来越困难,这时我们可以借助计算机。要让计算机帮我们排序,我们首先要记录6位同学的身高数据。我们用哪种变量类型比较适合?

生:数组。

师:嗯,数组。但计算机生活在“01”世界里,有它自己的布尔智慧,我们生活中的排序思维方法不能直接移植给计算机,而需要通过计算机的布尔逻辑特性进行算法设计以做到人机互适。计算机排序算法的类型很多,这节课我们来学习一种比较典型的排序算法“冒泡排序”。

2 第二层次的思维:基于模型建构算法

计算思维源自数学思维,像所有的科学一样,其基础建筑于数学之上。计算思维又源自工程思维,基本计算设备的限制迫使计算机学家必须考虑计算机的特性。在教学中能突破简单问题的求解,挖掘人机共存算法思维显得尤为重要。教师可以通过模拟执行法、自顶向下逐步求精法,特殊到一般归纳总结法等,给学生展示与剖析算法的原理与思想。

2.1 模拟执行,体验计算机处理数据的过程。

教师通过PPT展示冒泡排序数据存储结构:

表1

[下标 1 2 3 4 5 6 数组a() 49 97 65 13 76 38 ]

教师模拟计算机完成第一趟数据的比较和交换过程后:

师:数据两两比较一共比较了几次?

生:5次。

师:第一趟完成后数据有什么特征?

学生交流讨论得出结论,最大数97被交换到了最后。

师:第二趟比较需要比较几次?

学生交流讨论,得出结论第二次比较只需比较4次,因为最大数已经排定。

教师再演示第二遍的过程让学生印证自己的想法。

第二遍排序结束后,让学生写出第三趟排序结果,了解学生的掌握情况。之后教师进行适当的总结,让学生继续观察第四、第五遍的排序结果。总结出冒泡排序的规律:

(1) 从一端开始,逐对进行相邻元素比较

(2) 如果前一个数比后一个数大,则进行交换

(3) 重复(1)、(2)步骤直到得到一个最值(位置右端)

(4) 重复(1)、(2)、(3)步处理n-1趟,完成排序

2.2 画流程图,感悟自顶相下逐步求精的思想

教师以具体的6个数升序排序为例,由最简单的流程图1开始,让学生回顾冒泡排序的特点,每趟比较可以确定一个最数(最大或最小),确定完成6个数排序需要5趟,得出流程图2。

得出流程图2后,教师让学生思考:这种结构实际上属于什么结构?(循环结构)引入变量i进行计数,使用循环结构流程图进行进一步细化,得到流程图3。后拓展到n个数的情况,得到流程图4。

这里需要引入一个j变量来标识正在参加比较的数组元素。确定第i趟j的取值范圍为:1到n-i,得到图6。

在分析相邻数据比较交换模块时,可以描述为a(j)与下一个数a(j+1)比较大小。如果a(j)>a(j+1)就交换数据位置,得到图7。

再将“a(j),a(j+1)数据交换位置”流程细化为:t=a(j):a(j)=a(j+1):a(j+1)=t得到图8。数据交换需结合变量赋值原理进行讲解:变量名的实质是申明内存单元,赋值的过程是数据写入变量名所指内存单元的过程,新数据写入会覆盖原来的数据,造成数据丢失。

至此,所有问题、难点自顶向下逐一解决后,用自底部向上的思路形成下面总流程图,如图9。

3 第三层次思维:从算设计到代码实现

要让计算机解决问题,需要将算法用计算机“语言”表示并告知计算机,这个过程称为“代码实现”或“编程”。学生若缺乏上机编程,就无法充分理解变量定义、逻辑运算、循环嵌套、形参实参等运行机制,无法深度思考算法及其工作流程。本环节通过关键代码引导的方式让学生动手编写程序,旨在让学生通过编写代码、调试程序,亲历完整的编程过程,加深对算法的理解与应用,同时培养学生认真、严谨、坚韧的优秀品质,教学环节如下:

首先,讲解关键程序段实现方法。

1) i:控制冒泡排序的趟数,由1到n-1

for i=1 to n-1

每趟确定一个最大数

next i

2) j:控制每一趟的处理过程,控制数组下标,由1变到n-i

for j=1 to n-i

a(j)与a(j+1)进行比较判断是否互换

next j

3) a(j)与a(j+1)互换

t=a(j):a(j)=a(j+1):a(j+1)=t

接着,让学生对照流程图,自下往上,写出主要参考代码:

for i=1 to n-1

for j=1 to n-i

if a(j)>a(j+1) then

t=a(j):a(j)=a(j+1):a(j+1)=t

end if

next j

next i

在编程实现环节,学生遇到的错误五花八门,一般我们可以分为三类:编译错误;运行错误;逻辑错误。错误是课堂的生成性教学资源,是教师进一步展开教学的依据:如运行错误往往与数据溢出有关,可以加深学生对变量存储的理解,如逻辑错误,往往与学生对算法理解不到位有关,可以引导学生正确理解算法。教师要引导学生用分类的思想判别错误,用模块化的思想缩小错误范围,用逐步调试的方法锁定错误,最终达到预期效果,使学生分析问题,解决问题的能力得到提升。

4 第四层次思维:逐步养成“迭代”的思维

学习的最高层次是应用,即解决实际问题。当我们面对实际问题,通常通过观察弄清问题,抓住问题的特征进行广泛的联想、检索和回忆,制定选择最优解决方案。能否找到合适的策略与观察问题的角度及联想范围有关,受学生已有知识与经验的制约。在学生思维受阻时,我们应引导学生调整思维方向,变换角度进行分析思考,直到产生新的思路,对培养学生解决问题的能力与创新能力十分有益。

在程序与算法模块的实际教学中,可以通过对算法变形、优化及情境模拟,培养学生联想、检索、回忆等解决问题的能力。教学环节设计需要注意以下幾点:第一要有目的性,要明确通过拓展是使学生掌握算法的哪些外延与内涵,还是渗透一些算法思想与方法,第二要有适度性,过于简单易陷入简单的重复,无法提高学生思维品质,过于复杂会挫伤学生学习积极性。第三要学会放手,静待花开。通过教师的信任与等待,以及必要时机的释疑,最终厚积薄发,学生会成为独立自主、敢于质疑、有创造力与创新精神的学习资者。

在冒泡排序教学中,可以安排一系列递进的教学任务,如同质化任务:将“升序冒泡排序程序”改为“降序冒泡排序”,加深了学生对相邻元素比较判断的理解;优化任务:让学生讨论当某趟比较过程中没有数发生交换,是否需要在进行下一趟比较交换,给学生灌输流程优化的思想;变形任务:将“从前向后冒泡排序”改为“从后往前冒泡排序”,综合检验学生对冒泡思想的掌握与编程实现的能力;应用任务:评委打分,去掉最高分、最低分的实现,提高学生解决实际问题的能力……

正式在这种算法不断优化的“迭代”过程中,学生的计算思维才能获得不断的提升。

5 结束语

当“程序驱动”的数字化工具渗透到人们生活、学习和工作的方方面面,甚至成为人们生活的一部分时,人们不仅需要具

备操作这些技术工具的技能,同样需要深层次理解这些技术工具,知道它们的工作原理和工程思想,并学会运用这些思想,优化我们的工作与生活,即发展计算思维。让学生学习编程,引导学生深度思考算法及其工作流程,亲历完整的编程过程,学会像计算机科学家一样思考,对于他们的意义可谓一种观察世界的全新视角。

参考文献:

[1] 李锋,熊璋.面向核心素养的信息技术课程:数据与计算”模块[J].中国电化教育,2017,1(360).

[2] 邵红祥.基于计算思维的高中信息技术选修课程设计与开发[J].中国信息技术教育,2016(17).

[3] 任樟辉.数学思维论[M].南宁:广西教育出版社,1996.

猜你喜欢
计算思维程序算法
基于MapReduce的改进Eclat算法
Travellng thg World Full—time for Rree
试论我国未决羁押程序的立法完善
进位加法的两种算法
“程序猿”的生活什么样
英国与欧盟正式启动“离婚”程序程序
程序设计课程中计算思维和应用能力培养问题研究
一种改进的整周模糊度去相关算法
创卫暗访程序有待改进