“数据结构”教学模式的研究与应用
2009-04-13吕加国
吕加国
摘要:针对“数据结构”教学中存在的诸多问题,本文在对主流教学模式进行分析的基础上,提出一种综合性教学模式,并依据该教学模式的思想和原则,提出了相应的实施措施。教学实践表明,该模式对于培养学生的逻辑思维和数据抽象能力,尤其是算法的分析和设计能力有着较好的教学效果。
关键词:数据结构;教学模式;算法分析与设计
中图分类号:G642文献标识码:B文章编号:1672-5913(2009)04-0082-04
引言
“数据结构”是计算机专业的一门专业基础课。该课程的重点是讲解数据的各种逻辑结构、物理结构及其之上各种操作的算法实现。该课程不仅要培养学生在软件设计方面严密的逻辑思维和数据抽象能力,更要培养学生在软件设计领域科学的思维方式。因此成为计算机专业研究生入学考试和软件设计师认证等考试的首选课程。
“数据结构”涉及的知识点众多,而且其逻辑性和抽象性都很强,再加上课时有限,学生普遍感到难学。很多同学反映,理解基本概念不难,基本操作的实现也都听得懂,可是一到解决具体问题时就觉到困难重重。对于有一定难度的算法设计题,更是感到无从下手。因此,如何学好、怎样教好“数据结构”成为广大师生普遍关注的问题。
造成这一现象的原因是多方面的,现在总结如下:
(1)学生难以对所学内容融会贯通,对课程的知识缺少一个整体的把握。
(2)学生由于C语言基础不扎实,对结构、指针、参数传递等掌握不好,在做作业或实验时如果题目要求与教材内容相差较大,无法入手,导致信心受到打击、畏难情绪增加。此后,为应付作业,出现抄袭别人作业,或直接上网搜索现成程序的情况。
(3)虽然教师自己对教材内容很熟悉,能够将各知识点讲得很透彻,但往往考虑不到学生的实际学习状况和接受能力,出现学生越学越难,理论与实践越脱节,越学越不想学的情况。另外,由于采用传统的“传授式”教学方法,在授课过程中往往是就概念而概念、就结构而结构进行讲解,自己感觉讲解很透彻,但没有将针对具体情况分析问题、解决问题的一般思路和方法教给学生。
因此,我们在“数据结构”的教学中应该改变传统的教学模式,提倡以学生为主体的新型教学理念,让学生在学习过程中不仅能获得知识,更应该学会学习知识的方法,让学生自己独立思考和探究学习,建构、发展和完善自己的知识体系,实现从知识到能力和方法的转化。
1“数据结构”中主流教学模式分析
教学模式是教学基础理论的具体化,也是教学具体经验的总结和概括。目前,国内外较有影响的现代教学模式主要有:掌握学习模式、发现学习模式、程序教学模式、范例教学模式和最优化教学模式。国内,人们在“数据结构”课程教学过程中,或多或少吸取了上述教学模式的基本思想,并逐步形成了几种较有代表性的教学模式和方法。主要有:基于可视化的“数据结构”教学模式、注重源程序的“数据结构”教学模式和“数据结构”案例教学模式等。这些模式各有侧重,对于提高教学质量和教学效果都能起到一定的积极作用。但是我们也应该看到上述模式都在不同程度上存在一定的局限性。如注重源程序的教学模式,可能会带来课堂教学中冗长的程序而冲淡了对关键结构和算法的理解,基于案例教学模式有可能淡化对基本结构和概念的介绍等。本人根据多年从事“数据结构”教学实践,借鉴已有教学模式的优点,提出一种综合性教学模式。
2综合性教学模式的基本思想和原则
“数据结构”课程的特点是逻辑性强,概念多且比较抽象。另外,算法的设计和分析是数据结构的灵魂,算法的好坏直接关系到软件的性能,因而该课程实践性也很强,学生难以掌握。开设“数据结构”课程的目的之一是要提高学生的软件开发与设计能力,但传统的教学思想与主流的软件设计思想脱节,而且传统的教学方法在有限的课时内很难让学生吃透抽象的概念和算法,更不要说将其运用到程序设计实践中了。因此,需要充分利用先进的教学手段、网络资源、开放式的教学与训练,形成全方位、立体化的教学模式,突破空间、时间的限制,达到提高教学质量,开发学生潜能的目的。
2.1综合性教学模式的基本思想
在理论教学和实验教学中吸取“源程序教学模式”和“案例教学模式”的思想。另外,对传统教学中的理论教学、实验教学借助网络平台进行拓展,形成教师一学生互动、学生—学生讨论的立体教学模式。
2.2综合性教学模式的基本原则
综合性教学模式应遵循如下原则:①必须以课堂教学为主,课外网上讨论辅导为辅的原则;②验证性实验与综合性课程设计相结合的原则;③课件演示适度的原则;④理论考核与程序设计能力考核并重的原则。
3综合性教学模式的实施
3.1夯实基础,查缺补漏
学生在学习“数据结构”时,如果其前导课(如C语言)掌握不好,学习起来将非常困难。在程序设计方面,学生只熟悉一些基本的常用语句如分支、循环等,一旦遇到指针、结构体就糊涂了。此外,由于所选“数据结构”教材采用类C语言实现算法,它忽略了C语言的细节部分。学生刚开始接触程序设计语言,对计算机语言的许多约定理解得不是很透彻,虽然有算法思路,但编写程序却无从下手,不能熟练地用C语言描述出来。
针对以上问题,我们采取如下方式解决:①在教学中,我们系带“C语言程序设计”和“数据结构”的老师在一个教研组,在章节备课时采取集各形式。这样对于“C语言程序设计”的教学情况非常了解,在“数据结构”的教学中可以采取相应的“查缺补漏”措施。②在学期伊始,给学生预先布置先修课程“C语言”的复习任务,并在以后上课、上机时作为对照,这将有助于本课程的消化吸收。③开课之初,在“C语言”中未作重点介绍而在“数据结构”中反复使用的程序代码重点讲解,如函数和函数参数、形参中值参和引用参数、指针的使用。通过对C语言的复习,可逐步提高学生阅读与理解算法的能力,使学生初步建立起较好的程序设计思想。
3.2把握知识体系结构,融会贯通
在“数据结构”教学中,应该从课程要求的大局出发,为学生搭建课程的整体框架。采用纵横对比的方法,由浅入深把握课程的教学要求。笔者认为不论是纵观“数据结构”教材,还是细化“数据结构”的第一章节,都可看出逻辑结构、存储结构和算法三条主线贯穿始终。在上第一节课时,笔者往往是在讲清数据结构的概念之前,先谈一下数据结构的研究对象,然后让学生打开教材的目录,这样学生就会非常容易将每一章节的内容归纳在这三部分中,让学生充分感受“数据结构”课程结构的完整性。并且在以后各章节的学习中,将这三条主线作为每一章节的教学框架,然后对每一部分详细展开。这样学生在复习时就能非常容易把握这门课的知识体系,使各个知识点了然
于胸。
3.3变更理论课教学模式,激发学生的求知欲和能动性
传统的教学方法是先提出概念,然后解释并举例说明。这种教学方式学生只是被动地接受教师讲授的知识,这种方法不仅不能提高学生的分析观察能力,也易使学生缺乏对理论学习的兴趣。
3.3.1以具体问题作引导,激发学生的求知欲
在理论教学中,应按照学生的认知规律,遵循先简单后复杂,先具体然后抽象的原则,以具体的问题,通过观察、分析、理解、总结进行教学,让学生自己在直观上先观察、分析具体问题,领悟所涉及的相关概念,然后再归纳总结。比如,在学习线性表时,可以先给出一组数据,如23,56,12,78,9,100。然后引导学生发分析数据间的逻辑关系。比如,谁是第1个数,谁是最后1个数,某个数的前边的数是谁,这样,通过简单引导,让学生通过观察,就可以归纳出线性结构的特性。然后引导学生思考对这一组数据可以进行哪些操作?然后再思考一下这些操作在计算机中如何实现?这就引导学生思考这一逻辑结构在计算机中的存储,这就是存储结构。然后再思考在存储结构中如何实现这些操作。而这正是数据结构所包含的三部分内容。而这正是以学生为中心的教学法,从提出具体的问题、观察具体的事实开始,引导学生逐步逼近概念和理论,让学生意识到这是他们自己经过观察、分析而理解了概念,激发学习的主动性和创新精神,形成对知识的科学态度和对问题进行分析的兴趣。
3.3.2以问题为中心,启发学生的思维,激发学生的学习能动性
在教学中教师要善于提出问题、启发学生自主地发现问题,分析问题和解决问题。问题是学习的引导者,没有问题,学习就不会深入。让学生带着问题去学习,在解决问题的过程中发现结论、总结规律,这样学生就更容易掌握所学知识。例如,要求学生分别采用递归与非递归(递推)算法编程求Fibonacci数列前50项,并在计算机上实现,最后比较两种算法的差异。通过编程调试比较发现:两个程序的长度差不多,递归程序容易理解,比较直观;而递推程序难于理解,甚至初学编程的人很容易搞错。然而递归程序则要比非递归慢。通过仔细研究、定量分析发现,递归程序需要使用堆栈,递归调用时的压栈与弹栈需要时间/空间开销,当这种递归调用次数较多时开销变得很可观。这种以问题为中心的互动式教学,改变了传统教学中以教师为主宰,学生被动接受知识的状况,教与学互相结合、互相渗透,教学工作就成为教师与学生共同参与的过程,使学生能对知识掌握得更加透彻,从被动学习转化为主动学习,培养分析问题和解决问题的能力。
3.4综合运用各种教学手段,提高教学效果
3.4.1授课语言形象化,激发学生的兴趣
数据结构所涉及的逻辑结构、存储结构和以类c语言描述的算法非常抽象,按传统方式进行授课学生不易理解和接受。在教学中,我们在对所授内容吃透后,在授课过程中多用一些白话代替枯燥的专业术语,同时,在讲解重点难点时经常穿插一些与所讲内容有关的幽默风趣的故事,实践证明,不但有益于学生掌握知识,而且激发了学生学习该课程的浓厚兴趣。
3.4.2理论教学适度“数学化”,培养学生分析问题和解决问题的能力
“数据结构”中的某些算法和公式的教学中,一定要注意揭示算法和公式的来龙去脉。在公式教学过程中应做到适度“数学化”,即应重视营造问题的情境,重视算法或公式的推导过程,而不应将结果直接展现出来。算法或公式的推导过程往往是逻辑思维的构建过程,通过算法推导,一方面巩固了基本概念,另一方面也是向学生示范分析推理和转化知识的过程。通过这样的教学,学生能够在潜移默化中构建一个良好的知识结构,形成良好的科学素养,提高了学生独立分析问题和解决问题的能力,为以后的工作打好基础。
3.4.3适度使用多媒体教学
对于算法,尽量用动画进行演示,这同样有助于学生对问题的理解,加深学生的印象。然而,对于多媒体等先进的教学手段使用也要适度。多媒体技术在使教学拥有了生动的画面、动听的音乐等强大的教学功能的同时,也由于存在一些不足,如画面富于变化而可能导致教学内容不清晰,重点不突出。同时学生也几乎不可能记笔记,不利于课后的复习。在教学中我们采取一些措施来弥补多媒体教学带来的不足:
(1)将备课笔记经过整理后作为课堂讲授的文字材料及时下发给学生使学生能摆脱上课时狂抄笔记而无法认真听讲的弊端。
(2)上课前将本堂课所讲内容大纲或某些重点内容提要写在黑板上,将黑板书写和屏幕投影结合起来,以避免由于计算机画面富于变化而带来的讲授内容线条不清晰的弊端。使课堂教学质量及同学的满意率均有了明显的提高。
3.4.4采用多种手段降低学习难度
自信心是激发学生创新能力的积极情感和重要前提。为培养学生克服困难的自信心,笔者针对各种数据结构设计了不同的框架程序,让学生在实验过程中逐步完善,添加新功能,最终形成一个大的系统。例如针对线性表,笔者设计了线性表功能框架文本界面,然后根据教学进度,让学生在上机实验时让学生逐步将一些单独的小功能,如线性表的创建、插入、删除、合并等功能添加进去。通过这种不断添加小功能,最终形成一个大的系统的实验方法,使学生具有一定的成就感,自信心不断增强。
3.5强化实验教学,提高学生的实践能力
“数据结构”的实践性很强,实验是教学过程中的一个重要环节。这对验证算法的正确性、巩固所学的理论知识方面起着重要作用。在实验教学中教师应注意以下几点:
首先,教师应重视实验教学并加强实验辅导。对于教材中只有类C伪码描述的算法,应补充可操作的实例。
其次,要纠正学生不正确的实验方法。实验不是简单地录入、调试运行就万事大吉,而应理清源代码的数据结构、以函数为模块来阅读程序、从主函数来把握程序流程,并结合流程图掌握算法思想。实践是个动态过程,需要学生积极动手,在编程中通过调试解决问题,并对发现的问题进行总结归类,才能真正融会贯通。
再次,设计不同形式、不同难度的实验题目供学生选做。因材施教,使不同层次的学生,从不同形式的训练中均有所受益。实验既要对基本算法进行验证,又需进行相对复杂的应用设计,针对学生编程能力的差异,实验主要可采用以下三种形式:
(1)阅读程序、程序填空,每个实验题目都给出相应的c程序模板,在模板中填写关键语句或子程序即可上机通过,如给出程序框架要求填写关键算法,给出类似函数要求独立编写程序,给出主程序要求编写子程序,以及给出算法要求编写程序等。
(2)调试运行例程、改写程序。每个实验都给出例程源代码及算法思路,学生调试运行通过后,再按题目要求改写程序,如:给出邻接表存储的图的深度优先遍历例程,要求编写邻接表存储的图的广度优先遍历算法,或邻接矩阵存储的图的深度优先和广度优先遍历算法等。
(3)综合性的课程设计小项目。学生以小组为单位设计一些小型的实用程序,如停车场管理、哈夫曼编码/译码器、通讯录管理等综合应用题目。利用项目驱动的方式,既是对课堂实例的扩充,又能提高学生解决实际问题的能力,养成良好的编码习惯,逐步培养学生软件工程的思想。但这种训练不宜安排太多,一般一个学期组织1次—2次,安排在学期中间、或稍后即可。
3.6以精品课程建设为契机,拓展“数据结构”教学的时间和空间
在教学过程中,我们的教学团队紧紧抓住精品课程建设的契机,花大力气进行“数据结构”的精品课程建设工作。通过精品课程建设,我们把许多教学材料,如课件、电子教案、实验大纲、例题、习题等发布到网络上。另外,由于“数据结构”课程自身的特点和课堂理论教学和实验教学的局限性,学生很难在课堂上完全理解与掌握,因此,课外的自学和训练、讨论必不可少。为此,我们对精品课程网站进一步完善,开通了专门的论坛,开辟了教师、学生讨论区,学习心得、经验交流区、网上自测室等,并且定期安排任课教师进行网上答疑。为了增强学习的针对性,我们在网上放了许多考研、软考和一些其他认证考试的与“数据结构”有关的题目。在对精品课程网站进行不断建设和完善的同时,我们还通过各种方法,引导学生充分利用这一网上教学平台,使广大同学确实在网站中受益。
4结束语
传统教学模式的缺陷和“数据结构”课程自身的特点,给的教学工作带来很多问题。笔者结合自己多年的教学实践,在吸取现代教学理论的基础上,提出一种综合性的教学模式,并将其应用到教学实践中。实践证明,我系的学生在考研、专升本等考试中“数据结构”都取得很好的成绩。