张乐,杨立
(山西运城学院数学与信息技术学院,运城044000)
C语言中提供了解决批量数据相同操作问题的方法—数组。数组是一种构造的数据类型,是相同类型数据的集合[1]。数组是C语言程序设计教学中一个重要内容,C语言中按确定数组元素下标的个数可以分为一维数组、二维数组和多维数组[1]。使用一维数组可以解决实际应用中的很多问题,如一维数组元素输入输出、查找最大最小值、数组元素排序、在原数组中插入、删除、查找元素等。其中在一维数组中插入元素是C语言程序设计教学中的重难点,而传统教学中教师为主体灌输式的教学方式比较枯燥无法调动学生学习的积极性和主动性,对数据插入算法的理解达不到教学目标,无法熟练使用插入算法解决实际问题。因此,采用问题引导式教学方法对插入算法过程进行具体分析,以学生为主体教师为主导模式引导学生分析问题总结问题,帮助学生更好理解算法思想及过程,从而提高学生解决实际问题的能力。
问题引导法是以问题为中心,以学生为主体的一种教学方法,将教学目标或教学内容以问题的形式呈现出来[2],通过提出问题-分析问题—解决问题-总结归纳-拓展应用的方式,在教学过程中通过问题引导学生主动发现问题、分析问题,在教师的指导下寻找解决问题的方法总结归纳,从而解决实际问题。问题引导法能够激发学生的求知欲,引导学生主动学习,从而提升学生自主学习的能力和解决实际问题的能力。采用问题引导法常常能取得良好的教学效果。
在教学过程中使用问题引导法能够激发学生的学习兴趣,使得学生对插入算法思想和过程有整体、全面、记忆深刻的理解,并能将插入算法过程步骤分解,根据步骤顺利编写算法代码,更好地理解掌握插入算法。
程序设计中,为了方便处理,把具有相同类型的若干变量按有序的形式组织起来,形成数组(Array)[3]。按数组元素下标的个数,数组可分为一维数组、二维数组和多维数组。由一个下标标识数组元素的数组称为一维数组,一维数组可以直观地被认为是排列成一行或一列的数据。数组有以下两个特点:
数组元素是同质的,同一个数组中的元素必须是同类型数据。
数组元素是有序的,数组元素之间按顺序排列,从而确定它们之间的相对位置。
在一组数据中插入一给定的数据,有两种方式:在有序列表中插入和指定位置插入。
在有序列表中插入数据,要保证插入数据前后都是有序的。首先在有序列表中查找插入的位置,再把从最后一个数据到插入位置的所有数据依次按顺序后移,然后再把指定的数据复制到插入位置。
传统的教学过程中,以教师为主体填鸭式教学,将算法思想和程序代码灌输给学生,在没有理解思想的基础上编写代码十分困难,无法调动学生的积极性,也无法真正理解数据插入算法的意义并将其应用到实际问题中。因此,采用问题引导的方法,以学生为主体教师辅助教学,通过提出问题-引导学生分析问题并总结归纳数据插入算法基本过程,从而顺利编写算法代码,能够充分调动学生学习兴趣,拓展自主思维能力,熟练掌握数据插入算法思想及编程方法并灵活运用从而解决实际问题。
教师通过多媒体课件播放一组学生成绩数据,引导学生观察数据特点:有序(升序)列表,并提出问题:班级里新来一名转班的学生,需要将转班学生的成绩排列到当前班级成绩列表中,如何实现?引入新知识点:在有序列表中插入数据。
【提问】如何在升序列表中插入一个数据并保持其继续有序。
教师播放提前制作好的PPT课件,通过有趣生动的动画直观演绎数据插入过程,吸引了学生注意力。在动画播放结束之后,结合课件教师引导学生观察数据插入算法的过程:查找、后移、复制,即查找位置,将最后一个元素到插入位置的元素依次后移,复制数据到插入位置。
【提问】具体如何查找、移动、复制?
通过提问,引入数据插入算法思想,并通过重新播放PPT课件动态分析数据插入过程。
假设班级有7个学生的成绩存储在数组sc[7]中,按升序排序后为:50、65、72、80、87、90、98,对应的下标分别是 0、1、2、3、4、5、6,现要求将转班生成绩 82(用变量k表示)插入到当前班级成绩表中。
(1)分解数据插入过程
①查找位置
在播放PPT过程中,教师引导学生并提出问题:在升序的序列中查找第一个最大的值还是最小的值才能确定位置?
表1
教师引导分析:数组中下标0-6的元素分别跟k比较比较的结果有两种可能性:sc[0]-sc[3]元素比k小,说明k应该插入在该数据之后,继续和之后的数据比较;sc[4]元素比k大,当找到第一个比k的元素值,说明k插入在此位置,位置确定,即sc[4]就是插入的位置,比较结束。
②数据移动
【提问】当找到第一个比k大的数组元素后,位置确定,可以直接插入数据吗?
教师引导分析:插入数据的过程就是数据赋值替换的过程,如果直接插入数据,会导致原列表中sc[4]元素被替换,因此必须把sc[4]元素的位置空出来,即将sc[4]-sc[6]的元素后移一位。
【提问】将sc[4]到sc[6]元素后移,应该从sc[4]开始移动还是从sc[6]开始移动?
教师引导:移动数据,即前者赋值给后者,如果从sc[4]开始依次后移,sc[5]-sc[6]的数据都将会被前者取代,因此应该从sc[6]-sc[4]逆向往后移动。移动过程如图1所示。
图1 数据后移的过程
【提问】移动过程中,sc[6]往后移动一位,而之前定义数组长度为7,最大下标为6,移动后最大下标为7,因此,定义数组长度至少为8,即float sc[8]数据后移后如图2所示。
图2 移动后的数据
③复制数据
教师引导:sc[4]-sc[6]的数据移动到sc[5]-sc[7]之后,sc[4]原来的数据87可被替代。将现有数据82赋值给sc[4]即可。如图3所示。
图3
(2)总结归纳数据插入过程
【提问】根据分析过程,总结数据插入一共几个过程?有什么特点?
教师引导:查找位置、数据移动、复制数据三个过程。
①查找位置:将要插入的数据k=82依次与数组中的元素进行比较,每次比较若比k小则继续比较;若比k大则停止比较。
教师引导:比较的过程可用循环for语句实现。
②数据移动:若找到比k大的第一个值则break跳出循环,i便是查找到要插入数据的位置。将sc[i]到sc[6]所有元素逆序后移。
教师引导:移动的过程即将前一个元素赋值给后一个元素的过程,赋值多次用for语句实现。
③复制数据:移动结束后,查找到的位置i中数据
通过定义-赋值-排序-输出四个阶段,我们可以将完整的过程代码补充如下:
教师引导注意事项:定义数组长度要比原数组长度至少大1,float sc[8];输出7个数据,输出8个数据。
【拓展问题】若要在降序数据列表中插入一个数据,如何实现?
教师引导:查找位置(比较查找第一个比k小的值确定位置)、数据逆序后移、复制数据。
移动和复制数据同升序过程。
【拓展问题】如果原数组中包含N个数据并为升序,如何插入数据并保持有序?
教师引导:原来数组中有N个数据,插入一个数据,因此定义数组时至少数组长度为N+1。
现代教育注重培养学生的自主学习能力和创造性思维,相对于知识点的讲授,更重要的是让学生掌握计算机思维方式,从而运用计算知识解决其他问题。为了巩固知识点,教师可在课后布置小问题培养发散思维。
【课后问题】数据插入算法分为:在有序列表中插入数据和在指定位置插入数据,根据有序列表中插入数据分析过程,自主编写程序实现在指定位置插入数据。
教师提示:给定位置,无需查找。将指定位置之后的所有元素依次后移,并复制数据至指定位置。
本文以数据插入算法为例,利用PPT、视频等多媒体手段教学,在教师的指导下通过问题引导方法(提出问题-分析问题-总结归纳-解决问题),形象生动具体分析了数据插入算法全过程,并引导学生自主总结要点从而编写出相应代码,并运用算法思想解决其他问题。一方面通过步骤的总结顺利过渡到代码的书写,突破代码书写的难点。另一方面引导学生观察算法的过程,通过提问的方式引导学生自己发现问题,并提出解决问题的办法,进而培养学生的发散创新思维和自主学习的能力[4]。因此,在C语言程序教学中使用问题引导法可以提高学习热情和学习效率,对于程序设计及相近学科具有一定的借鉴意义。