时间:2023-02-07 11:43:22
导言:作为写作爱好者,不可错过为您精心挑选的10篇数据结构课程设计,它们将为您的写作提供全新的视角,我们衷心期待您的阅读,并希望这些内容能为您提供灵感和参考。
一、背景
数据结构课程作为计算机专业的核心基础课程,学好数据结构才能为许多后续课程的学习打下良好的基础。课程要求学生通过理论与实践学习之后,能掌握各种数据结构以及与之相关的算法的知识,并将这些知识应用到对具体实际问题的分析中。参照ACM/IEEE-CS的《ComputeCurricula2001》报告中提出的数据结构课程内容主题[1]有几十个,即课程的教学内容多,覆盖面广,而且由于很多重要知识的理论性较强,特别是一些难点知识比较抽象而难以理解,所以数据结构是被学生广泛认为难学、难懂、难实践的课程。学习的过程通常由“信息传递”和“吸收内化”两个阶段构成,采用信息化技术手段开展以微课、慕课、云课程、翻转课堂为代表的数字化教学是实现知识信息传递的有效手段[2]。微课一般是在课堂教学之外,由学生主动参与的轻量化、碎片化、结构化的学习方式,通过良好的课程结构设计,结合短视频、动画、语音等手段,能有效地将抽象的知识转为形象化的内容,从而高效促进学生“吸收内化”的进程。
二、微课及设计方法
微课(Microlecture),是指运用信息技术按照认知规律,呈现碎片化学习内容、过程及扩展素材的结构化数字资源[3]。微课课程平台是学生在课堂教学外的细化教学知识,实现“自主学习”和“个性化学习”的环境,在微课平台上,学生可按需选择学习,既可查漏补缺,又能强化巩固知识,是课堂学习的一种重要补充和拓展。从逻辑结构角度看,一个完整微课课程通常由一系列微课单元构成,一个微课单元除了用来讲述该教学主题知识点的课堂教学短视频及与短视频配套的描述或解释的短文这一最重要的核心部分之外,通常还包含与该教学主题相关的练习测试及师生交流等辅教学资源,这些资源共同组成了一个主题式、半结构化的微课教学单元。一个设计良好的微课单元通常具备主题选题精准和内容组织合理的特点。选题精准就是一个微课单元是一个教学主题,在设计这个主题时,要注意这个选题所覆盖的知识或原理应较为简单[4],其涵盖知识点可选2—3个;内容组织合理就是知识内容的组织和分解简明,将一个教学主题核心知识点和目标分解为若干个子知识点或步骤,这个核心知识点的分解最好只要一层逻辑,尽量不要在子知识点下再分解。
三、数据结构微课设计过程
数据结构课程要求学生能合理选择数据结构,并把与问题相关的数据组织起来实现准确和高效计算处理,所以数据结构的核心概念由数据的逻辑结构及其定义在逻辑结构上的运算、数据的存储结构以及运算的实现、运算算法的复杂度分析三个方面构成,而且在课程中数据的结构又与其相关的算法缠绕在一起[5],使得在微课设计时所做的知识点分析必须循序渐进地展开,采用由浅到深、由易到难的步骤,再从这个课程的知识体系出发,选取其中的重点、难点、疑点、考点、易错点、热点和扩展点,设计和制作一系列既相对独立,又环环相扣的微课主题单元[6]。
(一)知识点分析与微课主题单元划分
设计数据结构课程的微课时,首先按照课程内容的知识结构来完成各个主题单元的设计和划分。我国的大部分数据结构与算法的教材[7-8]把课程的知识体系对应到教学内容之后,分成了基本概念和基础知识、线性数据结构及相关算法、树形结构及相关算法、图结构及相关算法四个教学组成部分,这四个组成部分又可分别分成若干子模块,每个子模块又可再分成若干主题单元;划分方法可以使用表格或思维导图来协助完成。思维导图是表达发散性思维的有效图形思维工具,能直观地把各级主题的关系用相互隶属与相关的层级图表现出来[9]。借助思维导图,我们能有效完成微课课程知识结构的设计工作,图1是我们设计线性数据结构及相关算法部分的微课主题单元思维导图。
(二)微课主题单元设计
中图分类号:TP311.12 文献标识码:A 文章编号:1009-3044(2013)22-5101-02
数据结构是计算机科学与技术专业的一门必修的专业基础课,是计算机理论与技术的重要基石。该课程的主要特点是实践性很强,不仅要学习基本理论知识,更要注重上机实践,通过上机实践验证算法的正确性,掌握和巩固所学理论知识。该课程的主要目的是通过学习,使学生学会分析研究计算机加工的数据结构的特性,以便为涉及的数据选择适当的逻辑结构、存储结构及相应的算法,并初步了解对算法的时间分析和空间分析技术;另一方面,通过算法设计和上机实践的训练,培养学生的数据抽象能力和程序设计的能力,为后续课程,特别是软件类课程打下坚实的基础。
数据结构课程要求学生掌握各种常用数据结构的逻辑结构、存储结构,及相关操作的算法,而学生在算法设计或程序设计方面还不具备足够的技巧,因而会感到难以理解和掌握。学生理解教材上的基本概念并不难,然而,他们在解决具体问题时就会感觉到力不从心,特别是对那些有一定难度的算法设计题更显得无从下手[1-2]。因此,培养学生的学习兴趣和自信心,提高其学习的主动性、创新性及应用能力,是数据结构课程教学中的重要任务。
数据结构课程一般是在大学二年级上学期开设,而数据结构课程设计在大学二年级下学期开设。作为一个重要的实践教学环节,该课程是数据结构课堂理论教学的延续与补充,其基本目标是运用所学知识,对实际问题进行分析,选取合适的数据结构,独立地进行设计相对应的存储结构,并用算法加以实现,从而解决所提出的问题[3-4]。在此过程中,进一步巩固、加深和融合所学的专业课程知识,锻炼学生独立思考的能力、分析问题和解决问题的能力、综合设计能力、开拓创新能力、自学能力,以及团队协作能力等。因此,课程设计对全面提高学生综合素质具有重要意义。
笔者在多年的教学实践中体会到,数据结构课程设计的教学要循序渐进,如何让学生理解课程内容与较好地解决实际问题两者相结合是本门课程教学的主要目标。为了让学生准确理解并巩固所学的基本概念、原理和方法,将所学的基本知识、基本技能用于解决实际问题,达到具备今后软件了开发工作所需的能力,最重要的是让他们勤加苦练。经过循序渐进地练习,使学生掌握更多的程序设计技巧和方法,提高他们分析、解决问题的能力,培养他们的团队协作精神。接下来,笔者就如何激发学生的兴趣,提高数据结构课程设计的教学效率和效果,阐述几点感受与体会,与同行一起探讨。
1 课程设计教学过程中的体会
数据结构课程设计比教学实验复杂一些,涉及的深度更广些,而且更加实用一些。教学过程中,教师根据学校的特点和教学计划选择相应的课程设计内容,帮助学生系统掌握数据结构这门课的主要内容,从而顺利完成教学任务。为实现课程教学目标,笔者结合自身的教学经验和研究成果,就教学过程中课程设计内容的选题,实施方法,以及评价标准等方面谈谈自己的一些体会。
1.1 课程设计内容的选题
数据结构课程设计应遵循以下原则:坚持以能力为本位,以学生为主体,教师角色转换为倡导者。选题时尽量达到以下特点:新颖性、实用性、难度适中、各有所需。
一个好的选题既可以反映课程设计大纲的要求,又能反映本学科新技术的发展前沿,还能通过本课程设计训练,培养学生分析问题、解决问题的能力,从而掌握数据结构这门课程的主要内容。首先,选题要新颖,因为新颖的选题能进一步激发学生的学习兴趣,调动其学习的积极性。其次,选题应具有实用性,接近实际工程的需要,引导学生根据需求分析,利用所学知识去解决与日常生活中密切相关的问题。再次,选题难易程度要适中。课程设计的内容基本上能让大多数同学接受,难度过大会让学生产生一种消极,甚至是抵触的情绪;难度过于简单也同样达不到预期目标。最后,选题范围要足够广泛,让不同层次水平的学生都有问题可想,为学生提供发挥其创新性思维的平台;同时,工程大的选题在一定程度上更能锻炼学生独立思考的能力和团队协作能力。对某些课程设计提出部分需要改进或进一步完善的要求,供那些学有余力的学生来拓宽自己的设计思路,提高自身的解题能力及水平。当然,学生也可以自主设计一些有挑战性的题目。
1.2 课程设计的实施方法
本课程是在保证基础理论教学质量的前提下,进一步加强学生解决实际问题的动手实践能力的培养。根据课程设计的实际情况,给出一些具有一定规模的问题,并对课程设计内容做系统安排,具体实施过程如下。
1.2.1 分组
以设计小组形式,每3~5人组成一组,同一班级自由组合;如需要跨班组合,可向指导教师提出申请。每个小组选出一名基础较好且具有一定组织能力的学生担任组长,组长负责本小组的选题,系统模块划分和任务安排,使每位小组成员负责一部分功能的实现。
1.2.2 选题与分工
各小组成员共同协商选择合适的题目,然后进行分工。小组之间也可以相互合作,将各自的系统模块进行整合,以解决更大规模的问题。指导教师根据各个学生的实际情况作适当调整,保证工作量的合理分配,以确保各小组设计工作的顺利进行。
1.2.3 定期检查
定期检查或抽查每个学生的完成情况,了解各个小组的课程设计进展;督促学生积极思考,比如,描述要解决的问题,根据操作对象选择相应的数据结构,建立模型,定义抽象数据类型,画出算法流程图,引导他们锻炼自己的分析问题和解决问题以及编程实现的能力。
1.2.4 提交实验报告
实验报告的正文必须至少包括以下内容:
1)问题描述:根据自己的理解,描述选题要实现的功能。
2)数据结构:为处理所需要的功能,自己设计数据结构,包括各自完成的有关数据类型,操作的定义,以及存储结构。
3)算法描述:根据问题的要求和所设计的数据结构,描述算法过程。
4)效果与测试情况:给出系统的测试情况与最终效果,可通过截取一些界面用于解释说明。给出测试数据结构的使用手册,以及完成其他数据类型的测试与测试报告。
5)分析与讨论:分析所采用算法的优缺点,时间复杂度,算法实现过程中遇到问题,所采用的解决方法,自己提出的算法的改进方案。本课程设计的不足之处,改进思路,以及实验过程体会。
6)参考资料:文中所引用的参考资料撰写格式参照国家标准(GB-T 7714-2005)。
7)致谢:感谢在完成本课程设计报告过程中对自己提供帮助的个人/集体。
8)附录:附上结构完整的程序,带有详细注释的源程序清单。
1.3 课程设计的评价标准
课程设计完成后,应对每位学生提交的课程设计报告进行评价,可分为小组互评和指导教师评价两个过程。
1.3.1 小组互评
小组互评包括自评和组长评价两部分。首先,每位组员根据各自参与程度、完成的工作量、效果在小组内自评,自评分值占50%。其次,组长在报告封面上描述组内每位组员的具体工作,并为组内各成员打分,组长评分值占50%,同时规定:组长100分,排名靠后的组员的成绩与前一位组员的成绩分数差距为6~10分。课程设计采用分组形式的宗旨是鼓励合作,但反对挂名。
1.3.2 指导教师评价
小组互评之后,由指导教师组织学生进行课程设计报告的现场答辩,答辩过程包括:以小组为单位进行现场演示,解答教师或其他组的同学所提出的问题。现场演示检查可以提高学生对课程设计方法的理解,锻炼他们对相关问题的表达能力。而在现场提问环节中,小组成员可以通过协商共同解答他人的提问,以此提高学生的临场应变能力和相互协作能力。指导教师对课程设计报告要进行认真的评判,评分时各部分的分值比例如下:选题难度,包括完成目标的难度,占20%;完成质量,主要考虑其设计方法和实现技术,占30%;实验报告撰写质量,占30%;演示效果,占20%。上述分值比例及评定方法可根据实际情况适当调整。
指导教师评价学生的设计时采用如下标准:
1)若完成的课程设计特别优秀,且创新性强,可给予90分以上,但严格控制90分以上的数量。
2)若能保证程序完全正确,则可获得80~84分;如果学生设计算法有自己独特的见解,并通过代码实现,而且具有一定的创新性,则可考虑加分到85~89分。
3)若在设计算法和代码实现的过程中出现极少的错误,则应给予70~79分。
4)若设计错误不算太多,大部分算法与实现程序都能通过,则应给予60~69分。
5)若程序中有比较多的错误,不能达到规定的要求,则其成绩给予不及格。
2 结论
课程设计是让学生综合运用所学知识解决实际问题的重要教学实践环节。如何通过课程设计环节实践,培养学生分析并解决具有一定规模的实际问题的能力,提高数据结构课程设计的教学效率和效果,是教师一直在不断研究和探讨的问题。笔者根据自己在教学中的体会,介绍并探讨了对课程设计内容的选取,组织与实施,以及评价标准,并将其应用到本校数据结构课程设计的实际教学中,取得了较好的教学效果,为同行提供一定的可参考价值。
参考文献:
[1] 严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,2006.
1 引言
课程设计是课堂理论教学的延伸和补充。作为一门独立的课程,它应该完成如下基本目标:应能够完成理论与实践的结合,应能够锻炼学生的设计创新能力、分析和解决问题的能力。
数据结构与算法课程是计算机科学与技术专业以及相关专业的一门专业基础课程,同时它也是计算机科学与技术专业课程体系中的核心课程之一,它在计算机科学与技术专业的课程体系,特别是软件系列课程体系中处于承上启下、联系左右的中心地位。大量的实践表明,是否学好数据结构与算法课程对于能否学好计算机本科课程有着相当重要的作用,同时也对后续的工作和研究有着深远的影响。
现今,各大学的数据结构与算法课程和教材的内容都主要集中在“基本数据结构的阐述和分析、基本数据结构的应用、典型基本算法的适当渗透”这三个方面。其中,前两部分是重点,并占据了较多的篇幅,而这些内容的教与学离不开大量的实践,所以在数据结构与算法课程教学中经常会有大量的课程实验作为辅助。
通过进一步的深入分析可以看出,上述基本知识的学习并不是最终目标,而是为到达最终目标打下的基础。显然,从计算机科学与技术专业的知识体系可以看出:如图1所示,学习数据结构与算法更深层次的目标是能够针对实际问题来选择、扩展甚至是设计全新的数据结构,然后设计相应的存储结构并加以实现,从而最终完成问题的求解。可以看出,这一过程是一个融会贯通的过程,是不能通过课程实验完成的,也不可能在课堂教学中就可以建立完整意识的,所以在课程之后需要进行课程设计。
为此,数据结构与算法课程设计应能达到如下基本目标:培养学生应用数据结构基本知识来分析问题、解决问题的综合能力;帮助学生建立计算机问题求解的全局意识,主要是通过认识数据结构在问题求解中的地位来完成全局认识的建立(这一全局认识如图1所示);训练学生从系统的、规范的观点来进行计算机问题的分析、设计、编码、测试等。
上面分析得出的数据结构与算法的课程设计目标是符合一般的课程设计规律的。但数据结构与算法课程具有自身的、明显区别于其他课程的地方,再结合计算机专业的特点,就决定了还需要分析并建立适合数据结构与算法课程设计特点的教学模式。所以本文在第2节就数据结构与算法课程设计和其他课程的课程设计进行了对比分析,在第3节提出了一种基于问题驱动的教学模式,并就其中的关键部分给出了详细的描述。
2数据结构课程设计的特点分析
任何事物都是一般性和特殊性的统一,数据结构与算法课程设计也是一样的。和许多其他课程的课程设计一样,它有着课程设计的共性,也有自身的特性。经过和其他课程的课程设计的对比,作者认为数据结构与算法的课程设计主要具有如下特殊性。
2.1不具有明显的整体性
这是由数据结构与算法课程本身的特点决定的。由于该课程的核心内容主要集中于对各种数据结构的认识上,虽然各种数据结构之间总是存在许多内在的联系,但总的来说还是自成体系、较为独立的。
就这一点而言,数据结构与算法课程就和其他许多课程存在不同,也就使得数据结构与算法课程设计具有相应的特点。比如计算机组成原理的课程设计,可以通过做一个完整的、简化的计算机硬件系统(包括的简化的存储器、控制器、运算器等部件)来完成课程内容的全面训练,并让学生建立对计算机组成的整体认识。机械原理的课程设计可以是一个简单的机械系统的设计,完成对机械原理各部分内容的综合训练。而对于数据结构与算法的课程设计来说,几乎不可能构造一个题目把所有的数据结构都包含进去。实际上这样做是毫无意义的,因为数据结构本身就是不断扩展的,在学习、掌握基本数据结构的基础上能够对知识加以扩展并灵活运用才是真正重要的。
所以在数据结构与算法的课程设计中,应强调问题求解能力的培养,而不像其他课程的课程设计那样来强调综合设计能力。
2.2课程内容具有很强的可伸缩性
从发展状况来看,数据结构与算法的发展是极其迅速的,不断地有新的数据结构和新的算法出现,而且针对不同的问题,数据结构与算法可以做出非常灵活的调整。在这一点上它和许多其他课程不同,比如操作系统中可能会不断出现各种各样的调度算法,但都集中在进程管理中,并总归结于资源管理这一基本框架下,只要冯・诺伊曼体系结构不变,操作系统的资源管理框架就不会改变。而数据结构就不同,如就树结构而言,二元树虽然在概念上较为规整,但在实际问题中,大多都采用树结构的变形,如B树以及其他新型变形等,似乎两者都可成为教学的重点。
正是因为数据结构与算法的可收缩性,培养针对问题的数据结构设计能力才是最重要的。
2.3具有极其广泛的渗透性
计算机问题领域包括许多其他行业的问题,如经济领域问题,只要涉及到对数据的组织与处理,都能或多或少地找到数据结构的用武之地,所以培养依托数据结构完成各类问题求解的“嗅觉”是十分必要的。
总的来说,基于数据结构与算法课程的特点,建立起与之相匹配的课程设计教学模式,这样才能更好地完成教学。
3基于问题驱动的课程设计教学模式
在以上分析基础上,如图2所示,本文提出一种基于问题驱动的课程设计教学模式。
3.1问题来源
数据结构与算法课程设计的问题来源(即教学内容)主要包括:基本数据结构在解决实际问题中的应用;基本的算法策略在解决实际问题的应用;新兴数据结构的相关问题;新兴算法的相关问题及实践;经典问题的经典算法;典型系统的计算机模拟;需自行设计数据结构和算法来解决的实际问题。
3.2问题描述
在问题的描述上,侧重于用半自然语言进行描述。完全的形式化描述将减少问题分析能力的培养力度,完全的自然语言描述有包含太少的启发信息。
一般来说,要求问题的描述必须能够清晰地说明问题的含义和目标,并就采用的数据结构适当地给出启发,其中,也可以设计一些题目故意将问题的目标隐去,加强对学生问题定义能力的培养。
3.3问题求解的迭代性
问题求解是不能够一蹴而就的,一开始设计(选取)的数据结构与算法往往存在这样或那样的问题,建立逐步求精、多次迭代的问题求解思维是必要的。
为此,我们需要在学生的课程设计过程中,鼓励学生对其解决方案进行理论分析和实验分析,鼓励学生大胆提出优化方案,鼓励其积极主动的创新意识。
3.4结论形成
最终的结论(体现为课程设计报告)应以数据结构的描述为核心,并集中体现如何针对问题来完成数据结构的设计与优化。
其中,数据结构的描述应以抽象数据型(ADT)为基本手段,并在抽象数据型的基础上,引导学生深刻理解和掌握数据的逻辑结构、性质、特点、基本操作和存储结构的特点、实现和优化,并引导学生在实际应用中有意识地去为实际问题选择恰当的存储表示。
结果分析应采用理论分析和实验分析并重的方式,应适当加大实验分析的力度,使得学生能在分析结果的基础上形成总结并产生启发,最终能形成问题求解过程的全局意识。
3.5结果考核
鼓励学生选择需要设计新型数据结构(至少需要对已有数据结构作出修正)的题目,而不仅仅是实现一个定义明确的数据结构;鼓励优化方案的提出、分析和验证;鼓励学生扩展知识体系,并建立问题求解的修养;鼓励创新意识和主动学习意识的培养。
4 结束语
针对数据结构与算法课程设计的一般性和特殊性分析,本文在提出该课程设计的基本要求后,更提出了适合于数据结构与算法课程设计的“以问题求解为核心”的教学模式。近年来,经过对计算机科学与技术专业本科生的多次实践,可以看出,这一模式可以取得很好的教学效果。
参考文献
1 耿蕊,李敬有,邓文新.关于计算机基础课课程设计的研究.高师理科学刊,2005,5
1.《数据结构》课程授课现状
《数据结构》课程是计算机及其相关专业的核心基础课程,是一门理论与实践相结合的课程,在整个计算机专业教学体系中处于举足轻重的地位,特别在软件方向的课程体系中处于承上启下的中心地位。长期以来,《数据结构》课程的教学备受相关学院领导高度重视,然而,大部分高校《数据结构》课程的教学效果都不尽如人意,影响教学效果的原因大致如下:
(1)理论教学与实践教学严重脱节。目前对于《数据结构》的理论教学主要是教师首先讲解基本的结构思想,然后再引导学生读懂由类C++语言编写的算法,最后布置作业让学生思考针对这些算法的问题。在实践教学方面,学生通常要做的事是将课本上写的很详细的代码翻译成相应的高级程序语言并调试通过,甚至不会去自己解决一个稍微复杂点儿的综合问题。基于上述两种原因,学生在学习的过程中可以不用费神思考就能将问题解决,但是离开课本遇到一个新的具体的问题就不知所措,体现不出学生独立思考问题的能力,实践教学环节更是流于形式,加之学生程序设计的基本功不扎实,久而久之对学习编程和思考问题失去兴趣。
(2)传统单一的考核形式,不能体现学生的技能水平。现阶段大多数高校对于《数据结构》课程的考试形式总是以笔试为主,考核的内容还是单一的理论知识,尽管最后有编程题目或者分析题,但是均不能体现学生的技能掌握的如何,90%的学生感觉学习了《数据结构》这门课程对自己以后的学习和工作没有用处,进而减弱了学习的信心,导致学生再学习后续的数据库和编程方面的课程的时候,缺乏模型构建的能力。
2.项目驱动教学法在《数据结构》课程中的应用分析
项目驱动教学法是以学生为主体,以项目知识为主线,教师参与引导的教学方法,它不再是“教师讲,学生听”的被动教学模式[1]。该教学方法的主要目的是让学生真正的参与到课堂中来,培养他们主动思考问题和创新的能力,特别适合于像《数据结构》这种内容延伸性强、抽象思维要求特别高的课程。
2.1 项目驱动教学法的特点
项目驱动不同于简单的任务驱动,它更侧重于培养学生解决未遇到的关键问题的能力,在教学过程中表现为以项目为本位、以学生为主体的重要特征,要求教师设计的项目要具有一定的应用价值,并且最好与企业实际生产过程或具体问题有直接的关系。项目教学法的特点如下:
(1)具有实践性:项目的主体与现实世界密切相连,学生的学习内容更加的具有针对性和实用性。
(2)具有自主性:学生自由、自主的分组进行学习,根据自己的理解发挥想象力,从而促进学生创造能力的发展。
(3)具有发展性:长期项目与阶段项目相结合,构成为实现教育目标的认知过程。
(4)具有综合性:项目的设计本身需要综合多个学科,所以培养了学生综合运用知识的能力。
(5)具有开放性:学生需要围绕问题进行探索和解决,所以学生的学习形式不再局限于课堂[2]。
2.2 师生角色的相互转变
项目驱动教学方法要求每位学生均要真正的参与课堂中来,在老师的引导下,发挥想象、参与研究、参与创造。因此,项目驱动教学法较以往的传统教学实现了两个打破:
第一,打破教材章节顺序,以项目为主线完成课程的培养目标。教师须在完全吃透课程培养目标的基础上,熟悉教材知识点,然后根据要传授的知识点结合该专业的就业方向和岗位构建项目,教师的主要精力应放在项目的设计、布置和引导方面,教师设计项目的优劣直接影响学生的学习效果。另外,在教学的初级阶段,教师还应该全面把握项目实施过程中学生可能出现的问题以及如何解决。在项目的实施阶段,教师只是起到引导和督促的作用,而不参与讨论,当各组学生都提出普遍不懂的问题时,可以先引导其查阅相关的资料或略微指导一二,教师在整个的过程中完全成了一名向导和顾问。当然,如何引导学生在项目实践中发现新问题和掌握新知识,这对老师提出了更高的要求。
第二,打破教师在台上泛泛的讲,学生在台下静静的听的局面。项目驱动教学法要求先将学生分组,每一组学生接到教师的项目后就开始自行分配任务,并且在指定的时间内将相关的问题解决,这期间可能会查资料、相互讨论、请教师长等,学生的教材理所当然的当成了查找知识的工具书,或者有些教材甚至可以不用给学生征订,节约了教育成本。这样,我们的教学才真正做到了注重过程、以学生为本。
2.3 项目驱动下的《数据结构》课程划分
以《数据结构》课程的教学为例,在采用了项目驱动教学法后,我们将课程的知识点划分成了10个项目:
表1 《数据结构》课程项目示例表
项目名称 相关知识点 参考课时
通讯录信息管理系统 线性表、查找、排序 6
某高校学生成绩管理系统 线性表、串、查找、排序 6
婚姻的稳定性情况调查 数组、栈 8
理发馆的经营状况分析 线性表、队列 6
十进制四则运算器设计 栈、树结构、浮点数运算 8
汽车零部件的库存模型设计 广义表、查找、排序 8
因特网域名查询系统 树结构、查找 6
小型汽车牌照的快速查找系统 线性表、查找、排序 10
管道铺设施工方案设计和选择 图结构 8
文章系统设计 文件、查找、排序 10
受现阶段高校授课时间的限制,针对不同的学生层次,这10个项目可能不能全部做完。根据学生的特点,教师可以有针对性的选作期中的5-8个,进而分配相关的课时。实践证明:在标准课时之内,只有30%的学生能够完成一个完整的项目,但是90%的学生能够利用课后的时间积极的查阅资料和咨询老师,这种授课方法对学生的主动学习起到了一个积极的推动作用,并且学生愿意牺牲课后休息的时间泡在图书馆。
3.具体项目实施过程
下面以“通讯录信息管理系统”为例,阐述在《数据结构》课程中实施项目驱动教学法的过程。
3.1 项目名称:通讯录管理系统。
3.2 培养目标:第一,使学生掌握线性结构的特点、线性结构的表现形式。第二,使学生领会数据在计算机中存储的概念,并掌握两种重要的存储形式。第三,掌(下转第179页)(上接第171页)握线性表和链表的区别,能够根据实际情况选择不同的存储结构。第四,能够对实施的算法进行性能评价。
3.3 项目预备知识:C语言编程基础、线性表的定义、线性表的存储结构、线性表的创建、线性表中元素的查找、插入、删除、修改等操作。
3.4 项目延伸知识:线性表中元素的排列(按照某种规则进行排序)。
3.5 项目的功能描述:该系统是普通的电话通讯录管理系统,要求实现能够根据姓名或者电话号码查询一个用户,能够实现对新用户的添加操作和删除一个用户,能够统计出该通讯录中的用户总数。比如:用户有一个电话号码,但不知道此电话号码是谁的,则需要输入号码来查询该号码是不是此通讯录中已记录的人的号码,若是可以输出该号码及姓名,若不是可以输出“无记录”。同学们在此基础上发挥想象力,结合实际可以扩展更多的功能。
3.6 项目实施步骤:
(1)根据学生的特长进行团队划分。按照一个班级35人的标准,我们将学生分成5-6个团队,每个团队在5-6人,然后推荐一名队长。
(2)教师开始下发项目书,要求每一个团队根据项目书撰写项目的可行性报告,每个团队以文字的形式上交一份报告,在此期间至少要保证每个团队的队长明白项目的完成目标,然后由队长写出项目过程的具体划分和阶段性成果。
(3)教师要不间断的引导,当完成项目的可行性报告之后,每个团队就开始查找资料和相互讨论,教师在旁边起到一个引导和监督的作用,对于学生普遍问及的问题可以进行统一解答。教师有目的的讲课,学生有目的的听课,所以实现了共赢的局面。
(4)教师总结阶段,每个项目完成之前,教师要对各个团队的成果进行演示和评价,指出每个团队的不足之处。
(5)学生整改阶段,学生根据教师的评价,完善自己的不足,然后形成阶段性课程设计报告。
4.《数据结构》课程的考核形式及评价
《数据结构》课程不同于其他的专业课,该课程中所设计到的算法和思想具有可收缩性,它应强调对于问题求解能力的培养,我们需要在学生的课程设计过程中,鼓励学生对其解决问题的方案进行理论分析和实验分析,鼓励学生积极主动的创新并大胆提出优化设计方案。对于该课程的考核形式是让学生根据自己平时的课程项目,将项目整理成课程设计报告,最终上交纸质的课程设计报告书,然后教师对报告进行评价。
考虑到《数据结构》这类课程一直以来是计算机相关专业学生学历层次提升考试的重要专业课,在进行课程考核的时候,有些学校除了让学生形成最终的课程设计报告书之外,还让学生参加一次笔试考试,以了解学生对于基础知识的掌握水平。
采用了项目驱动+课程设计的教学模式以后,学生普遍反映对数据结构的学习非常感兴趣,老师们则感觉采用这种方式以后,学生的学习积极性提高了,但是同时老师们的教学压力也变得大了,因为增加了老师准备课堂的负担,但是总体感觉是利大于弊的。
5.实施项目教学法的总结与展望
通过《数据结构》教学中实施项目驱动教学法,我体会到项目教学在专业基础课中实施的必要性,当然该教学方法也不是万能的,它不是适合于所有的课程,通常来讲:这种教学方法比较适合实践操作性强,学科比较综合的课程,同时,我有如下几点体会:
(1)项目教学法重要的是项目的设计,它可能直接影响教学的效果。在进行项目设计时,我们需要考虑学生对项目的理解、项目包括的知识点的范围、课程的前驱后继关系等,否则,我们设计的项目将是没有意义的。
《数据结构》课程是高职计算机专业重要的专业基础课。该课程通过学习程序设计中常用的基础数据结构,介绍一些重要的程序设计思想,提高学生的逻辑思维能力和编程技能,培养学生的分析问题、建模与解决问题能力。同时,该课程的学习内容能够促进学生对后继课程的学习内容的理解。例如,高级编程语言C#或Java中有一些库函数实现了对集合元素排序的功能。而这些功能正是以数据结构课中介绍的排序算法为基础的。
根据我们多年的教学经验,在高职计算机专业的课程体系中,数据结构普遍被学生认为是比较困难的一门课程。造成困难的原因大致有以下几个。首先,由于高职计算机专业学生就业的特点,决定了高职学生很少从事基础和底层程序设计,或者从事与数据结构以及程序设计相关的理论研究。因此,数据结构课的学习内容在工作中直接应用的机会很少。这导致部分学生甚至教师对学习数据结构课的必要性存在疑惑,对该课程重视程度不足。其次,数据结构课的概念和算法抽象,理论性强,对学生逻辑思维能力要求高,学习的门槛较高。最后,高职学院学制较短,导致一学期内的专业课程密度高,学生学习时间不足。
现有的高职教材或本科应用型教材例如参考文献[1-4]的内容编排,多沿袭自传统本科数据结构课。一般依线性结构,树结构和图结构的顺序编排,逐次介绍各种数据结构,给出其定义,详细介绍其物理存储结构和基本性质,并穿插其应用的一些例子。其覆盖的知识面广,内容和体系较为完整,条理清晰。但是由于高职计算机专业数据结构课程学时较少,其专业学习的实践性强,学生逻辑思维能力稍弱等特点,这种沿袭自本科教学的授课内容组织方式不完全适合高职学生。虽然针对课时偏少的情况,一般高职课本会对本科课本作一些删减或简化,但其内容构成仍没有本质上的改变。因此,课程内容的选择、组织与编排增加了高职学生学习数据结构课的难度,而未能解决上述造成困难的几个问题。
我们认为,数据结构课程能够训练学生的逻辑思维能力,促进学生深入理解与专业相关的基本编程思想,且其内容与多门后继专业课程相关,因此对计算机专业的学生而言,学习数据结构课的必要性毋庸置疑。而针对高职教育学时少,实践性强的特点,对课程大纲、课程标准、教学内容和教学方式进行改革,使得高职学生能够更好地学习该门课程,改进学习体验,改善学习效果,则势在必行。数据结构课的改革,结合当前高职教育改革的方向,在课程设计方面应该以突出能力培养,以项目为载体,以任务训练岗位职业能力,以及知识理论实践一体化为原则[5-6]。
本文总结了我们在高职计算机专业数据结构课上进行的教学设计改革。我们在课程中引入任务驱动教学方式,设计若干项目供学生在课堂上练习,以项目覆盖课程的各知识点,通过项目引入相关的概念,并作讲解。在课堂教学方式上,以解决问题,完成项目代替抽象的理论教学。由于避免了繁琐的基本概念讲解,缩短了理论教学用时,学生能够投入更多的时间与精力到编程实践练习。而通过练习,能够更好地理解抽象的概念。我们的课程改革,应用于计算机应用专业两届学生的教学实践中,取得了良好的效果。
2 教学项目设计实例
数据结构课程的主要内容大致可以分为三部分,即线性结构、树结构和图结构。其中,线性结构包含了几种重要的数据结构,如栈、队列、数组和串等。树结构的内容一般以最常用的二叉树结构为主。图结构是最为复杂的结构,涉及算法的内容比较多,如图的最短路径算法,图的最小生成树算法和图的连通分支算法等。除此以外,课程还包括查找和排序算法等重要内容,这两类算法同时涉及线性结构和树结构。通常还会介绍递归、指针等重要的编程思想和内容。
我们的教学项目设计思路,是选取相对简单而具有代表性的算法题目,结合一些应用的背景,构成我们的项目,内容力求覆盖基础的数据结构,如线性结构、队列、栈和二叉树等。学生通过完成项目中的一个个任务来学习数据结构的抽象概念。有些方向内容丰富,我们从中选取少量相对简单,然而具备代表性的例子作为任务,使得学生更易上手,尽快建立对一些抽象概念的认知。例如查找和排序操作既可以在线性结构上,也可以在树结构上进行。但我们不考虑树结构,仅仅以线性结构上的问题组成我们项目。又如从图结构的多个算法求解问题中,我们选取容易理解的连通分支求解算法作为教学项目。
作者从事高职计算机应用专业的数据结构课教学。该课程的学时大约为4学时×16周,一般在一年级第二学期开设。根据课时和学生的具体情况,我们在一学期的课程中为学生设计三至四个项目,并主要以学生完成项目的情况作为学期总评的依据。以下以我们为2014级学生设计的项目为例,对课程教学项目设计作一个详细介绍。
我们一共设计了四个项目,具体如下。
迷宫:以一个n×m的{0,1}-矩阵表示一个迷宫。其中,0表示可以通行,1表示有障碍,左上角和右下角均为0,分别表示入口与出口。编写程序判断此迷宫是否存在一条从入口到出口的路径,如存在则输出该路径。
二叉树的构造和遍历:对教师以绘图形式给定的一棵二叉树,编写程序构造该二叉树并输出该二叉树的前序、中序和后序遍历的结果。可以结合一个具体应用进行教学。例如,可采用二叉树的一个典型应用,即表达式的几种表示法。教师输入一个表达式,学生根据其建立一个二叉树,并通过三种遍历方式输出表达式的波兰表示法,逆波兰表示法和中缀表示法。
(1) 查找和排序:对教师给定的一个有序整数序列,编写程序接收用户输入的一个整数,使用二分查找法在序列中查找该整数。对教师给定的一个无序的整数集合,使用插入排序、冒泡排序和选择排序中的至少两种为该集合排序。此问题的一个典型的应用情景是学生的考试分数排序。
(2) 图的连通分支:某班级有n位同学。现组织外出旅游,并拟将全班同学分成若干小组集体行动。现在给定一个图表示本班同学之间的朋友关系。其中以结点表示同学,且若两位同学为朋友关系,则对应的两个结点以边连接。请根据朋友关系将全班同学分成若干个小组,使得有朋友关系的两位同学在都同一个小组中。此题目等价于求朋友关系拓扑图的最大连通分支。
可以看到,这四个项目均具有丰富的理论意义和具体的应用背景。它们覆盖了现有数据结构课本的大部分知识点。表1中列出了数据结构课的大部分知识点以及它们被各个项目覆盖的情况。课程中常见的数据结构,除了串以外,大部分为我们设计的项目所覆盖。同时我们的项目还覆盖了递归,指针,广度优先搜索和深度优先搜索等重要的程序设计思想。
为了引导学生分步完成练习,我们还为比较困难的项目设定预备任务。预备任务不同于一般的习题。它们有一定的独立性,可以提出来作为一个习题,但是又与我们的项目有机地结合在一起,可以认为是相关项目的一项任务。
对于迷宫问题,我们设定以下两个预备任务。
(1.1)写一个栈结构处理程序。每一个栈元素是含有3个整数(这里规定栈元素由3个整数组成,是为了迷宫项目做准备,见下文)的一个结构体。写出栈的初始化,入栈,出栈和判断栈空的操作。在main函数里面建立一个这样的栈,测试它。比如说,入栈若干个元素,例如 (1,1,0) 和 (2,2,0) ,然后出栈,并依照出栈顺序打印这些元素。
(1.2)围障。给定一个以n×m矩阵表示的迷宫,用全一把原迷宫包围起来,创建出一个新的 (n+2)×(m+2) 迷宫。打印出新的迷宫。
迷宫问题采用栈结构存储回溯的结点,每一个栈元素存储迷宫内一个结点的x、y坐标和回到该结点以后下一个可以探索的方向,共3个整数。第一个任务栈处理程序既是一个线性表的练习,也为迷宫问题准备好要使用的栈。我们允许迷宫第一行、最后一行、第一列和最后一列除了出、入口以外,还有其他0元素。但是这些0元素实际上不是在所有的方向上都可以通行。在第二个任务中,我们在迷宫四边添加全1,称之为围障,围障能够使得迷宫求解程序中的一些条件判断大为简化。该任务可以看成一个矩阵练习,并为我们即将探索的迷宫作了初始化。
对于图的连通分支问题,我们也设定了两个预备任务。
(4.1)图的表示。用矩阵表示教师用绘制方式给定的图,并在屏幕上打印出图的结点和边。具体内容包括定义和初始化一个矩阵,表示一个图,输出图的结点列表和图的边的列表。其中,图的结点以数字0,…,n-1 编号,图的每一条边以 (x,y) 的形式表示,x和y是边的两个端点的编号。
(4.2)队列的操作。编程实现一个整数队列的初始化,入队和出队的操作。程序里面定义和初始化一个整数队列;然后入队至少三个元素,按顺序打印出队列里面的所有元素;再出队至少两个元素,又按顺序打印出队列里面的所有元素。
第一个练习非常基本。它完成图在程序中的表示,学生学会把一个图转换为一个矩阵,同时从矩阵中读取出图的顶点和边。第二个练习是为了对图作广度优先遍历时使用队列结构作准备,同时也是一个线性表的练习。
3 教学内容的组织与课堂教学实践
依授课时间顺序,我们的教学内容组织为
一、线性结构;
二、预备任务(1.1)和(4.2):队列和栈;
三、项目(1)迷宫问题,包括预备任务(1.2);
四、树结构;
五、项目(2)二叉树遍历;
六、项目(3)查找和排序;
七、图结构;
八、项目(4)图的连通分支,包括预备任务(4.1)。
教学内容的组织以线性结构、树结构到图结构为主线索。
在线性结构部分,对线性表的基本概念作一些介绍后,我们布置预备任务(1.1)和(4.2),通过这两个练习介绍栈和队列的概念。同时,向学生介绍项目(1)迷宫问题和项目(4)图的连通分支,并说明预备任务(1.1)和(4.2)跟这两个项目的关系。在完成了预备任务(1.1)和(4.2)以后,布置项目(1)迷宫问题。迷宫求解问题的讲解,重点要解释清楚深度优先搜索的思想。
接下来是树结构的内容。我们介绍树结构相关的一些概念和重要性质。然后布置项目(2)二叉树遍历。二叉树遍历有先序、中序和后序三种方式。除了树结构内容,我们以递归方式实现二叉树遍历程序,通过这个项目向学生介绍递归思想。所以,此项目教学的重点之一是讲解递归的原理。教师可实现其中一种遍历方式作为例子,而让学生完成其他形式的遍历。如前所述,为了帮助学生更好理解二叉树的思想,可结合二叉树的典型应用,即表达式的三种不同表示方法来讲解。
随后的内容是线性表的查找和排序。完成项目(3)查找和排序方法。其中,查找算法以线性表的二分查找为例,讲解的时候我们与顺序查找作对比。二分查找必须应用于有序数组,而对于无序的数据则只能采用顺序查找,这说明了数据结构对算法设计的影响。
排序算法种类繁多([7]),其中部分高效算法的时间复杂度能够达到O(nlogn)。但是这些算法对学生而言有相当难度,我们仅选取时间复杂度达到O(n2),而实现思路相对简单的几种算法作为项目的内容,教师可以在课堂上部分或全部实现要求的排序算法,然后让学生再重新自行完成。
最后是图结构部分。我们首先介绍一些和图相关的概念和基本性质。然后以(4)求图的连通分支为教学项目。项目(4)直接以一个实际问题的形式提出,揭示出图算法的强烈应用背景。在求解算法中,我们要求学生掌握使用广度优先搜索来访问图的结点。广度优先搜索的实现需要以队列作为待搜索结点的存储结构。因此,项目又结合队列的设计、实现与应用进行。有助于对理解线性表的相关知识,掌握其应用。
摘要:针对计算机类本科专业数据结构课程与Java面向对象程序设计课程之间的衔接问题,分析数据结构中集合、线性表、树和图等知识点与Java Collections框架之间的映射关系,提出按照数据结构中学生建立的知识体系组织Collections框架的教学,说明面向数据结构知识体系的Java课程教学实施方法。
关键词 :数据结构;Java;Collections框架;课程衔接
文章编号:1672-5913(2015)15-0082-03
中图分类号:G642
基金项目:河北省精品课程建设项目“数据结构”。
作者简介:董东,男,副教授,研究方向为数据挖掘及应用,dongdong@hebtu.edu.cn。
0 引 言
数据结构是计算机类本科专业核心课程之一,其后继课Java面向对象程序设计也是重要的专业课程之一。通过对数据结构的学习,学生初步掌握了为实现问题求解所需要的基本逻辑结构、存储结构和常见的算法。Java面向对象程序设计则从面向对象程序设计的范式出发,试图使学生理解如何通过对象以及对象间的通信实现问题求解。在Java教学实践中,我们发现存在如下两个问题:①学生无法直接感受到数据结构与Java面向对象程序设计之间的关系,体会不了数据结构的重要性,无法体验选择合适的数据结构和算法对实现问题求解的成就感。②由于JDK开发的历史原因,Java JDK中提供的数据结构与算法的实现并没有与数据结构课程具有对应关系。例如,在Java中,队列(Queue)和线性表( List)都是Collection的子接口,而数据结构认为队列是一种特殊的线性表。
根据在教学中发现的这些问题,我们在Java Collection框架部分的讲授中采取了如下措施:①按照数据结构中学生建立的知识体系组织Collection、Set、List、Queue、Stack等内容的讲授,而不是按照Java API中的继承关系来介绍。②在课程设计实践环节,通过“先动手写自己的算法实现”,然后“阅读并分析JDK相关算法源代码”,通过对照,使学生发现自己在程序设计方面的不足,从而得到在数据结构课程中所学知识的应用体验。
1 JDK中的数据结构
数据结构是数据元素之间的关系。从概念和实现两个角度,可将数据结构分为数据的逻辑结构和数据的存储结构。按照数据元素之间前驱和后继关系来分,数据的逻辑结构可分为以下4种:集合( Set)、线性表(List)、树(Tree)和图(Graph)。数据的存储结构主要包括数据元素本身的存储以及数据元素之间关系表示。数据元素之间的关系在计算机中主要有两种不同的表示方法:顺序映像和非顺序映像,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。
Java JDK为常用的数据结构定义了一些接口( Interface)和实现(Implementation)。这些接口、实现类以及常用的排序、查找等算法统称为JavaCollections框架(Java Collections Framework).Collections框架的设计目的是要满足如下目标:高性能、一致性、扩展性和轻松编程。Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用即可‘3]。Java中把一组对象称为Collection,也就是说,Collection是对象的容器。Java对Collection中的对象没有任何前驱、后继以及重复性的约束,只是约束了对象类型E。
Collection接口定义了其上的3类操作:针对单个元素的基本操作、迭代器和Collection对象之间的批量操作。基本操作包括增加、删除、判断是否包含某个元素、判断是否为空、容器中当前元素的个数、清空等。批量操作包括:合并两个Collection容器、从一个容器中移走一些元素、保留两个容器中相同的元素、判断一个容器中的元素是否完全包含在另外一个容器中等。
接口Collection<E>的子接口有Set<E>和List<E>。集合(Set)在Collection的基础之上增加了“不允许重复元素”的约束;而List则在Collection基础之上增加了“元素之间具有前驱、后继关系”的约束:除了第一个元素外,所有元素具有唯一的前驱;除了最后一个元素外,所有元素具有唯一后继。
如果仅关心数据元素是否出现,而不关心数据元素之间的次序,则应使用Set<E>。Java为集合接口提供了两个基本的实现:HashSet<E>和Tree<Set>。HashSet<E>是Set<E>接口的典型实现,大多使用集合的场合就是使用这个实现类。HashSet实现类按哈希算法来存储集合中的元素,因此具有很好的查找性能。HashSet不能记忆元素之间的顺序,包括插入顺序。其子类LinkedHashSet<E>也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使得能够记忆插入顺序。由于LinkedHashSet需要维护元素的插入顺序,所以性能略低于HashSet,但遍历集合里的全部元素性能较好。
实现类TreeSet<E>可以确保集合元素处于排序状态,TreeSet并不是根据元素的插入顺序进行排序,而是根据元素的实际值来进行排序的。TreeSet采用红黑树的数据结构对元素进行排序,并要求添加进TreeSet中的对象必须实现CompareTo<E>接口。
List<E>接口作为Collection<E>接口的子接口,可以使用Collection接口中的全部方法。但是List接口中定义了元素位置和元素范围的概念,使得List可以根据元素位置索引(index)来插入、替换、删除集合元素以及查找指定对象的位置。ArrayList<E>实现类基于数组实现了List接口,其内部封装了一个动态再分配的数组。每个ArrayList对象都有一个capacity属性,这个属性表示它们所封装的数组的长度,当添加元素超过长度时,capacity会自动增长,其默认值为10。LinkedList<E>内部以链表来保存集合中的元素,因此随机访问容器时的性能较差,但在插入、删除元素时性能较好。
Queue<E>接口用于定义队列这种数据结构,队列是“先进先出”的容器,通常不允许随机访问其中的元素。Java中的队列接口Queue<E>没有继承List接口,而是直接继承了Collection接口。如果使用具有固定容量的队列,则应使用offer()来加入元素,使用poll()来获取并移出元素,因为add()和remove()方法在因容量原因失败时抛出异常。如果只是访问队首而不移出该元素,使用element()或者peek()方法。LinkedList<E>类实现了Queue<E>接口,因此我们可以把LinkedList当成Queue来用。PriorityQueue是一个比较标准的队列实现类,它并不是按加入队列的顺序,而是按队列元素的大小来记忆队列元素的顺序。因此当调用peek方法或者poll方法来取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。
Stack<E>实现了List<E>接口,提供了push和pop操作限制线性表中元素的插入和删除只能在线性表的同一端进行。JDK l.6引入的ArrayDequ<E>实现类被优先推荐作为栈使用。ArrayDeque<E>实现了Deque<E>接口。Deque<E>接口定义了双端队列,双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
Java JDK中没有直接提供树和图的接口和实现类,但是可以通过研究TreeMap的源代码学习操作树的一般编写模式。综上,数据结构与Java面向对象程序设计两门课程内容的衔接见表1。
2 面向数据结构衔接的java课程实施方案
Java面向对象程序设计为1学期的课程。总课时为讲授54学时、实验32学时。其中,与数据结构知识点紧密相关的Java Collections框架部分为讲授6学时、实验4学时。在讲授环节,按照表1列出的顺序进行。在实验环节完成与授课内容相关的验证性实验。在课程设计实践环节,要求学生使用Java设计常见算法,然后阅读JDK提供的源代码进行对照。具体方案如图1所示。
比如,在java.util.Collections类中提供了数据结构中学生已经学过的常见算法,如二分查找、计算元素频数、查找最大/最小元素、反转线性表、按照指定距离旋转线性表、随机排列线性表、交换指定位置上的两个元素以及排序等。注意,在Java 6中Collections.sort()使用的是MergeSort;而在Java 7中,内部实现换成了TimSort。
要求学生按照这些API文档说明,首先按照数据结构课程中的知识设计自己的算法实现,然后与API源代码进行比较。由于学生使用C语言版的数据结构教材,所以在面向Collection编程之前,作为过渡,先让学生面向数组编程。
哈希表是一种重要的数据结构,也是实现集合的基本途径之一。通过研究HashSet的源代码,可以让学生理解为什么每个对象都要有hashcode()方法,以及哈希表的编码特点。由于HashSet的实现是基于HashMap的,所以研究HashSet就要研究HashMap。
Map是一种典型的名值对类型,它提供一种Key-Value对应保存的数据结构。客户程序通过Key值来访问对应的Value,这个接口并没有继承Collection这接口;而其他的类或者接口,不管是List、Set、Stack等都继承或实现了Collection。
TreeMap和HashMap算是Java集合类里面比较有难度的数据结构。HashMap元素存取的时间复杂度一般是O(l),而TreeMap内部对元素的操作复杂度为O(logn)。TreeMap记忆了顺序,TreeSet内部的实现使用了TreeMap。
3 结语
数据结构与程序类课程的关系问题愈来愈引起关注,我们提出面向数据结构知识体系的Java课程教学与数据结构课程的衔接方案。这个教学方案已经在河北师范大学本科计算机专业实施三届,取得了较好的效果,学生对算法的理解加深了,解决问题的自信心增强了,也建立了工程意识。
参考文献:
[1]教育部高等学校计算机科学与技术教学指导委员会,高等学校计算机科学与技术专业公共核心知识体系与课程[M].北京:清华大学出版社,2008: 110-111
[2]严蔚敏,吴伟民,数据结构(C语言版)[M].北京:清华大学出版社,1997: 5-7.
[3]扎克霍尔.Java语言导学[M].北京:人民邮电出版社,2008: 293-294.
[4]沈华.数据结构、算法和程序之间关系的探讨[J].计算机教育,2013(4): 58-61.
[中图分类号] G642 [文献标识码] A [文章编号] 2095-3437(2017)03-0029-02
数据结构课程是计算机类专业的核心必修课程,在整个专业教学体系中占有重要地位。数据结构课程的教学内容涉及构筑计算机求解问题的两大基石:刻画实际问题中信息及其关系的数据结构,描述问题解决方案的算法。[1]数据结构课程的教学目标是培养学生缜密的逻辑思维能力和数据抽象能力,把数据结构和算法理论与编程实践相结合,并在软件系统开发过程中灵活运用。学好数据结构课程对操作系统、编译原理、计算机网络等后续课程的学习以及培养学生分析问题、解决问题的能力等方面起着至关重要的作用。如何讲好数据结构课程,一直是各高校计算机教师研究探索的热门课题。俗话说“好的开端是成功的一半”,第一堂课的教学设计至关重要。好的开端能激发学生对课程的兴趣,调动学生的学习积极性,使其产生强烈的求知欲,从“要我学”变为“我要学”,从而为教师有序、有效展开课程教学奠定良好的基础。[2]
本文从以下几个方面具体讨论如何上好数据结构第一堂课。
一、教师自我介绍
教师给学生的第一印象很重要。第一堂课教师第一次接触学生,自我介绍必不可少。自我介绍的内容主要包括介绍教师的姓名、学院、办公地点、移动电话等,可以把微信、QQ或E?鄄mail等其他联系方式告诉学生,还可以组建数据结构课程学习的QQ群或微信群,学生遇到问题后可以在群里讨论,也可以通过电话、E?鄄mail等与教师单独联系。教师愿意做学生的朋友,学生在学习上、生活上、思想上需要教师帮助时,可及时与教师联系。教师的积极态度能够对学生产生积极的影响,有助于与学生建立良好的师生关系,促进学生学习的自觉性。
二、课程介绍
(一)课程定位
数据结构课程是计算机类专业的核心必修课程,美国ACM/IEEE CC-2005课程体系将数据结构与算法类课程列为核心课程之首。我国教育部计算机教育指导委员会“计算机科学与技术专业规范”2006中明确把数据结构与算法列入计算机及信息技术相关学科专业的本科必修基础课程。
数据结构课程是对前导课程(如C语言程序设计、程序设计基础等)的深入和扩展,能为进一步学习其他专业课程打下基础。课程中的排序算法及基本的树、图等非线性结构是计算机科学的基本功,B+树、散列(Hash)等高级数据结构是后续如操作系统、数据库、编译原理、图形图像等专业课程的基础。
(二)主要内容
数据结构课程描述的是按照一定逻辑关系组织起来的待处理数据元素的表示及相关操作,涉及数据的逻辑结构、数据的存储结构和数据的运算,内容非常丰富。
常见的逻辑关系包括线性结构、树形结构、图结构和文件结构。常见的存储方法有顺序方法、链式方法、索引方法和散列方法。建立在数据结构之上的有效运算是问题求解的核心,如排序、检索等。在介绍课程内容时,应把相应章节的学时分配一并列表展示,并简明扼要地向学生介绍课程的重点难点,借助多媒体课件以动画的形式给学生演示链表、栈、队列以及排序等操作,帮助学生理解,激发学生的学习兴趣。
(三)学习目标
数据结构课程的教学目标是让学生学会分析数据对象的特征,掌握数据组织方法和计算机的表示方法,初步掌握算法时间、空间分析的技巧,培养学生针对问题的应用背景进行分析,选择合适的数据结构,从而培养高级程序设计技能。学生的学习目标明确了,才会不懈努力,朝着目标一直前行。
(四)教材及参考书
教材是供教学用的资料,如课本、讲义等。第一堂课应明确数据结构课程的教材,简要介绍教材的特点、作者信息等,比如我们采用的是严蔚编、清华大学出版社出版的《数据结构》。同时给学生们列出一些必要的参考书籍,这对课程学习能起到补充拓展的作用。
三、学习方法指导
在学生了解数据结构课程的重要性、所用教材及参考资料后,就要告诉学生如何去做才能学好这门课程。数据结构课程要培养学生结合实际应用设计有效算法和数据结构的能力,学习数据结构必须经过大量的践,在实践中体会构造性思维方法,掌握数据组织与程序设计的技术。通过扎实的、大量的基础训练,学生才能灵活地运用问题抽象、数据抽象、算法抽象来分析问题,应用数据结构和算法来设计、实现相应的程序,完成创新能力和实践能力的训练。[3]
(一)课前预习,课后总结,吃透教材
课程内容主要包含数据结构和算法设计与分析的基本知识,各种基本数据结构的定义、存储结构、相应的算法以及应用等。理解掌握基本的数据结构与算法的关系很重要。程序的时间和空间效率,不仅与数据的组织方式有关系,也跟算法设计的巧妙程度有关系。在学习中要把握好预习、听课、实验、复习、总结五个环节,吃透教材,把握住算法的本质。通过预习,可以提高学生的主体意识,培养学生的独立思考能力,进而提高课堂学习效率。课后的总结则能让学生自觉地回顾课堂内容,深入地学习和领会课程的重点和难点,完成课后作业或练习题,从而提高数据结构课程的教学效果。
(二)多读代码,实现算法,理解思路
教育部计算机专业教育指导委员会“中国计算机本科专业发展战略研究报告”、“计算机科学与技术专业规范”等都明确地强调了实践教学和学生动手能力培养的重要性。程序设计解决问题往往有多种方法,且不同方法之间的效率可能相差甚远。在学习过程中要让学生摆脱畏难情绪,不怕有问题,多读、多写、多调试,及时总结。学生只有通过丰富的练习题和应用案例才能增强对理论的感性认识,从而明白这些数据结构为什么存在以及在什么情况下可以最好地解决什么样的问题。
(三)充分利用网络资源进行课外拓展
1.图书馆资源
图书馆拥有丰富的文献资源,是学校的文献信息资源中心,也是学生的第二课堂。学校图书馆有丰富的藏书,通过网上书目查询系统可以检索到与数据结构课程有关的图书,如《数据结构典型题解》、《数据结构上机实验指导》等。图书馆还有各种文献数据库,如超星数字图书馆,可以在线阅读电子图书;有万方、中国知网(CNKI)、维普等数据库,可以查阅期刊、会议等学术论文。在课堂上教师可以演示利用图书馆中的中国知网(CNKI)检索系统检索相关论文,让学生学会检索查找文献资源,这样可以拓展学习资料,避免课程学习仅限教材的情况。多读书,可以让学生扩大视野,打开思路,培养和锻炼学生自主学习的能力。
2.课程资料及论坛
互联网是信息和传播的重要平台。网络资源包罗万象且更新及时,使用方便,不受时间的限制,其中涉及数据结构的教学资料、技术论坛等数不胜数。课程资源主要有国家精品课程资源网、MOOC学院、中国大学MOOC、学堂在线,以及国外MIT等开设的数据结构相关课程。而与数据结构相关的论坛则更多,比较突出的如CSDN论坛的数据结构与算法版块、ITeye综合技术论坛的数据结构版块等。[4][5]在介绍课程资源及论坛的同时,教师可以简单介绍百度或必应搜索引擎的用法,让学生掌握利用搜索引擎查找相关资料的技能。
四、结语
在高校的课堂里,大学生要接触不同门类的学科。教师在引导学生学习过程中能起到关键的作用。第一堂课既是师生之间的初次见面,也是大学生对教师及课程的初步了解与把握。良好的开端是课程成功的基础,上好第一堂课,意义重大。对教师而言,上好第一堂课,会使学生对该门课程产生首因效应,在课程的兴趣、理解、运用等方面产生积极影响,可以使教师对学生加深了解认识,有助于教师对教学安排进行合理配置,为今后的课程教学奠定良好的基础。对学生而言,上好第一堂课可以使学生对课程内容有一个全面的认识,提升学生对课程的认同感,提高学生的学习积极性。
[ 参 考 文 献 ]
[1] 张铭,耿国华,陈卫卫,等.数据结构与算法课程教学实施方案[J].中国大学教学,2011(3):56-60.
[2] 张永翊.上好大学里的第一堂课[J].中国成人教育,2008(20):131-132.
关键词:研究型教学;实验教学;智力能力培养;教学方法;数据结构
社会的发展对当前我国高等教育提出了具体的要求,所培养的学生必须具备全面发展的素质,包括掌握科学的学习方法和具有会学习的本领,具备积极创新的能力和生动活泼的特征。这一特征,使得高校教育改革应该不断地向更高、更深刻、更全面的层次上发展。教学改革是教育改革中最为重要的一部分。如何创造良好的学习环境和条件,革新教学手段和方法,全方位地培养学生的智力和能力,关键是要转变教育观念,改革人才培养模式,改进教师的教学方式,增强学生学生的学习的主观能动性,积极采取启发式、研讨式等研究型教学方式。
但是在高等教育过程中对研究型教学的认识程度还不够高,开展的深度与广度都还不够,从而成为制约教学质量进一步提高的一个瓶颈而引起了各高校的普遍关注。本文结合我们开展研究型教学的实践,对《数据结构》课程的实验教学改革进行了一定的尝试,取得了初步的教学效果。
一、研究型课程教学的基本理念
国内研究型教学的实践,一方面是对国外先进教育方式的借鉴,另一方面也是对国内实施已久的高校学习与科技兴趣小组活动乃至启发式、讨论式、发现法教学方式等经验的系统提升。
1、赫尔巴特“主知主义”课程理论。赫尔巴特的课程理论被称为“主知主义”,它是以知识作用为本位的课程论,同时还明确主张学生从总体上对教师保持被动状态,强调教师的权威意志和主导责任。因而,人们把赫尔巴特视为“教师权威论”或“教师中心论”的代表人物。
2、杜威的“实用主义”课程。杜威主张教育要“以学生为中心”,要求教育的一切措施围绕着学生来组织,以促进学生的个性发展。他认为学生的学习不应是被动接受知识的过程,而类似科学家研究发现知识的主动探究过程。杜威的教育思想深刻地影响了20世纪初至当代的全部教学论的发展。教育家陶行知先生是杜威的学生,他将社威的教育思想引入我国,并在国内进行了卓有成效的教学实践,创立了“知行统一”的课程理论,至今对我国教育界仍产生着深刻影响。
3、研究型课程理念。研究型课程教学的基本理念是:对历史上传统的教育学派的“主知主义”、“教师中心论”和进步教育学派的“实用主义”、“学生中心论”中合理的部分加以有机的整合,扬弃其狭隘、刻板僵化的部分,注重发挥教师的主导责任和学生的主体作用。它以促进学生的个性发展为宗旨,以改变学生单纯地、被动地接受知识传授的学习方式为着眼点,构建一种开放的学习环境,为学生提供一个多渠道获取知识,理解自然、个人、社会等问题,并将学到的知识综合应用于实践的机会。它在帮助学生进行接受式间接学习的同时,形成一种对知识的主动式直接探索,以提高其解决实际问题的能力的研究型学习形式。
二、研究型课程教学的指导思想和教学原则
《数据结构》实验教学是一种验证型的教学模式,将课堂上所学的理论知识与计算机上机实践相结合,通过利用高级语言环境对书本上的算法进行验证,从而达到巩固理论知识的目的。而研究型实验教学的指导思想,不仅仅在于验证书本知识和巩固理论知识,而是更加重视理论知识的综合应用,强调整个过程的参与和学习,发挥学生学习的主动性,激发学生的学习兴趣和创造力,培养学生的团队精神和协作意识。因此,全面培养学生的智力和能力,是研究型实验教学的指导思想。
在上述教学思想指导下,在实验教学过程中必须坚持的教学原则是:
1、教师指导与学生动手并重。虽然有效快捷的学习离不开教师的指导,但指导只是一种手段。在现代教学过程中,教师的指导旨在教会学生学会学习,这不仅是今后终身教育的要求,而且只有学会学习,掌握了科学的学习方法,学习主体才会真正具有一种参与到教学过程中去的能力。
2、面向结果的教学和面向过程的教学并重。面向结果的教学是指教师在教学活动中以使学生获得令人满意的结论作为教学的直接意义,它是传统教学所强调的教学形式。面向过程的教学则是教师在教学活动中重视引导学生对知识形成过程的理解与实践,并在理解和实践中仔细体验获得这一知识的基础和条件,以及它与其他知识的相互关系等。从主动学习的角度看,面向过程的教学会给学生主体带来一种更高的价值。
3、一般能力的培养与创造品质的形成并重。学生能力的培养已成为现代教育的重心,然而在促进学生的一般能力有较全面提高的同时,教师应该对学生的创造能力的发展给予特别关注,因为创造品质已成为现代人素质结构中最重要的组成部分。
4、理论学习与实践活动并重。理论来源于实践,反过来又指导实践。只有坚持理论联系实际,才能有所发现,有所创造。
5、接受式学习与探究式学习并重。接受式学习是一种被动的学习过程,而探究式学习则是一种主动的学习过程,只有发挥了学生主体的积极性,才能使得学习收到事半功倍的效果。近年来,我们对《数据结构》实验教学的研究型教学模式的探究,正是坚持了以上这些教学原则。
三、研究型《数据结构》实验教学环节的设计与实施
研究型教学依据其内容的不同可分为认知理解类和实践应用类。研究型《数据结构》实验教学属于实践应用类。主要凭借算法构造思维方式,从具体操作规范入手,通过操作过程的构造实施,解决特定问题,理解、习惯、掌握算法思维方法是一个构造性、研究型方式的训练过程,其核心内容就是通过学习结构技术的过程,培养学生算法设计能力以及创造性思维,培养举一反三、触类旁通的能力,以达到提高学生应用知识解决复杂问题的素质能力和的目标。计算机的程序设计是一项创造性的智力劳动,让学生深刻掌握这一套算法构造思维方法,是实践环节所要解决的核心问题。因此,我们注重为学生创设智力发展的环境与条件,设置智力因素和非智力因素相结合的条件。我们根据研究型《数据结构》实验教学的指导思想和教学原则,考虑到培养计划的安排,我们对每一次实验课都进行了精心地策划,并要求写出实验报告。主要分为确立问题阶段、实践体验阶段和成果交流阶段等三个阶段来进行。这三个阶段并不截然分开,而是相互交叉推进的。实施流程通常为:“引出问题,建立假设”——“研讨探究,验证假设”——“得出结论,切磋交流”——“归纳总结,形成评价”。
⑴确立问题阶段。教师介绍上机环境及算法在相应数据结构中的地位和作用,包括使用的编程环境,在验证算法过程中需要注意的问题,讲解如何查找相关资料,并展示历届学生的实验报告样本。学生3—4人自由组合成立研究课题小组,选出组长;通过查找相关资料,扩展相关算法,提出研究课题,写出实施计划。在此基础上,教师组织各小组进行答辩,组长对研究课题的目的、背景资料、理论依据、技术方法、计划和目标等进行解答,并回答教师提出的有关问题。
⑵实践体验阶段。教师根据实验室条件、答辩情况和课题难易程度等,有重点地抽查6—7组作为本次实验教学课的指导对象,并强调在上机实践过程中的注意事项与具体要求,讲解实验报告格式和撰写方法,并要求各组人员进行具体分工。学生利用4节课的时间上机实践,并记录编程调试过程中的相关数据和出错信息。
⑶成果交流阶段。实验完毕得出结果后进行资料整理,并开始撰写实验报告。教师对各组的实验报告进行初审,提出具体修改意见。各组学生对实验报告认真修改和补充,做到报告格式化、标准化,并正式提交给教师再次审查,教师根据情况评定成绩,作为期末成绩总评的参考依据,并在课堂上组织学生交流实验感受及取得的成果。
通过实验实践内容的训练,突出构造性、研究型思维训练的特征,提高了学生组织数据与进行编写大型程序能力;更好地理解和掌握了算法设计所需的技术,为整个专业学习打下了良好的基础。学生通过完成《数据结构》实验课程的设计任务,不仅把设计优良算法与掌握面向对象的编程技巧结合起来,而且能培养综合运用所学知识来独立解决实际问题的能力,给学生发展个性化以更加广阔的天地。实验教学的改革与实践结果证明,贯穿于实验教学环节的研究型实验教学,使得理论教学与实验教学有机的整合,收到了良好的教学效果。
四、研究型《数据结构》实验教学在人才培养过程中的作用
1、研究型《数据结构》实验教学有利于学生的智力开发和能力培养。
教学的目的不仅要使学生获得知识,而且更要使学生获得智力的发展,要使学生掌握点石成金的方法。能力与智力是两个相对独立的概念,二者有区别,又有密切联系。二者之间不一定成正比例关系。智力属于认识活动的范畴,而能力属于实际活动的范畴。智力是保证人们有效地认识客观事物的较稳定的心理特征的综合,能力是保证人们成功地进行实际活动的较稳固的心理特征的综合。智力结构由注意力、观察力、记忆力、想象力和思维力5部分组成,能力结构由组织能力、定向能力、适应能力、操作能力和创新能力5部分组成。研究型《数据结构》实验教学是全过程的教学,从给定的算法到算法扩展、从选题到实验报告及其答辩的所有过程中,几乎都是以学生为主体开展活动,教师仅仅负责组织和教学引导。特别是在科学研究方法和科技文献的查找、科技报告的写作训练等方面,让他们在低年级就能得到很好地锻炼,为今后写好毕业论文打下了坚实的基础。所以,这种新型的教学方式对于全面培养学生的智力和能力是十分有利的。
2、研究型《数据结构》实验教学可激发学生的求知欲和创造力。
教师要善于采取相应的改革措施,创设智力发展的环境与条件,用生动的实践活动来巩固和强化学生的求知欲,激发学生的好奇心、兴趣、想象力和创造力。因为兴趣是推动学生求知欲的强大内在动力,兴趣往往是创造的先导,同时想象在人的智力活动中也占有极重要的地位。由于研究型《数据结构》实验教学与中小型软件开发结合起来,使学生们很感兴趣。他们本来对软件开发充满了好奇与想象,在学习了《数据结构》以后,有了一定的算法理论基础,可以根据自己的兴趣,充分发挥想象力和创造力,对软件开发进行有益的尝试。
3、研究型《数据结构》实验教学有利于培养学生动手动脑、理论联系实际的能力。
研究型《数据结构》实验教学要求学生动手动脑,手脑并用,既应用了已掌握的知识,又促进了思维力、理解力和创造力的发展。所以,我们认为知识与智力上的综合训练是发展智力的重要条件。在实验教学活动中,学生们不仅动手编制了相关的应用程序,而且还掌握了使用相关编程工具的方法,并通过实践和反复总结后,理解了对同一算法可以从多种不同的角度来实现的深刻内涵。
4、研究型《数据结构》实验教学能培养学生的团队精神和协作意识。
学生积极参加研究型《数据结构》实验教学活动,不仅促进智力和能力的发展,而且能很好地培养学生的团队精神和协作意识。由于我们的整个教学活动是以小组进行的,无论是在上机编程,还是在查阅资料、撰写和修改实验报告,各小组成员都能认真参与,并很好地配合组长工作,表现出良好的团队精神和协作意识。最后,当顺利完成实验报告并通过教师验收时,他们感到有一种来之不易的集体成就感和荣誉感。所有这些,使他们更加坚定了自信心,激发了学习兴趣,锻炼了能力,提高了智力。
当然,同传统的实验教学相比,研究型《数据结构》实验教学对教师的要求更高了,付出的也更多了,同时得到的也更多。因为这是一种过程的学习和参与,学生和教师都从中受益匪浅。因此,只要我们提高了对研究型实验教学的认识,端正了态度,掌握了科学的指导方法,就会去不断地创新,必将能培养出智力和能力全面发展的一流人才。
参考文献
[1]文辅相. 素质·方法·创新[J].高等教育研究,1999.
[2]陆国平,江莹,李松.研究型大学与思想库[J].高等教育研究,2001.
[3]沈显生,尹路明,李树美,杨捷频. 研究型野外实习教学的设计与实践[J].教育与现代化,2002.3.
中图分类号:G642.0 文献标志码:A 文章编号:1674-9324(2016)24-0274-03
一、引言
实验教学是学生从学习理论知识到走向社会的桥梁,对提高学生综合素质、培养学生创新精神和实践能力有着理论教学不可替代的特殊作用[1]。特别是主干课程的实践教学,它是应用型人才培养中的关键环节[2]。课内实验是指与理论课相捆绑的实践教学,即嵌入到专业基础课或专业课内的实验实践教学[3]。它是与理论教学并行实施的实践教学环节,能够帮助学生深入理解和掌握所学的专业知识。
数据结构是随着处理对象的复杂性不断增加而发展起来的一门课程,作为计算机专业的核心课程,在专业人才培养链条中占有举足轻重的地位[4-7]。数据结构主要研究数据在抽象视图和实现视图中的表示和处理方法[8,9]。抽象视图涉及的是数据结构的理论性部分,实现视图主要体现的是数据结构的实践性,理论指导实践,实践支撑理论,因此设计有助于课堂理论教学的实验教学方案是非常有必要的[10]。它可以解决学生对所学知识缺乏必要感性认识的问题,将知识传授、技能训练、能力培养融于一体,使所学理论知识在实验中得到验证和应用[11]。
栈和队列是两种非常重要的数据结构,它们有非常多的实际应用并且是实现其他复杂结构的基础,因此为了帮助学生掌握并灵活运用这两种结构,本文给出一种栈和队列的实验教学方案。该方案的设计思路也可以应用于其他数据结构或课程的实验教学方案的设计。
二、认识两种重要的数据结构――栈和队列
栈和队列是两种运算受限的线性表,它们的插入和删除运算都被限制在表的端点处进行,只是具体的受限规则不一样[12,13]。
(一)学习对象
栈(stack)是运算受限的线性表,它被限制在表的一端进行插入和删除操作。能进行插入和删除的一端称为栈顶,另一端称为栈底。正是由于它插入和删除操作上的限制使得它具有了一种独特的“后进先出”(LIFO)的特性。栈的LIFO特性使得它具有非常多的应用,如:符号平衡问题、中缀表达式转换为后缀表达式问题、后缀表达式的计算问题、函数调用的实现(包括递归函数的实现)、在股票市场中查找划分、Web浏览器中的网页访问历史、文本编辑器中的撤销序列等。此外,栈还是其他很多算法的辅助数据结构和其他数据结构的组成部分。
队列(queue)也是一种运算受限的线性表,它被限制在表的一端进行插入操作,在表的另一端进行删除操作。进行插入操作的一端称为队尾,进行删除操作的一端称为队首。正是由于它插入和删除操作上的限制使得它具有了一种独特的“先进先出”(FIFO)的特性。队列的FIFO特性使得它具有非常多的应用,如:操作系统中的作业调度、异步数据转换、多道程序设计等。此外,队列还是其他很多算法的辅助数据结构和其他数据结构的组成部分。
(二)学习目标
学习这两种重要的线性结构需要学生重点消化的知识点有:(1)栈/队列的概念、类型定义及基本操作的定义和实现;(2)栈/队列的结构特性;(3)栈/队列的灵活应用。
为了配合栈和队列的理论教学,帮助学生理解和掌握上述知识点,我们需要精心设计栈和队列的实验教学方案。
三、栈和队列的实验教学方案设计
(一)实验题目设计
根据栈和队列的学习目标和遵循循序渐进的学习和教学原则,实验题目被分为以下三个层次:基础型实验题目、设计型实验题目和加强理解型实验题目。
所谓基础型实验是指围绕课程讲授的栈/队列的物理实现和其基本运算的实现来设置的实验题目。设计基础型实验的目的是,通过实践的方式验证课堂上讲授的重要知识点,给学生切身的感受,摆脱“纸上谈兵”的感觉,这种立体的感受有助于学生深入理解和掌握这些知识点。设计型实验要求学生能分别运用栈/队列解决简单应用问题。这类实验题目主要是用来引导和加强学生对栈/队列的灵活运用。设计加强理解型实验的目的是强化学生对栈和队列的结构特性的理解和体会。为了达到这个目的,加强理解型实验题目的设计思路有两个方面:(1)引导学生去思考并解决这样两个问题:能否利用栈的LIFO特性来实现队列的FIFO特性?能否利用队列的FIFO特性来实现栈的LIFO特性?(2)让学生实现其他更为复杂的栈和队列。
在栈的理论教学过程中可以开设栈的基础型实验,在栈的理论教学结束后可以开设栈的设计型实验,在队列的理论教学过程中可以开设队列的基础型实验,在队列的理论教学结束后可以开设队列的设计型实验和加强理解型实验题目。表1给出了具体的实验安排。
学生必须在相关内容的理论教学过程中利用自己的课外时间完成全部基础型实验题目,教师根据学时安排选择1~2道设计型实验题目让学生在上机课上完成,未选择的题目应向学生提供完整的源代码和设计说明。相关内容的理论教学结束后,学生必须利用自己的课外时间完成加强理解型实验题目中的第1题和第2题,剩下两题可以选做。
(二)教学方法
因为三种类型实验的要求、难易程度不同,因此在学生参与形式、教师参与程度、教师参与方式等方面需要区别对待。表2给出了对三种类型实验在上述这几个方面的设计。
基础型实验要求每位学生利用课外时间独立完成,教师全程参与指导。所谓全程参与指导是指从算法基本思想到算法实现的各个环节(包括编程技巧、程序调试与测试等)都要参与指导。参与方式多种多样,例如利用QQ等即时通讯工具进行指导,约定时间和地点进行答疑,等等。
设计型实验要求每位学生在上机课上独立完成,教师前期参与指导。所谓前期参与指导是指教师参与学生在算法设计环节的讨论,教师可以给出提示,同时鼓励学生设计不同的算法。参与方式是面对面的交流。
加强理解型实验要求每位学生利用课外时间独立完成,教师后期参与指导。所谓后期参与指导是指教师在收齐学生提交的源码和设计报告后,对其进行分析总结,并将总结结果以班级为单位采用面对面的方式反馈给学生。
(三)考核方法
对三种类型的实验采用不同的考核办法。表3给出了这方面的设计。
对基础型实验不做专门考核的原因是学生基础型实验完成的好坏会直接影响设计型实验和加强理解型实验的完成,因此对其他两种类型实验的考核间接考核了基础型实验。
对设计型实验的考核分两个部分:一是本次上机课上实验的完成情况,包括程序是否调试成功、程序的运行结果是否正确,代码编写的质量等;二是本次上机课结束后提交的实验报告的完成情况,包括内容是否完成、书写是否规范等。
对加强理解型实验的考核主要是考核学生提交的源代码和设计报告的完成质量。
设计型实验的成绩占总实验成绩的70%,加强理解型实验的成绩占总实验成绩的30%。
四、结语
数据结构是一门理论性和实践性很强的课程,其理论教学环节与实验教学环节相辅相成。栈和队列是两种重要的线性结构,为了提高它们的教学效果,增强实验教学对其理论教学的促进作用,本文提出了一种栈和队列的实验教学方案。该方案的设计思路同样适用于其他数据结构或课程的实验教学方案设计。
参考文献:
[1]朱金秀,金纪东,周妍,等.实践教学与就业能力培养相融合的研究与探索[J].实验室研究与探索,2011,30(4):105-107.
[2]荣瑞芬,闫文杰,李京霞,等.实践教学课程考核评价模式探索[J].实验技术与管理,2011,28(3):232-234.
[3]张纯容,施晓秋.问题与案例驱动的课内实践教学分级模式探索[J].实验室研究与探索,2012,31(1):145-148.
[4]教育部高等学校计算机科学与技术教学指导委员会.高等学校计算机科学与技术专业人才专业能力构成与培养[M].北京:机械工业出版社,2010:143-147.
[5]董丽薇.数据结构课程教学方法的改进[J].沈阳师范大学学报(自然科学版),2012,30(2):307-309.
[6]刘城霞,董宛,蔡英.数据结构中基本教学案例的研究[J].计算机教育,2010,(03):144-146.
[7]韩建民,钟发荣,赵相福,等.基于ACM-ICPC训练模式的数据结构实践教学探讨[J].计算机教育,2013,(10):103-107.
[8]沈华.数据结构、算法和程序之间关系的探讨[J].计算机教育,2013,(04):58-61.
[9]沈华.数据结构入门教学中的实例法[J].计算机教育,2013,(24):64-66.
[10]沈华.数据结构课内实践教学方案[J].实验室研究与探索,2013,32(10):396-400.
关键词:课程融合;做中学;项目驱动
中图分类号:G642
文献标识码:B
1引言
“面向对象程序设计”和“数据结构”是信息学科相关专业本科生的必修课程,也是专业基础课程。“面向对象程序设计”课程通过全面、系统地介绍面向对象程序设计的基本概念、分析方法、设计方法、基本语法和编程方法,使学生能深刻理解和领会面向对象程序设计的特点和风格,类的封装性、继承性和多态性与程序的安全性、结构性和灵活多样性之间的关系,进而掌握面向对象的程序设计方法和编程基础,并具备解决一般程序设计问题的能力;“数据结构”课程有助于学生更有效地组织数据、设计高效的算法、完成高质量的程序以满足错综复杂的实际需要,强调数据的组织方式和解决问题的思想。
在实际的教学过程中,学生对这两门课程的掌握和运用不尽人意。一方面,相当部分学生虽然学过了“面向对象程序设计语言”课程,但在“数据结构”课程中却难以利用面向对象的思想设计和实现相关的数据结构和算法,影响了学生对数据结构课程知识的掌握;另一方面,数据结构和算法是计算机科学的核心问题,很多学生在学习的过程中没有意识到这一点,以至于到了实际项目中不知道运用所学的“数据结构”知识来解决实际问题。
2问题分析
“面向对象程序设计”和“数据结构”课程作为非常重要的专业基础课,各高校在课时分配和课程建设方面都非常重视,出现上述问题的原因主要是课程设置和教学方式上存在问题。
在现代教学体系中,从抽象数据类型和面向对象观点来讨论数据结构已经成为一种主流,使得“面向对象程序设计”和“数据结构”两门课程构成了强相关的课程。但在当前的实际教学中,这两门课程被一直被设定为相互独立的课程,课程间的教学出现了相互脱节现象,而且这种
现象在许多高校的教学中普遍存在。
在实践环节上,由于课程设置上的相对独立,也使得两门课程在实践教学方面有相当的重复,虽然总体的实践教学学时很多,但各自侧重点在实践教学中没有有效地体现,使得学生“事倍功半”,收效甚微。课程中实验项目过于单一和相对独立,也使得实践环节与实际项目联系过于松散,学生运用所学知识解决实际问题的能力和实际工程能力很难得到锻炼,也难以培养软件开发中所必须的团队合作精神。
3课程改革方案及实施
针对目前“面向对象程序设计”和“数据结构”这两门课程教学中存在的问题,我们将这两门课程进行有机结合,探索采用教师指导下的以项目为驱动的“做中学”教学方式进行教学。精心设计项目,将面向对象的设计思想、程序设计语言和数据结构课程教学内容恰当地融入到所设计的项目当中,有效整合两门课程中的重叠部分,突出各自的侧重点。面向对象程序设计教学采用“做中学”(Learning By Doing)以及“按需教学”(Teaching On Demand)的方式进行教学,使学生在具体项目过程当中在掌握和熟练运用高级语言的特征的同时,深入理解和巩固相应的数据结构知识;教学采用的项目与实际项目接轨,提高学生利用所学知识解决实际问题的能力;在教学过程中以项目组的方式组织学生,培养学生的团队合作精神,提高学生的职业素养。
3.1课程项目
为了有效整合这两门基础课,我们精心设计了“Mini数据库”项目,该项目较好地包含了“数据结构”中线性表、字符串、二叉树、索引、查找、排序、文件等章节的主要内容。通过该项目实现了“数据结构”和“面向对象程序设计”课程内容的有机融合。
Mini数据库分为三个模块:基本数据模块,数据库内核模块,数据库管理界面模块。其中,数据库管理界面模块呈现数据库管理的总界面风格及形式,在项目具体实施过程当中,这一块不作太多要求以免转移项目重点,学生可以只完成控制台形式界面。
基本数据库模块定义基本数据结构,采用哈希表和二叉树结构,负责读出业务数据的存储,包括对最基本数据的查询,删除,修改和添加等操作。其结构如图1所示。其中Index类创建索引,Matrix类以顺序表形式存放所有数据,并且该类的设计融入了可利用空间表、模拟指针等思想,对学生在数据结构设计方面有较大的启发作用。
数据库内核模块(如图2所示)主要负责对文件中数据进行读写操作,实现定义表及表的属性,设置主键和外键,定义表之间的关联以及实现表的更改等功能。
Mini数据库项目所涉及到的数据结构基本上基于本科教材中介绍的常用数据结构,部分数据结构在课本的基础上稍做修改便可用于该项目,部分需要对教材所介绍的相应数据结构进行重新设计以适于项目。每一个数据结构都有其相关的代价和效益权衡,要完成项目,学生需要对多种数据结构的有效性进行评估来决定在什么情况下需要采取哪种数据结构。通过该项目我们希望达到三个目的:
(1) 使学生熟悉一些常用的数据结构,这些常用的数据结构形成了一个程序员的基本数据结构工具箱,对于实际中的很多问题,工具箱里的数据结构便是理想的选择;
(2) 引入“权衡(tradeoff)“的概念,在项目中通过分析不同数据结构的代价和效益来讨论“权衡”的概念;
(3) 评估数据结构或算法的有效性,在项目过程中引导学生分析工具箱中哪一种数据结构最适合解决项目中的某一问题,这种技术也使得程序员能够判断自己或别人发明的新数据结构的价值。
3.2教学方式及实践
Mini数据库系统在难度和复杂度上较传统实验高,如何引导学生在学习“数据结构”课程的同时完成该项目是一个值得研究的问题。我们的做法是:首先在教师指导下让学生全面了解所要完成项目的整体结构,在学习“数据结构”课程的过程中结合所学知识逐步完成系统的各个模块,最终完成整个项目。
我们采用集课堂理论教学、开放实验、每周讨论、网上答疑等多环节组成的立体化教学方式进行教学。
在课堂理论教学部分,根据所设计的项目我们对教学内容进行适当调整,强调所学内容在项目中的应用。完成相关理论知识的讲授后,指导学生如何运用所学知识解决课程项目中的问题,并且理论教学中部分内容采取“做中教”方式进行,教师在现场编写程序完成教学任务,帮助学生克服“编程难”的心理阴影,培养学生分析问题和解决问题的能力以及养成良好的编程风格,该方法深受学生欢迎。
实验上机部分,学生以项目组的形式进行组织,3~4名同学为一组,共同完成课程项目,培养他们的团队合作能力。为了防止项目组中个别动手能力弱的学生不参与或少参与课程项目的设计与实现工作,在课程项目进行的同时,我们布置了相应的课程实验,课程实验与教学内容直接相关,并且对课程的项目有直接帮助作用,每一个学生都要单独完成课程实验内容。为了给学生提供良好的实验环境,我们采取开放实验形式,为学生提供了专门实验室。指导教师以office hour的形式解答学生问题,并且每个班配备了一名指导教师和一名助教。
为了克服简单的“说教”型教学,每一周由指导教师或助教召集开展“每周讨论”活动,学生以自愿方式参与“每周讨论”。“每周讨论”以学生为主体,由学生讲解他们所设计的代码以及所遇到的问题,特别鼓励学生将上一周在课程项目或课程实验中所遇到的问题提出来,由参与学生一起讨论问题的解决办法。为了鼓励学生积极参与 “每周讨论”活动,我们对积极参与讨论和提出问题的学生在平时成绩上予以体现,下一步我们将考虑对由学生评选“每周讨论”活动积极分子,并给与奖励。
课程网站是课程教学的有机组成部分,我们逐步建立了相对完善的课程网站。课程网站在为学生提供课程资源、课程项目和实验任务的同时,为学生提供了网络交流平台。在“学习交流”板块中,学生可以提出学习中遇到的问题,回答其他学生的提问。为了及时解决学生的提问,我们安排了教师和助教进行网络值班。为鼓励学生积极提问和回答其他学生问题,网上“学习交流”模块中设计了加分功能,学生所得分数将作为平时成绩的重要组成部分。
采用上述方式,我们在湖南大学软件学院2004级和2005级本科生中进行了试点,每次挑选了30多位学生参加。第一次挑选的学生在全年级中属于较为优秀的学生,完成情况非常好,其中两位同学进入微软亚洲工程院实习,并将他们在本课程中完成的项目作为一个亮点向实习单位介绍;第二次参加的学生的整体素质处于全年级中等水平,也顺利完成了整个项目。在前两届学生成功试点的情况下,目前我们对2006级本科生全面采用上述教学方式进行“数据结构”和“面向对象程序设计”两门课程的教学,通过近一个学期的教学,从教学的效果来看,学生的动手能力整体上较上几届学生有明显改观,并且学生的学习积极性也大大提高,90%以上的学生项目组能够按照教学进度完成项目内容。
参考文献: