数据结构教学中的案例巧用
2010-12-31陈晓霞
计算机教育 2010年24期
摘要:数据结构是计算机专业的重要课程之一,但由于其理论性过强,缺乏趣味性,学生理解困难,教学效果不好。针对这些现象,文章提出在数据结构课程的教学方式、教学手段、考试方式上引入利用案例驱动的方法,以培养具备扎实的理论基础、较强的实践操作能力和综合表达能力的高素质学生。
关键词:数据结构;案例教学;教学改革
1数据结构课程教学现状及问题
数据结构作为计算机和信息等专业的核心课程,在教学体系中起着举足轻重的作用[1-4]。现阶段国内数据结构课程受主流数据结构教材影响,多以传授知识、利用伪代码描述数据结构及其算法为主,辅以一定的编程实践作为主要的教学模式。在这样的教学模式下,对于当前大众化教育背景下应用型高等工科院校的学生来说,学习掌握数据结构课程,根据实际问题动手设计数据结构算法并能付诸实践成为一个难题,造成这种现象的主要原因有以下几点:
1) 在国内主流的数据结构教材普遍采用伪代码的形式来描述算法,没有源程序,学生在学习过程中,不能“亲眼看见”算法执行流程,从而造成对算法理解的困难。
2) 算法描述过于抽象,不够直观,教师在教学过程中利用“黑板+粉笔”或者PPT都很难形象直观地演示算法,不利于学生理解算法。
3) 传统的教学模式强调理论教学,实践环节不够,造成学生动手能力差,有的学生会考试能做题,却看不懂实现算法的程序,更别说自己动手编程实现算法。“数据结构”在计算机软件开发领域的真正价值无法得到体现。
就以上问题笔者对在数据结构课程教学过程中引入案例驱动的立体化教学改革研究作了初步研究。
2选择设计适当的案例以驱动数据结构课程教学改革
2.1案例的设计与选择
案例选编是数据结构教学改革中的重要环节,选择或设计适合学生、难易得当、繁简相宜的案例,应包含学生已经学过的和即将学到的知识,并以此案例作为驱动进行课程的教学和学习,可以提高学生的学习兴趣和学习效率,达到教学目的。
笔者经过多年教学实践,在教学过程中摸索了一系列案例作为各数据结构教学模块的驱动,主要包括:以“一元多项式的四则运算”作为线性表结构特别是链表结构教学的驱动案例、以“迷宫路径搜索”作为栈结构教学模块的驱动案例、以“井字棋游戏”和“霍夫曼树及霍夫曼编码”作为树结构教学模块的驱动案例、以“校园导游咨询”作为图结构模块的驱动案例,等等,如图1~图3所示。下面以较为简单的链表结构为例阐述“一元多项式四则运算”案例如何驱动教学。
2.2一元多项式四则案例驱动链表结构的教学
一元多项式四则运算是清华大学严蔚敏教授编写的经典教材中有关链表的应用的一个章节,但是在该章节中数据结构及算法由伪代码构成,学生很难真正理解如何利用链表来实现一元多项式的四则运算。
笔者在教学过程中已经积累了可视化的多项式四则运算程序[5],可以利用该应用程序进行课堂、课后的教学与学习。
2.2.1案例驱动链表中结点的教学
“结点”作为链表乃至树和图等各类数据结构来说是一个非常重要的概念,而对于初学数据结构的学生来说,大多数学生只掌握了基本数据类型的运算,“结点”概念过于抽象,往往使学生摸不着头脑,从而影响整个数据结构课程的教学。
通过教师讲解一元多项式中的单项式如何在计算机中表示,即由系数(浮点型)、指数(整型)两种基本数据类型构成一个复杂数据类型;一个单项式就是一个多项式的一个结点,利用这种方式使“链表中结点”这个比较抽象的概念具体化、形象化,进一步引导学生——要描述和实现这样一个非简单类型的“结点”,需要用C++中的类或者结构体来实现。
2.2.2案例驱动链表基本操作的教学
多个单项式“串成一串”便成为多项式,可以用“数组”来串联这些单项式,也可以用“链条”来串联这些单项式,教师可以一起与学生讨论顺序表和链表的各自的特点。这个案例主要体现链表的应用,教师引导学生分组讨论如何实现串联,即链表的初始化操作、结点插入链表以及从链表中删除某个结点等一系列链表操作。
多项式的四则运算特别是加、减法本质上是链表的合并过程,而链表的合并过程也就是结点的插入操作。因此学生们在理解链表基本操作的基础上可以进一步学习其具体的应用。
2.2.3案例驱动下链表实践教学的改革
只有理论学习而没有实践,这样的学习成效是不完整的,不同层次的学生可以利用案例进行不同程度的学习。对于理论理解有困难的学生,他们可以通过上述图形化界面的应用程序“亲眼看到”结点在链表中的变化,该程序是可操作的、互动式的,通过输入数据,可以帮助学生理解一个升序的一元多项式中插入一个任意单项式仍然要保持其升序状态,需要在在链表适当的位置插入结点或者修改结点或者删除结点,等等;对于算法可以理解但是无法读懂源程序的学生,可以通过学习、调试源代码,达到从理论理解到实践应用的过渡;对于可以理解源代码的学生,可以让其尝试编写、添加一些具体的函数,增强学生的动手能力。上述一元多项式四则运算应用程序即为笔者的学生开发完成。
对于这样一个案例驱动的教学方式的改革实践,仅仅有案例是不够的,需要对传统的教学模式和考试模式、课程组织方式等全方位立体化的改革。
3教学模式与考试模式的改革
3.1在教学方式上的改革
传统的教学方式是以教师在课堂上讲解知识点,学生上机实践以及课后做习题作为主要的教学模式,
这样就容易造成前文中提到的学生动手实践能力低,会考试却看不懂程序,不会动手编程这样的局面,达不到应用型高等工科院校对学生的培养目标。只有将教师讲解、课堂讨论、汇报或答辩、教师或学生总结等多种教学方式相结合,才可以发挥案例驱动教学以达到教学目的要求。
3.2在教学手段上要充分利用演示系统、精品课程网站等资源
一些演示系统和国家级精品课程网站的资源可以帮助教学进行课堂教学以及学生课后学习,例如,上海交通大学数据结构为国家级精品课程,在该课程网站(http://jpkc.onlinesjtu.com/CourseShare/DataStructure/ Index.aspx )包含了相当丰富的教学资源,如约瑟夫环问题、汉诺塔问题、迷宫问题、火车车厢重排、四皇后问题等算法的动态演示过程、解决思路、算法描述、参考代码等;另外,该网站还提供了一些数据结构中常用算法的动态交互操作实验,如链表的插入和删除、二叉树遍历、霍夫曼树和霍夫曼编码、联通网的最小生成树等。教师和学生可以充分利用这些非传统的、动态交互式的应用程序实现使数据结构的学习不再单一化、抽象化。
3.3在考试模式上改变“一考定输赢”的方式
我们借鉴国外Assignment形式,采用以小组为单位完成期末大作业、撰写课程报告等多种方式相结合进行考核。期末作业的内容应与教学过程中的案例相结合,让学生们模仿完成类似的、难易得当的应用程序的开发。为避免学生们从网上下载源代码等非诚信的方式来完成期末作业,还要求他们撰写课程报告并进行汇报答辩。
由于学生个体的差异性,在组成小组时应保证小组成员的多样化,有的小组成员擅长整体分析,有的小组成员擅长程序辨析,有的小组成员擅长总结报告,等等,学生们通过分工合作来完成期末作业可以增强学生们的团队合作精神,也可以发挥各自的优点和特长。
利用这种开放式的考试方式可以改变学生只在期末前夕用功学习就可以完成学业的现象,改变学生重理论轻实践的思想,增强学生学习主动性,提高学生动手能力、表达能力。
4与其他专业课程结合,真正发挥其核心作用
在计算机专业或信息类学科专业中基本上都开设了C语言(或者C++)、面向对象与可视化程序设计等课程,数据结构课程应与这些课程相结合。
4.1在面向对象程序设计语言课程中体现数据结构思想
而对于数据结构而言,从上世纪90年代起国外已经逐步采用用C++或Java描述的数据结构教材,用C不能很好地描述数据结构中的抽象数据类型,只有使用面向对象程序设计语言中的类才能很自然地实现抽象数据类型的思想[1]。另外,目前软件开发的主流方式仍然是采用面向对象的程序设计,因此笔者建议在计算机等专业中应开设C++课程,并以此作为计算机专业程序开发的主线语言,该课程应先于数据结构课程开设。
在学习面向对象程序设计语言时,“类”和“对象”等概念非常抽象和难以理解,在教学过程中可以以数据结构中的一些简单化的案例作为这些抽象概念的具体化。例如在初学“类”时可以以前文中所提到的多项式为例学习如何构造一个“多项式类”,有了一般的“多项式类”,那么具体的某个特定的参与运算的多项式就是这个类的对象。以此达到抽象概念形象化的目的,使得这样的重要概念变得容易理解。
4.2在数据结构课程中利用C++等语言实现算法,提高学生动手能力
如果在数据结构课程中使用伪代码作为算法描述的代码,学生理解算法困难,难以动手实现。因此在学习了C++等语言的基础上,在数据结构课程中所有数据结构及算法应以C++等语言作为描述语言,并要求学生在此基础上完成各种作业,提高动手能力。
4.3在可视化程序设计、信息论与编码等其他专业课中体现数据结构的应用性
在面向对象与可视化程序设计课程学习的过程中,教师应结合数据结构中学习过程中的各案例,让学生在可视化编程环境中利用面向对象技术开发这些案例的图形化界面应用程序。如前文中提到的各种案例的图形化用户界面的应用程序的开发,信息论中霍夫曼编码的实现,等等;从而提高学生对数据结构的理解以及开发能力,并使课程设计变得言之有物。
5结语
案例教学能使理论与实践更好地结合起来,通过对案例课题的分析、讨论和实践,可以更好地掌握理论及其实际应用[3],以案例驱动整个数据课程的教学模式、考试模式等立体化的教学改革,培养高素养的应用型人才。
参考文献:
[1]