“数据结构”课程是我国计算机教学中较早形成和完善的一门专业基础课程, 也是计算机课程体系中的核心课程之一[1]。在我国, “数据结构”课程不仅在计算机科学与技术类各专业开设, 也在信息管理类、通信类的许多本科专业和其他相关专业开设。“数据结构”课程主要介绍用计算机解决非数值计算类问题所用的各类数据的逻辑结构、存储方式以及在各种结构上执行的主要操作[2], 其既是程序设计的基础, 又是设计和实现系统软件及大型应用软件的重要基础。
通过“数据结构”课程的学习, 使学生能够熟练地掌握数据结构的内在逻辑关系及其在计算机中的存储结构, 以及有关基本操作的算法实现, 并初步掌握算法的时间分析和空间分析的技术[2], 具备在软件开发的过程中能够为求解的具体问题选择合理的数据结构, 能够应用高级语言编写和实现结构清晰、正确易读的有效算法的能力。
然而, “数据结构”课程概念抽象、内容繁杂, 且学生的学习基础和目标不同, 因此, 要学好并掌握“数据结构”课程的全部内容有很大难度。尤其是用计算机语言对数据的存储结构和算法进行描述时, 对学生逻辑思维能力和抽象思维能力要求较高, 无论是学生的学习还是教师的教学都有相当的难度。
本文针对“数据结构”课程的教学中存在的问题进行了改进和创新, 目的在于充分发挥学生的主观能动性, 让学生有兴趣地学, 并最终提高教学效果。
一、“数据结构”课程教学中存在的问题作者所授的“数据结构”课程是信息管理类专业的公共基础必修课。根据开课前的调查, 绝大多数学生想通过对“数据结构”课程的学习提高自己的程序设计能力, 为日后设计和实现系统软件的开发奠定基础, 但在实际教学中, 学生往往会遇到诸多困难, 如:“概念抽象”“算法太难”, 甚至经常有学生反映“上课讲的算法内容都能听懂, 但是一旦自己设计算法就不知从何下手”, 等等[3]。在授课过程中, 老师们也发现一些问题, 如“学生分不清算法与程序之间的区别与联系”, “学生不会思考, 不会采用合理的数据结构解决问题”, “学生逻辑思维能力较差, 读不懂别人写的算法”。通过深入分析“数据结构”课程教学中存在的种种问题, 发现影响课程学习效果的原因大致有以下几个方面。
(一) 数学基础薄弱, 学生逻辑思维能力差必要的数学知识是学好“数据结构”课程的前提[4]。“离散数学”这门课主要研究离散结构和离散数量关系, 是“数据结构”的先行课之一。“离散数学”是计算机科学中基础理论的核心课程, 内容上充分体现了计算机科学离散性的特点, 该课程所提供的训练对学生抽象思维能力和逻辑思维能力的培养起着十分重要的作用。
目前, 部分开设“数据结构”课程的非计算机类专业, 并不开设“离散数学”, 如:作者所在上海理工大学信息管理类专业, 学生在学习“数据结构”课程之前, 并没学习“离散数学”这门课。由于学生没有掌握“数据结构”必备的数学基础知识, 对“数据结构”这门课的学习具有较大困难。
(二) 实际教学中存在衔接问题计算机程序设计类课程是“数据结构”的先行课程, 学生对“程序设计基础”课程学习的好坏直接影响“数据结构”课程学习的效果[4-5]。然而, 据作者所知:在实际教学中, 由于“程序设计基础”和“数据结构”两门课程由不同的教学单位和任课教师担任, “程序设计基础”和“数据结构”被设定为两门完全独立的课程, 导致两门课程在教学内容上出现知识衔接的断层。尤其若先行课“程序设计基础”的教学内容完全脱离了“数据结构”课程, 使“数据结构”课程中最频繁使用的知识(如:指针、结构体和函数)在“程序设计基础”课程中涉及甚少, 学生不能为“数据结构”课程的学习打下扎实的程序设计基础[5]。
以作者所在的上海理工大学为例, 作者给该校管理学院信息管理类专业的大二本科生讲授“数据结构”课程, 所采用的教材是严蔚敏和吴伟民老师主编, 由清华大学出版社出版的“数据结构”(C语言版), 而该校“程序设计基础”类课程由光电信息与计算机工程学院开设。信息管理类专业的学生在大学一年级第二学期可自由选择“VB程序设计语言”和“C程序设计语言”其中一门课程进行学习。由于大部分学生学习目的不明确, 不了解“C程序设计语言”对后续课程学习的重要性, 往往选择相对简单、易学的“VB程序设计语言”。这导致“程序设计基础”课程所教授的编程语言与“数据结构”教材和实验所使用的实现语言不一致, 以至于“程序设计基础”课程与“数据结构”的教学脱节。即使有一小部分学生选择了“C程序设计语言”, 但由于两门课程由不同学院的不同教师讲授, 两门课程在课程设置和教学内容上不能很好衔接, 如:C程序设计语言的教学时间大部分花费在基本概念及简单程序的编写上, 学生没有充裕的时间对数组、结构体和指针等复杂数据类型学习和上机实践, 并未对这些内容加以深刻理解; 然而这些内容在后续“数据结构”课程中频繁使用, 是数据结构的重要基础。这些情况均导致在“数据结构”课程的教学中, 尽管授课教师费尽唇舌, 学生仍然似懂非懂, 不能很好地掌握知识重点和难点, 对数据结构的理解和掌握仅仅停留在概念层、理论层和抽象层, 难以实现对数据结构算法从理论到伪代码、再由伪代码到真正代码的转换[5], 导致学生丧失了对该课程的学习兴趣和信心。
(三) 上机实践课时少, 学生动手能力差“数据结构”是一门理论与实践并重的课程, 上机实践是“数据结构”课程教学过程中必不可少的环节。“数据结构”课程的教学要求之一是训练学生进行复杂程序设计的技能和培养学生良好程序设计的习惯。因此, 上机实践对“数据结构”课程的教学质量具有举足轻重的影响。
目前, 大多数高校“数据结构”课程的上机实践学时严重短缺。以作者所在的上海理工大学信息管理专业的“数据结构”课程为例, 讲授学时和上机实践学时分别为48和16, 学生实践机会偏少。这导致“数据结构”课程的教学是以利用伪代码描述数据结构和算法为主, 以编程实践为辅, 重理论、轻实践, 实践教学不能支撑起理论教学[6], 最终致使学生综合运用数据结构的知识解决实际问题的能力明显不足, 编程能力没有得到提高, 甚至有的学生在学完“数据结构”这门课之后, 仍然不能自行查找语法错误, 看不懂错误提示, 不会纠错, 更谈不上独立将大型复杂算法编写为程序。
二、提高“数据结构”课程教学效果的对策导致上海理工大学信息管理类专业“数据结构”课程教学中存在上述问题的主要原因是学校多年实施平台课程设置中的漏洞与不合理之处。作者建议学校能够逐步对平台课程设置中存在的种种问题加以改进。
此外, 作为“数据结构”课程的授课教师, 在无法改变整个专业的课程设置的前提下, 首先加强先行课程“离散数学”和“C程序设计语言”的教学; 其次, 不断思索如何提高“数据结构”课程的教学效果, 并在教学方法和手段以及实践教学方面作了一定的改进和创新。
(一) 加强先行课程“C程序设计语言”的复习如前所述, 牢固的C语言程序设计基础是学习“数据结构”课程的前提条件。在开展数据结构教学时, 首先对学生学习C语言程序设计的情况进行初步了解, 然后根据学生的掌握程度, 重点对C语言中的数组、结构体、函数和指针复习3~4个学时, 其中包括1~2个学时的上机实践。在教学过程中, 结合学生的学习情况和具体算法, 抓住两门课程的衔接点, 再适当补充必要的C语言知识。
(二) 增强课堂教学的趣味性“数据结构”课程的内容比较抽象, 算法理解比较困难。采用灵活多样的课堂教学方式, 激发学生的学习兴趣, 使学生把学习数据结构的课程变成一件积极、快乐的事, 自然会取得良好的教学效果[7-9]。
在学期初期, 教师应通过实际应用激发学生学习“数据结构”课程的兴趣。例如, 针对假期一家人自驾游, 如何选择线路才能最节省旅途的过路费用和油耗费用; 针对图书馆的图书信息管理系统, 如何实现图书信息的快速查找; 为了节省计算机的存储空间, 如何实现对稀疏矩阵的压缩存储等等, 这些问题的实用性和趣味性比较强, 能激发学生探索解决这类问题的愿望和学习“数据结构”课程的兴趣。“知之者不如好之者, 好之者不如乐之者”, 兴趣激发起来了, 就形成了一个良好的开端。
在每节课的新知识点引入时, 也尽可能使用生活中的例子, 或一个小故事、小游戏、一个影片情节等方式, 将枯燥难懂的知识点融入到鲜活的情景中, 激发学生的学习兴趣。例如:讲解顺序表时, 引入小学报名家长彻夜排队的实例, 形象地表示了数据元素间的物理结构维持逻辑结构; 讲解链表时, 引入谍战片或警匪片中上下级之间的单线联系方式, 形象地反映了链表的特性; 讲解队列时, 引入飞机场或火车站的出租车排队载客的实例, 出租车按照到达的先后顺序排成一条队, 后到的出租车排在队尾, 最后每辆出租车从队头载客出队, 这就是先进先出的队列结构; 讲解栈时, 可以用食堂盛菜的盘子作为例子引入, 盛菜的盘子是从下往上叠放在一起的, 而用的时候是从上往下拿, 栈就好像是一个装盘子的容器, 具有先进后出的特征; 讲解树的时候可以引入一个家族的家谱; 讲解图的时候可以引入高速公路网、铁路网。这样通过对日常生活中实例的讲解, 使一个抽象的、理论性很强的问题转变为一个直观的、简单的实际问题, 不仅构建了和谐的课堂氛围, 也激发了学生的学习兴趣。
在上机实验教学中, 最初安排简单的、容易利用所学知识实现的例子, 如学完线性表后, 安排学生完成将两个有序表合并为一个有序表; 学完栈后, 安排学生完成一个括号匹配问题。这些例子不仅具有一定的趣味性, 而且简单、易于实现。学生上机实验见到成果后, 内心的成就感得到满足, 自信心得到加强, 就会更加有兴趣学习和钻研这门课程。
(三) 图文并茂讲解算法“数据结构”课程中数据的结构和算法的描述多为抽象的理论。在学生抽象思维能力和逻辑思维能力欠缺的情况下, 如果直接进行理论讲解, 学生会觉得枯燥乏味, 失去学习的兴趣。因此, 在教学中, 需要引入直观、形象的图像或动画, 让抽象的算法以图形动态演变的方式呈现给学生, 再结合上算法伪代码的讲解, 不仅可以调动学生的学习积极性, 而且可以提高学生逻辑思维和抽象思维的能力。例如:在链表中, 用到了大量的指针操作, 很多学生反映对链表中的结点进行插入、删除和查找等操作时, 指针的变化使他们经常晕头转向, 模糊不清, 尤其在学习双向循环链表时, 情况更为严重。如果采用图文并茂的讲解方法, 立刻就会产生不一样的效果。
图 1给出了在双向链表中指针P所指向的结点前插入一个新结点时指针的变化状况。在课堂讲解中, 首先结合图 1把双向链表的插入原理讲透彻, 即把新插入结点与链表中原有结点之间的关系讲明白, 并将每一句代码的含义和作用解释清楚, 从而方便了学生的理解。
数据结构实验可以分为验证型实验和设计型实验[6]。验证型实验的目的是使学生掌握基础的常用的数据结构及基本操作, 强化学生对基本数据结构及其相关算法的理解, 同时在使用的过程中进一步巩固和强化C程序设计语言的应用。学生应掌握的“数据结构”课程各章节的典型算法如表 1所示, 对于这些算法要求在16个学时的上机实验课中, 每个学生在教师指导下独立将算法的伪代码转化为C语言描述的真正代码, 完成调试、编译操作。
设计型实验的目的是训练学生解决实际问题的能力, 学生根据实际问题, 选择合理的数据结构并设计求解该问题的快速有效算法。授课教师可以根据自身的授课经验自拟问题或选择一些经典的趣味型问题作为设计型实验题目, 如:一元多项式的加法运算; 用双向循环链表解决约瑟夫问题; 迷宫问题; 利用哈夫曼树对文本文件进行压缩和解压缩, 等等。与验证型实验所不同的是, 设计型实验是培养学生灵活运用所学知识解决实际问题的能力和团队合作的能力。因此, 对于设计型实验, 并不要求学生在16学时的上机实验课内完成, 而是作为作业布置给学生, 要求学生在学期内课外完成。如:作者对授课班级的学生根据兴趣分成任务小组, 3~5人为一个小组, 要求每个小组的同学选择完成3~4个设计型题目, 学生在认真分析实验题目的基础上, 根据实际情况合理分工, 选择合适的数据结构组织处理实验题目中的数据, 设计出有效的求解算法, 并将其转换为真正的程序代码, 在计算机上编译、调试完成。通过设计型题目的完成, 不仅加强了学生之间相互交流、相互协作的能力, 而且达到了小组同学共同学习, 共同提高的目的。
通过验证型题目和设计型题目的训练, 不仅使学生对所学的数据结构及其典型算法在课中得以消化, 而且激发了学生挖掘自己的潜能, 使学生的创新能力得到一定拓展, 对所学知识在课后得到了进一步提高。
(五) 开展启发式教学当代著名科学方法论学者波尔普曾说“正是问题激发我们去学习, 去发展知识, 去实践, 去观察”。作为一个好的教师, 不仅要在课堂上给学生讲清楚每一个知识点, 更应着力于引导他们去如何发现问题、提出问题、分析问题和解决问题。“问题”是创新的起点, 是引发学生学习兴趣、调动学生学习主动性的理想载体。基于这样的授课思想, 并通过几年的探索和总结, 从2014年起, 在作者所授的数据结构课程中采用了带有对问题探讨因素的启发式教学法, 收到了良好的教学效果。
“数据结构”课程的教学中, 可以设计许多启发式问题。例如:在介绍了单链表的插入算法之后, 可以引导学生分析在第一个结点之前插入新的结点与在其他结点之前插入结点的操作是否相同?通过实际对单链表中第一个节点之前进行插入操作与在其他结点之前进行插入操作的比较分析, 学生不难得出这样的结论:在第一个结点之前进行插入的操作实际是在头指针之后进行插入, 插入时不仅需要修改新结点指针域的值, 而且需要改变头指针的值; 在其他结点之前进行插入的操作实际是在某一个结点之后进行的插入, 插入时需要修改直接前驱结点和新结点的指针域。那么, 为了使在第一个结点之前插入结点的操作与在其他结点之前进行插入的操作一致, 即都是在某一个结点之后进行的操作, 需要修改的都是结点的指针域, 而不需要修改头指针的值, 该如何处理呢?学生马上会想到:在第一个结点之前添加上一个结点, 让头指针指向新添加的结点就实现了这一功能。由于这个新添加的结点是为了插入和删除等操作上的方便, 该结点的数据域可以不存储任何信息。通过这样不断创设问题情景的方式, 引出了带头结点的单链表, 而且说明了头结点与链表中第一个结点之间的区别。
对问题探讨因素的启发式教学法, 将教材上的平面知识、技能点转化为问题的形式展现给学生。学生有了疑问, 才会思考, 思考了才会有收获。从教学内容中挖掘问题, 在课堂上给学生创设问题情景, 激发学生思考, 是“数据结构”课程采用启发式教学的关键。基于这样的考虑, 作者在备课的过程中, 反复探究“数据结构”课程中各个知识点的奥妙, 精心设计课堂情景, 准备好与学生探讨的启发式问题。课堂上, 由于启发式问题的引入, 不仅活跃了课堂气氛, 使学生的思维能力得到训练, 而且使知识重点更加容易讲透, 知识难点更易突破, 较好地完成了教学任务。
三、结束语经过两年“数据结构”课程的教学改革, 上述努力起到了激发学生的学习兴趣, 明确学生学习的目的, 不仅学生的到课率得到了明显提高, 由原先的80%提高到了现在的93%, 理论教学和实验教学都取得了预期的效果, 而且学生的学习成绩显著提高。例如:2014—2015学年第一学期学生卷面成绩的优秀率为1.10%, 良好率为14.29%, 中等率为16.64%, 及格率为17.64%, 不及格率为50.33%;2015—2016学年第一学期学生卷面成绩的优秀率为14.46%, 良好率为21.14%, 中等率为18.97%, 及格率为16.95%, 不及格率为28.48%。这些变化证明了“数据结构”课程的教学改革方法有助于提高学生的学习兴趣, 取得良好的教学效果。
在后续的教学工作中将引入先进的教育理念和教学手段(如:慕课教学模式), 提高学生的创新能力, 培养学生研究性学习的能力。
[1] | 王裕明, 李旭芳, 李跃文, 等. 数据结构与程序设计[M]. 北京: 清华大学出版社, 2010. |
[2] | 严蔚敏, 吴伟民. 数据结构(C语言版)[M]. 北京: 清华大学出版社, 2010. |
[3] | 彭立宏, 肖晓强, 周丽涛. "计算机程序设计"课程教学研究与实践[J]. 计算机工程与科学, 2014, 36(S1):39–42. |
[4] | 周海岩, 陈宏明, 殷路. 《数据结构》课程教学的思考[J]. 教育理论与实践, 2010, 30(6):62–63. |
[5] | 郭艳燕, 童向荣, 孙雪姣, 等. 程序设计基础与数据结构两门课程的教学衔接[J]. 计算机教育, 2014(10):47–50. DOI:10.3969/j.issn.1672-5913.2014.10.013 |
[6] | 张小刚. 数据结构课程实践教学改进探讨[J]. 湖南科技学院学报, 2016, 37(4):134–135, 144. |
[7] | 霍玲玲, 王智, 孙江. 数据结构教学方法的研究[J]. 计算机教育, 2015(2):73–76. |
[8] | 鹿旸. 数据结构与算法课程教学方法的思考[J]. 计算机教育, 2010(5):88–90. |
[9] | 刘晓静, 王晓英, 薛媛媛, 等. 让趣味教学进驻数据结构与算法课堂[J]. 青海大学学报(自然科学版), 2011, 29(5):95–97. |
[10] | 周晓谊, 王隆娟, 任佳. Seminar教学模式在数据结构课程中的实践[J]. 海南大学学报(自然科学版), 2016, 34(1):82–89. |
[11] | 刘华敏. "翻转课堂"教学模式的探讨——以《数据结构》课程教学为例[J]. 广东技术师范学院学报, 2016, 37(5):70–72. |