数据结构实践教学内容设置的分析与思考
2014-05-02刘燕丽李琳娜
余 艳,刘燕丽,李琳娜
(武汉科技大学 理学院,湖北 武汉 430065)
数据结构是信息类相关专业本科生必修的专业基础课,该课程探讨了各种经典数据结构的逻辑特性、在计算机中的存储表示方法以及相关算法的实现,为后续课程提供了理论基础和技术支持。学生对该课程的掌握程度直接影响着其后续课程的学习效果及未来从事软件开发的工作能力。数据结构是理论与实践并重的课程。实践教学是课堂理论教学的有效延伸,有助于学生进一步理解和巩固课堂所学概念和方法,同时也是学生进行复杂程序设计和培养良好程序设计习惯的训练过程[1-2]。本文归纳了在实践教学环节中常遇到的问题,针对这些问题,从实践教学内容设置入手探讨了提升实践教学质量的方法。
1 实践环节存在的问题
(1)C语言基础薄弱。我院信息与计算科学系数据结构课程开设在第3学期,在学习该课之前,学生只有1学期C语言程序设计的学习经验,编程经验还很不足。根据多年的教学经验来看,学生在数据结构刚开课时上机实践疑点较多的问题集中在:预定义常量和预定义类型的作用与用法、函数返回执行状态的作用与用法、函数定义和调用的方法、使用类型定义(typedef)描述存储结构的方法、指针及动态内存分配与释放的原理与方法。这些知识的教学通常安排在C语言课程的最后阶段,而这些知识的重要性容易被学生忽视,不少学生在C语言课程中只知教条地去遵守其语法规则应付考试,并未真正搞懂这些知识的使用场合与内在原理,致使其在后续课程数据结构的学习中对新知识的理解消化与实践应用受到阻碍。
(2)从类C语言描述的算法到C语言程序的转化感到吃力。目前数据结构授课广泛采用的是严蔚敏主编的《数据结构》教材,该教材使用类C语言描述算法,并借用了C++中引用调用的参数传递方式。学生在做实验时,需要将书中算法转化为C语言程序,但时常对引用调用的参数传递方式理解不够清楚,导致将相关算法向C程序转化感到困难和棘手。
(3)大问题无从下手,不懂组织程序、复用代码。学生在前导课程C语言程序的学习中,侧重基本语法和细节的学习,所涉及的程序规模小、算法简单,更有学生仅以通过计算机二级为目标,造成学生对大规模程序的模块化思想理解不到位,对组织程序文件、复用代码的实践方法也不熟悉。这使得学生在数据结构实践中解决编程问题时,仍习惯性地设法在一个主函数中解决所有问题,或者笼统地将所有自定义函数和主函数放在一个文件中,代码复用时则只知道采用复制粘贴的方法。
(4)依赖性强,信心不足,程序编写和调试方法不当。不少学生在上机实验时缺乏独立解决问题的勇气,遇到任何问题都急于向教师求助。有些学生因为程序编译报错寻求教师帮助,而这些问题学生完全可以结合编译环境给出的错误提示给予判断解决;有些学生一味追求程序结果,无论程序规模大小急于敲完程序所有代码再调试,当运行程序时发现错误成百上千,结果被吓得手足无措,不知如何是好;有些学生程序编译通过但程序结果输出不对,便理直气壮地认为自己无法找到错误所在,理所当然应把问题推给教师。
(5)兴趣不足。随着电子技术的迅猛发展,计算机已进入人们的日常生活,不再高不可攀,学生从小就开始接触计算机,对计算机丰富多彩的操作界面和五花八门的应用功能已经习以为常。面对数据结构复杂的算法、刻板的代码、黑屏白字的程序结果,学生常觉得枯燥无趣,缺乏成就感,致使学习缺乏主动性与创造性。
(6)实践考评依赖实验报告。在过去的实践教学环节,考评成绩主要依赖学生提交的实验报告。部分学生在上机实验中依靠抄袭他人的实验报告来应付考评,致使其惰性越来越强,甚至出现上机实验时无作为或旷课的现象。仅仅依靠实验报告评定学生实践成绩容易掩盖其真实的学习情况,对积极投入实践的学生来讲也不公平,体现不出他们的辛勤付出,甚至会挫伤其学习的积极性。
2 实践教学内容设置
实践教学内容的合理设置和精心安排有利于学生建立起编程的信心,并体会到征服困难与不断进步的成就感,使他们在牢固掌握书中所提供的各种算法的基础上,对各种数据结构的意义产生更深刻的认识,同时也有利于逐步培养学生大规模程序设计的能力,使其程序开发能力上升到一个新的台阶[3]。针对学生在实践环节出现的上述问题,武汉科技大学信息与计算科学系对实践教学内容设置进行了深入的探讨,最终将实践教学内容划分为基础型实验、验证型实验和设计型实验,其实验难度和知识综合程度呈递增状态。其中基础型实验安排在授课头两周,验证型和设计型实验按照课程进度进行安排。由于数据结构课程知识点本身就很多,为保证学生在有效的实验课时内能够得到全面锻炼,不遗漏重要知识点,所开实验都设为必做内容。其他学校与我们的实验内容设置相似的有[4-8],但只做了教学原则和目的的阐述,并未给出实验内容的具体设置。
2.1 基础型实验
基础型实验主要用于帮助学生理解C++中的引用调用,复习巩固C语言知识和查漏补缺,并集中训练函数、指针、结构体、自定义类型、动态内存分配与释放这些学生掌握薄弱,但数据结构学习过程中经常用到的知识点,避免学生在学习数据结构过程中出现看不懂教材算法、写不出程序代码的现象。基础型实验好比热身运动,能够为数据结构的理论和实践教学做好准备工作,减少学生在课堂学习和后期实验中的技术障碍,提升学生的编程速度。实践证明,基础型实验的扎实训练可以解决实践环节曾经存在的问题1和2。
2.2 验证型实验
验证型实验主要用于加强学生对各种数据结构实现方法的理解,要求学生参考课本提供的算法,编程实现各种数据结构的演示系统。演示系统的设计要求是:
(1)以指定的存储结构表示某种数据结构,并实现该数据结构常用的各种基本操作,如初始化、销毁、插入、删除等;
(2)在主程序中以人机对话的方式执行各种基本操作,进而验证其实现方法的正确性。
验证型实验在以往的教学中常常被忽视,理由是认为其内容已在课堂讲授,学生对于数据结构基本操作实现算法的理解也没有太大问题,或是认为验证型实验枯燥重复、没有联系实际应用问题,对学生灵活使用数据结构知识没有帮助,且会抹杀学生的学习兴趣、降低学习的积极性。但学生在验证型实验的过程中常常能发现自己在知识或技术上的漏洞,验证型实验锻炼不足的学生直接去做设计型实验往往会难以下手、困难重重,且验证型实验的成功运行能够给学生带来满足感,为其进一步完成更复杂实验树立信心。
数据结构应集中精力讲解“各种结构本身的构造与实现”,验证型实验理应成为数据结构实践教学的关键[9]。因此,我系一直重视验证型实验内容的安排,力求使学生通过该实验加深对教材中各种存储结构及基本操作的理解、洞晓数据结构实现的技术细节、提升C语言编程的熟练度;验证型实验也成为学生大规模程序训练的立足点,是更复杂实验有效实现的基础,其代码可以在后期实验中复用,减少学生在后期实验中的工作量,使学生将精力集中在应用问题更高抽象级别的求解算法上。实践证明,验证型实验的强化训练可以有效解决实践环节曾经存在的问题3和4。
验证型实验内容安排如表1所示。例如,验证型实验1要求学生以顺序存储结构表示线性表,验证型实验2要求以链式存储结构表示线性表,使学生在程序编写的过程中进一步体会到同一种抽象的数据结构在计算机中的多种存储表示方法,而不同的存储方法决定了其基本操作实现方法的不同,在具体应用时应结合问题特点选择合适的存储结构。又如验证型实验3要求学生实现栈演示系统,程序中所实现的栈类型则可以在设计型实验3中复用;再如验证型实验7——二叉树演示系统,不仅要求学生实现教材上已有的二叉树创建和遍历算法,而且要求学生利用递归实现教材上没有的二叉树高度计算、叶子节点统计等功能,使学生对递归算法的使用场合和求解思路加深印象,在实验过程中真正掌握递归这一强有力的工具,为后续章节,尤其是图中更复杂的递归算法的正确理解奠定基础。
表1 验证型实验内容安排
2.3 设计型实验
验证型实验虽然可以强化学生对各种数据结构本身构造的理解,但难以让学生体会到数据结构存在的意义。设计型实验用于训练学生能够针对具体应用问题选择合适的存储结构并设计合理算法进行求解,恰好可以弥补验证型实验的不足。但设计型实验的内容设置存在一定的难度,既要与实际应用相关联,又要避免引入太多背景问题,其难度必须在学生可以接受的范围内。
例如二叉树和树是数据结构的一个教学重点,但众多的教材和参考书却鲜有二叉树的典型应用问题或实验,这也成为学生长久以来困惑的一个问题:到底什么应用中会用到二叉树。其实三维人体运动播放器就是一个二叉树的典型应用问题,该程序使用树结构表示人体骨架结构,读入光学设备捕捉的人体运动数据,将树转化为二叉树利用遍历算法计算每一帧中人体各关节的三维位置,并在三维场景的正确位置画出关节就可以实现人体三维运动的播放。但由于该问题涉及计算机图形学、Windows程序设计等知识,超出学生当前的知识范围,所以只能作为例子演示,不适合拿给学生做实验。尽管数据结构无论是在工业界软件产品的开发中还是计算机领域的科学研究实验中都必不可少,但从具体应用实例中截取一个学生可以真正实现的问题还是有难度的。
因此设计型实验的选题设置一方面可以引入计算机领域内的热点研究问题,当然这需要授课教师集思广益,同时要注意在实验中进行知识背景深入浅出的介绍和问题广度及难度的控制;另一方面也可以借鉴一些经典问题,例如利用循环链表求解约瑟夫环问题[1]、利用栈分析算符优先关系实现算术表达式的求解等。设计型实验内容安排如表2所示。实践证明,设计型实验的设置可以有效解决实践环节曾经存在的问题4和5。
表2 设计型实验内容安排
表2 (续)
3 实践教学过程实施
3.1 实践教学手段
目前我系数据结构教学理论学时为60,实验学时为18。由于学时安排的限制,学生很难在实验课堂内完成所有实验,选择性地完成实验又会造成某些知识点的遗漏。由于学生能力的差异,每个学生完成同一个实验所需要的时间也不尽相同。因此实践教学采取课外、课内相结合的方式,鼓励学生在实验课外自由灵活地完成实验,实验课内则着重问题交流、实验检查和督促。其中,基础型实验和验证型实验以课后作业的形式根据授课进度布置给学生,同时减少纸质作业量,从而加大学生在课外动手实践的机会。每个设计型实验则在对应的验证型实验完成后开设。设计型实验开课前由教师将实验任务书发给学生,同时要求学生在实验课前做好相关准备工作,包括任务书的阅读、相关资料的查阅、总体设计、详细设计和用户界面设计,再在实验课上完成编码和调试的工作,并在课后完善实验报告。为方便学生上机实践,系机房在课余时间向学生开放。实验室开放式管理借鉴文献[10],用于增加学生上机的自由度。
3.2 实践考评方法
实际上各高校的考核重心主要偏向理论教学,对实践教学没有有效的监管和考核措施,使学生并未从思想上引起对实践的重视,从而无法有效锻炼和提高动手能力[11]。因此,合理可行的实践考评方法值得研究。
目前对实践的考评包括程序演示、回答问题、程序改进和实验报告4个环节。程序演示环节由学生向教师演示自己的程序,教师检查学生程序是否达到预期要求;回答问题环节教师向学生提出程序设计和实现的相关问题,学生口头回答;程序改进环节教师根据学生的程序运行效果向学生提出改进措施,学生在实验课上完成对程序的改进。其中回答问题和程序改进2个环节必不可少,便于教师及时发现试图抄袭他人代码蒙混过关的学生,这些学生往往对教师所提问题理解不清、对改进程序手足无措。当然这2个环节对教师的要求也比较高,需要教师能够根据实际情况随机应变提出合适的问题及程序改进要求,并需要及时记录学生在各个检查环节中的表现情况,这在一定程度上也增加了教师的工作量。由于学生人数众多,为保证能够及时考评到每一位学生的每一次实验,实验指导教师的数量也需要得到保证。
4 结束语
数据结构实践教学内容改革以来,发现学生对上机实验更加重视,在实践过程中随着经验的积累不再惧怕编程,曾经的反感和抵触情绪不复存在,实验时与教师的交流过程中也能够提出更加深入的问题,对数据结构课程的学习更加轻松自信。通过对数据结构实践教学的探索,深刻感受到合理的实践教学内容设置能够加深学生对数据结构理论知识的理解,帮助学生建立自信和增强学习兴趣,同时有效积累编程技术、增强动手能力和知识应用的能力。
(
)
[1]严蔚敏,吴伟民.数据结构:C语言版[M].北京:清华大学出版社,1997.
[2]周海岩,陈宏明,殷路.《数据结构》课程教学的思考[J].教育理论与实践,2010,30(6):62-63.
[3]余艳,刘燕丽.数据结构教学方法探讨[J].计算机教育,2013(9):56-58.
[4]徐种,王立波,江娟.提高数据结构课程设计教学质量的探讨与实践[J].计算机教育,2011(9):71-74.
[5]李月军,李娟,李英玉.融入ACM/ICPC竞赛内容的数据结构教学改革与实践探讨[J].内蒙古师范大学学报,2012,25(3):137-140.
[6]李晓鸿,骆嘉伟,季洁.“数据结构与算法分析”研究型实践教学的探索[J].实验室研究与探索,2012,31(1):121-125.
[7]卢冰.高校计算机专业“数据结构”课程教学改革的探索与实践[J].成人教育,2011(9):110-111.
[8]陈宝平.《数据结构》课程教学改革的思考与探讨[J].现代计算机,2011(2):57-59.
[9]邹恒明.分而治之为上策:数据结构课程的反思与变革[J].中国大学教学,2011(6):53-56.
[10]陶影,张斌.数据结构实验教学应重视算法设计与分析能力的培养[J].实验室研究与探索,2008,27(12):119-122.
[11]李登,陈志刚.基于智猪博弈的数据结构课程理论与实践教学研究[J].湖南师范大学教育科学学报,2012,11(4):96-98.