时间:2022-08-05 19:32:01
开篇:写作不仅是一种记录,更是一种创造,它让我们能够捕捉那些稍纵即逝的灵感,将它们永久地定格在纸上。下面是小编精心整理的12篇数据结构与算法,希望这些内容能成为您创作过程中的良师益友,陪伴您不断探索和进步。
关键词:算法;数据结构;相关性
中图分类号:TP311 文献标识码:A
算法与数据结构包含了选取的算法、存储必备的方法、拟定的操作规程。解析数据结构,这类思路有着凸显的导向,它关系到培育的抽象认知。构建精准的某一程序不可缺失算法、搭配的数据结构。辨识了二者的多重关联,设定最适宜的逻辑框架以此来便于拟定程序。把控各类的算法,侧重去养成合适的设计风格,适应日渐复杂的新算法。
一、选取线性链表的实例
计算机科目包含了选取的算法、相关数据结构。从实质上看,算法及特有的数据结构并非没有关联,它们是联系的。变更了分开的思路,侧重了相关性。依循了算法的主线,多样的数据结构都被融汇于设定的这一算法。解析了相关性,借助于预设的程序语言来区分二者。经过探究可得:数据结构及算法拥有内在的深层关联,二者不可割裂。把控根本的某一数据结构、辨析存储结构,还要关联着可控的算法。这样做揭示了深层的二者关联,符合了变化的科目需要。
二、算法编程的语言
设计算法含有:初期拟定的模式、面向对象状态下的编程、泛型的编程。融汇这样的要素,构建可得适宜的算法。设定某个二元组,用它来代表数据结构。在二元组内整合了多重的数据元素,这样的基础上又创设了集合关系。经由抽象可得细化的数据类别。这类算法添加了灵活优势,且很易被调用。
相关性涵盖着泛型编程特有的途径,它被设定成典型。泛型编程抽象可得更完备的、精细的新集合,借助于它来代表算法。整合了多态模板,可被重复去调用,获取了更高水准的算法组件。经由自主的定义,明晰了数组内的一切元素,集合可得新类别。数据类型含有:堆栈及常见的表、二叉树、队列及图形等。表述这样的抽象数据,依循了面向对象的表述途径,支持表述语言。提炼获取了算法模式,遇有近似的数据结构都可依照凝练的这一算法予以运算。先要预设模块,拟定细化的类别及关联的行为。
三、算法的演示流程
线性链表的算法依循了面向对象路径下的解析,选取单链表整合了细化的较多数据项。归结了线性表、树形图及队列等。依循继承的演算即可获取双向架构的这类链表,演算的流程为:
四、探析实现的路径
构建神经网络依照的根本思路为:最小二乘算法。要调整拟定的权值,借助于梯度搜索来平衡输入及输出的误差。从现状看,BP网络是最为常见的一类神经网络,它整合了输入及输出,构建了双重的映射。数据结构及算法凸显了实践的特性,侧重培育本源的抽象思路,增添了实践类的新技能。创设新颖的算法,要考量真实的关联。实现的路径为:解析某一疑难、设计可用的算法、设定编程。
算法及创设的数据结构可延展至自动检索馆内的书目、调配交通灯、求解某一迷宫。这类算法都不可脱离生活,增添了真实性。针对于线性表,要验证它关联的链式流程。模拟退耕还林,解析最适宜的需求。这样的基础上,创设了彼此关联的精准数据结构。经由后续的细化设计,编码而后再次去调试。例如:在选修课程时,要拟定明晰的科目名称、依循的次序等。设定拓扑次序来指引后续的选修流程,可创设AOV特有的算法网络,布设顶点次序用作表述可筛选的课程。
探析相关性还可选取压力传感器,它含有噪声的干扰、振动这类的干扰信号。可构建采样电路,压力传感器增设了输出信号。BP网络可采纳任一精度来逼近连续函数,只要选取了适宜的神经元数即可。它包含着隐层,神经网络在任一精度层级内都能表现出非线性的映射。可以先去生成初始的加权系数,采纳梯度搜索以便修正原有的系数。不断予以修正,直至误差的均方符合了拟定要求,才可终结这一流程。为滤除干扰,经由EMD这样的滤波以此来获取信号。经过后续的分解,可得测重必备的稳态单值信号。
结语
算法关系着数据结构,解析现有的课节内涵,增添探究中的浓厚兴趣。演示某一算法要侧重相应的数据结构。经由慎重的演算才能缩减后续编程的偏差,培育审慎严谨的风格。授课中要增设必备的指引,提出某一疑难而后摸索并化解。归结零散的现有知识点,做好举一反三。
参考文献
[1]李晓鸿,骆嘉伟,季洁.“数据结构与算法分析”研究型实践教学的探索[J].实验室研究与探索,2012(01):121-125.
[2]刘晓静,黄维通,王晓英.西部地区CDIO理念下的数据结构与算法课程建设[J].计算机教育,2013(17):107-111.
关键词:数据结构;算法;教学策略
数据结构与算法是计算机专业的一门核心课程,不仅是程序设计的基础,而且是设计和实现编译原理、操作系统、数据库系统等系统程序和大型应用程序的重要基础。本课程主要研究非数值计算的程序设计问题中所出现的计算机操作对象、数据之间的关系、数据的操作、算法复杂性分析等内容,教学的突出难点是知识的抽象性和动态性,学习过程也是复杂程序设计的训练过程,理论性和实践性均较强。由于学生基础知识不牢固,再加上课程本身内容抽象,有一定难度,学生普遍反映该课程“难懂、难做、难用”。针对这个问题,本文从教学方法、学习方法入手,进行了教与学的分析和探讨。
1教学存在的问题
1.1先导课程不扎实
数据结构与算法课程的先导课程有高等数学、高级程序设计和离散数学等。学生在学习该课程前必须能够较好地掌握这几门课程。例如,算法分析的研究必须要以一定的数学理论为基础;非线性结构的分析必须用到图和树的基本知识。另外,数据结构中的算法大多由类C、C++或C语言描述而成,虽然C语言在高级程序设计课程中已经学习过,但由于学生刚刚开始接触高级程序设计语言,难度较大,用起来就比较困难。尤其是指针、结构体部分是C语言中学习的难点,而这些又是在数据结构中频频出现的用法,学生遇到算法时往往感觉很吃力,实验课也遇到很大困难。在数据结构课堂教学中,老师往往要花一部分时间在C语言的复习上。尽管如此,学生仍然模糊不清,教学效果不理想,久而久之,有些学生甚至失去了学习兴趣。因此,先导课程掌握不扎实,给数据结构课程的教学埋下了隐患。
1.2课程内容抽象复杂
课程主要介绍两部分内容,一是数据结构,二是算法。数据结构部分包括线性结构、树形结构和图形结构,教材都用抽象数据类型描述,内容抽象不生动,加之学生C语言基础不牢固,理解类C语法困难,因此学起来比较吃力。而算法部分在数据结构基础上展开,包括排序算法、查找算法等,是栈、图、树等数据结构的综合应用,虽然这部分有很多实例辅助,但这些算法涉及的知识较多,都是基于数学模型及其基本操作基础上的研究,而且主要是基于算法思想的研究,不易理解,因此相当一部分同学学习到这里时,心理上感到恐惧,难度非常大。
1.3实践能力缺乏
数据结构与算法是一门理论与实践并重的课程。课程的教学要求之一是训练学生进行复杂程序设计的技能和养成良好程序设计的习惯,其重要程度决不亚于知识传授。对涉及的题目,要求学生要能用相应的数据结构和算法解决,提高分析和解决问题的能力。因此在整个教学过程中,完成上机实习是个至关重要的环节。假设每周授课学时为4学时,那么学生每周至少应有4个机时同步实践算法。但是,在实际教学中,实验平均每周1.2机时左右,缺少的时间只能靠学生课后自觉完成,但是多数同学不能完成。由于实践辅助不足,理论课上的算法也就变成了“纸上谈兵”,学生学得肤浅,也比较枯燥乏味,对刚刚接触这门课的学生来说,总有一种不知所措的感觉,教师在讲授这门课时也是困难重重,成绩平平。
2提高教学效果的思考
2.1重视前导课程的复习
牢固的前导课程知识是学习数据结构与算法的前提条件。离散数学是计算机科学的数学基础,所提供的训练十分有益于提高概括抽象能力、逻辑思维能力、归纳构造能力,有益于培养学生严谨、完整、规范的科学态度。因此,学好离散数学将为后续课程的学习打下扎实的基础。在教学中,教师可以对部分前导课程内容加以复习,这样学生一方面感受到前导课程的重要性,一方面又建立起前导课程同数据结构的内在联系,对学生学好数据结构起到积极的作用。
另一门非常重要的前导课程是高级程序设计,其中C语言的结构体和指针是描述存储结构的基础,灵活地运用指针可以处理各种复杂的数据结构。在教学中,教师要从注重语言语法转变为注重学生编程能力的培养,要统筹安排各部分内容的授课时间,保证指针、结构体和函数等内容有足够的教学时间。由于C语言学习一年后才开设数据结构与算法,因此在开展数据结构教学时,要给学生复习C语言的知识,并布置复习任务,尤其是与数据结构相关性大的部分。在教学过程中,教师可以结合学生的学习状况和相应算法,再适当补充必要的C语言知识,抓住两门课程的衔接点实施教学。例如,要重点复习数组、结构体、指针等在程序中的具体应用,用一周的时间回顾C语言知识,让学生上机实验。
2.2理清知识体系脉络
数据结构与算法的知识点虽然比较多,但其主体知识框架是非常清晰的。大多数教材都以数据的逻辑结构为主线,顺序介绍线性结构、树形结构、图形结构和文件结构,介绍每种数据结构时都讨论其存储结构及相关算法。例如对于线性表,如果考虑到存储,可以分为数组方式存储和链表方式存储;考虑到运算的特殊性,则可以分为栈、队列、串、数组和广义表。对于一些比较重要的算法,再列出单独的章节来讨论,例如排序、检索、存储管理等。每个章节之间既相互独立,又相互联系。教学中,教师要抓住主线,理清其内在联系,对整个内容进行有机组合,合理安排,了解课程的知识框架和各种结构的关系后,从简单到复杂、循序渐进、逐步深入地实施教学。
对于每个章节的内容,也应按照一定的流程展开学习。例如,首先掌握每章节的基本概念,再熟悉该结构的抽象数据类型定义和主要操作的实现方法,然后要理清算法实现的思路以及算法实现的框架,最后通过上机调试进一步掌握该算法。
学生对学过知识的印象是分散的、片面的,无法将知识衔接起来,举一反三。这就要求教师在教学过程中承前启后、不断总结、及时复习、注重理解。以链表学习为例,在线性表章节学习了单链表、双链表及循环链表,它们三者是相互关联、层层深入的。而后面章节中树的链表表示法、图的邻接表和逆邻接表表示法、链地址法解决哈希表冲突都是链表的具体应用。在授课的时候,教师应注意复习前面的内容,把有联系的内容相互串联起来,使学生形成一个完整的知识体系。
在教学过程中,教师不必拘泥于教学大纲的内容,可以对教学内容进行有机整合,并不断吸收新内容、新知识和考研内容。可以对教学内容进行适当的拆分和重组,做到突出重点、细化难点。
2.3重视课堂教学的趣味性
关键词:算法与数据结构;学习兴趣;影响因素;实践性教学
算法与数据结构是一门处于计算机学科核心地位的技术基础和主干必修课,着重于培养学生的数据结构与算法设计能力、程序设计和实现能力。学生通过对数据结构设计方法的系统学习与研究,理解、掌握、设计和应用数据结构的主要方法,培养对算法的计算复杂性进行正确分析的能力,为独立地设计算法和对给定算法进行复杂性分析奠定坚实的理论基础。这些能力对从事计算机系统结构,系统软件和应用软件研究与开发的科学工作者是非常重要和必不可少的。
福州大学算法与数据结构课程是国家级精品课程,课程建设的一个重要目标是有效地提高教学效果,激发学生的学习兴趣。围绕这个目标,我们在课程建设过程中进行了以下教学改革:(1)加强了课程的实践性环节;(2)采取师生互动式教学;(3)建立课程成绩的综合评价模型。
显然,这些教学改革措施与学生学习兴趣之间是互相影响的,好的教学方法对提高学生的学习兴趣有一定的作用,但学生的学习兴趣对教学改革的效果也会有一定的影响。学生的学习兴趣与环境因素有一定的关系[1],探索和分析对学习兴趣有影响的因素是教学理论和实践中的一个重要课题。为了更好地做好算法与数据结构的教学改革工作,有效地激发学生的学习兴趣,了解学生对于目前的教改方案的看法,我们对福州大学计算机专业本科生进行了学习兴趣及相关因素的调查和分析。
1方法
1.1调查方法
数学与计算机学院2007级本科生在二年级上学期学习算法与数据结构课程,课程教学于2008年12月结束。课程教学小组教师于2009年3月向2007级全体本科生发放调查问卷,于一周后回收问卷,共有学生281人,问卷回收281份,回收率100%。
1.2调查内容
调查内容分为三部分:(1)学生的基本情况、专业基础课学习情况。专业基础课主要指数学分析、线性代数、高级程序设计语言和离散数学。(2)对算法与数据结构教学改革的评价。(3)课程学习兴趣量表。
学习兴趣量表是参考物理学习兴趣量表[2]编制而成的(见表1)。量表共有17个条目,将每个条目的得分相加得到量表的总分。以量表的总分作为反映学生对于算法与数据结构课程的学习兴趣指标。得分≥13分者为“学习兴趣很高”,得分在8~13分者为“学习兴趣较高”。该量表用于281名学生的学习兴趣测量,得到其Cronbach可靠性系数 =0.8465,说明该量表能够有效地测量学生对于算法与数据结构课程的学习兴趣。
1.3分析方法
对各因素与学习兴趣之间的关系用描述性统计分析和Wilcoxn秩和检验进行比较,采用多元回归[3]的方法分析影响学习兴趣的主要因素。全部检验采用双侧,以P
2结果分析
2.1学生的基本情况及学习兴趣
在本次调查的281名学生中,男性239人(占85.05%),女性42人(占14.95%),平均年龄20岁。学生的家庭居住地分布见表2。在课程开始之前的学期中曾参加过“国际大学生ACM程序设计竞赛”培训的学生有57人,占20.28%。
在281名学生中,学习兴趣量表的平均得分是8.12分,标准差是4.37分。有16.01%的学生的得分超过13分(学习兴趣很高),有39.15%的学生的得分在8~13分(学习兴趣较高)。
2.2学习兴趣与课程成绩的关系
在281名学生中,“算法与数据结构”课程综合评价成绩在优(≥85分)、良(70~84分)、及格(60~69分)和不及格(
2.3与学习兴趣有关的因素
男生和女生的学习兴趣平均分分别为8.24分和7.40分,差别无显著性(P>0.05)。城市、县、乡以及农村生源的学习兴趣平均分分别为8.69分、7.88分和8.05分,差别无显著性(P>0.05)。在课程开始之前曾参加过“国际大学生ACM程序设计竞赛”培训的学生和从未参加过竞赛培训的学生学习兴趣平均分分别为10.40分和7.54分,差别有高度显著性(P
有66.9%的学生认为作为未来的计算机专业技术人员,学习算法与数据结构课程是很有必要的,这些学生的学习兴趣平均分是8.66分,而认为不是很必要或不必要的学生(占33.1%)的学习兴趣平均分是6.64分,二者差别有高度显著性(P=0.016)。
学生的四门基础课程成绩除数学分析之外,其他课程成绩均与学习算法与数据结构的学习兴趣有关(见表4)。
2.4对课程教改的评价
目前算法与数据结构课程的总学时为90,其中理论课50学时,实习课和实践性教学共40学时。在281名学生中,认为课程总学时设置偏少、合适、偏多的同学分别有41.64%、40.57%和3.2%;认为理论课教学内容偏少、合适、偏多的同学分别有20.28%、47.33%和10.32%;认为实践性教学内容偏少、合适、偏多的同学分别有13.17%、61.92%和11.39%;对互动式教学很感兴趣、不感兴趣、很不感兴趣的同学分别有37.01%、27.05%和7.83%;对于课程成绩采用综合评价模型评定的方法,认为很合理的同学有69.04%,认为不如传统考试方式的同学占8.10%。
2.5学习中存在的主要问题
在本次调查中,学生在学习中自感存在的主要问题如表5所示。有一定比例的学生存在的问题是与教师的教学有关,提高教学的语言艺术水平,注重用通俗易懂的语言讲授,把握好适当教学进度是下一步改进教师教学效果的主要措施。
3分析
本次的调查结果显示,学生的学习兴趣和算法与数据结构课程成绩之间存在正相关关系,学习兴趣越高,课程成绩越好。这提示我们在今后的算法与数据结构课程建设工作中要积极探索如何更有效地激发学生的学习兴趣。
从本次调查结果可知,学生的学习兴趣与学生的专业基础背景有一定的关系,尤其与学生在一年级时学习的专业基础课程如线性代数、离散数学、高级程序语言这几门课程的学习情况有关,在这些课程中,学习成绩较好的同学后续学习算法与数据结构课程的兴趣也较高。由于算法和数据结构中涉及了许多对算法进行分析的数学工具,因此学好这些课程是学好算法与数据结构课程的基本概念和知识的基础,同时,学好这些课程也可以增强学生的学习信心,有利于提高学习兴趣。
除专业基础课程之外,与学生学习兴趣有关的另一个因素是对学习算法与数据结构课程必要性认识。调查结果显示,虽然有66.9%的学生认识到作为未来的计算机专业技术人员,学习算法与数据结构课程是很有必要的,但是仍有33.1%的学生对此没有认识,这反映出有些学生对于课程的学习比较盲目,学习目的性不明,从而学习动力和兴趣不足。因此,今后的课程建设要进一步加强实践性教学和以案例为先导的理论课教学,案例可以取自教师的实际科研课题,也可以是企业或其它实体的实际课题。通过让学生接触这些实际案例,引导学生树立算法与数据结构课程学习重要性和必要性的认识。要做到这些,对教师的自身业务素质有较高的要求,因此,培养一支高业务水平的教师队伍也是课程建设的重要任务。
从2000年开始,在大学一年级学生中开展“国际大学生ACM程序设计竞赛”培训班,有许多学生都积极参加了程序设计竞赛培训。本次调查显示,一年级时参加了程序设计竞赛培训的学生,后续学习算法与数据结构课程的兴趣高于不参加的学生。由于程序设计竞赛培训主要是训练学生的算法设计与实现的能力,通过参加培训班的学习,可以使学生的实际动手能力得到锻炼,从而使学生能灵活运用所学的知识来解决实际问题。因此,教师应当鼓励学生在学有余力的情况下,积极参加“国际大学生ACM程序设计竞赛”培训,以提高学生的专业素质和技能。
本次的调查结果显示,实施教改方案后,有超过50%的学生对于学习算法与数据结构课程有高和较高的学习兴趣。这在一定程度上反应出教学改革取得了一定的成效,有效地激发了学生的学习兴趣;此外,课程成绩综合评价方式也得到了同学们的欢迎,有60%以上的同学对于课程成绩的综合评价方式给予了充分的肯定。这种课程成绩的综合评价方式结合课程实践和平时的努力来评定成绩,避免了传统的考试方法重理论轻实践,一张试卷定成绩的弊端,应而能客观地评价学生的学习成绩,这种成绩评定模式是今后要继续坚持和不断完善的。
课堂互动式教学是教学改革尝试的内容之一。但是,在本次调查中,有34.88%的学生对互动式教学不感兴趣。互动式教学具有活跃课堂气氛,有效激发学生的计算思维能力的优点,但有如此高比例的学生对此不感兴趣,这反映出教师在课堂上与学生的互动存在一定的问题。不断摸索出有效的互动式教学方法是今后课程建设和教学改革的工作之一。
就学生们学习中存在的主要问题,与教学相关的有:不理解教师对教学内容的表述和不能跟上教师的讲课进度。因此,提高教学的语言艺术水平,注重用通俗易懂的语言,深入浅出地讲授教学内容,适当把握好教学进度是下一步改进教学效果的主要改革方向。
4结语
通过对算法与数据结构学习兴趣影响因素的分析,我们更加认识到学习兴趣对教学质量的提高具有重要的促进作用。教学质量与学习兴趣两者既有共性特征,也有各自的个性特征。在课程的教学中要通过多样化的教学形式,增进教师感染力,激发学生的学习兴趣,充分调动学习积极性,不断提高教学质量。
参考文献:
[1] 张焕庭,李放. 教育辞典[M]. 南京:江苏教育出版社,1989:23-45.
[2] 高光珍,胡象岭,刘生庆. 中学生物理学习兴趣量表的修订与检验[J]. 物理教育探讨,2004,22(23):16-18.
[3] 何晓群. 现代统计分析方法与应用[M]. 北京:中国人民大学出版社,1998:102-123.
[4] 高惠璇. SAS系统 SAS/STAT软件使用手册[M]. 北京:中国统计出版社,1997:112-169.
Analysis of the Relationships between Learning Interest of Algorithms and
Data Structures and Influencing Factors
WANG Xiao-dong1,2, WU Ying-jie2, YU Chun-yan 2, WANG Yi-lei 2, FU Yang-geng 2
(1. College of Computer Science, Quanzhou Normal University, Quanzhou 362000, China;
2. College of Computer Science, Fuzhou University, Fuzhou 350002, China)
关键词:数据结构;课程设计;创新能力;团队精神
中图分类号:G642 文献标识码:A 文章编号:1009-3044(2016)32-0139-02
算法与数据结构课程设计是在理论课程之后的综合性实践教学环节,是理论教学的补充与延伸,是一门非常重要的开放性实验课程。该实践教学是软件设计的综合训练,包括如何分析实际问题、如何进行总体结构设计、如何进行用户界面设计等。要求学生在课程设计中逐步提高程序设计能力、调试能力,逐步培养算法分析能力、创新能力和团队协作精神,并初步培养科学的软件工作方法和撰写规范的软件文档的能力。
1 课程设计中存在的问题
课程设计的教学是整个数据结构教学环节别重要的一个环节,其重要性已得到了普遍的认可,但实际教学效果往往不太理想,主要存在以下几个方面的问题。
1.1 编程基础差、软件开发思想欠缺
C/C++语言程序设计是数据结构的先导课程。尽管之前学生已学过这些课程,但由于语言本身规则复杂,面向对象的思想更是不容易掌握,再加上学生没经过系统的软件开发训练,导致学生普遍存在编程基础差、调试能力弱、代码编写可读性差、拿到问题不事先做需求做规划就急于写代码等,这些都制约着学生完成任务的质量。
1.2 时间安排不合理
一般数据结构课程设计的时间安排在学期末的1-2周内,但是由于这个时候各门功课的复习及考试工作已经展开,学生为了备考,往往应付了事,能力差的学生为了考试不挂科,往往选择最基础的题目;能力强的为了考试考出好成绩,也会选择难度系数较低的题目,都是只求顺利过关,用在课程设计上的时间和精力非常有限,能够真正将心思花在课程设计上的学生更是少之又少,这样就根本谈不上创新能力和团队协作能力的培养。
1.3 选题缺乏统一标准
现有的课程设计教材很难适应所有的院校,而且选题难度区别不大,并未形成应有的层次。其中一些选题还能直接从网上或从资料上获得解答,导致学生中抄袭现象明显,课程设计并不能达到我们事先预期的教学效果。
1.4 教师的指导或多或少
整个课程设计中,教师的指导不可缺少但又不能面面俱到。而在现行的课程设计教学中,有的教师,什么都讲得清清楚楚却制约了学生的创新能力;有的教师公布选题后,由学生根据选题自己独立完成设计工作,对自己对学生完成设计的过程关注指导太少,这样学生遇到问题后不能及时解决,就会去拷贝一个,从而失去了做课程设计的意义。
1.5 课程设计报告缺乏统一规范
规范文档的撰写能力是课程设计需要培养的又一大能力。有些教师一开始不给学生规范的设计文本,学生交上来的报告五花八门,根本不像软件设计文档。
1.6 考核机制不完善
一直以来,课程设计报告被很多教师作为评定课程成绩的重要依据,而对学生完成课程设计的课程关注不多,这样就不能考察出学生的真正实践操作能力,从某种程度上讲,可以说是轻重倒置了,课程设计的教学效果自然不理想。
2 实施方案和问题对策
为了实现教学目标,我校制定了规范的课程设计流程,如下。(1)任课教师先布置课程选题,提出实现要求和完成任务流程,然后选取有针对性的问题,跟学生进行示范性、启迪性地剖析与讲解,要求学生必须按流程一步一步进行;(2)学生根据老师提供的选题,填好选题表并提交;(3)学生根据选题,写出需求分析――完成概要设计――详细设计――码与测试;(4)分组答辩,采用组长主要负责制;(5)提交课程设计报告。实践表明,这样的教学方法有助于培养学生的独立思考能力、讲述交流能力,规范文档的撰写能力,提高学生的积极性、创造性与团队协作精神,教学效果不错。
2.1 调整课程设计时间
我院将课程设计时间推到期末考试之后的假期进行,这样学生就能够一门心思将精力扑在课程设计上,分组去选择难度较大的选题,使自我挑战成为一种可能,也才能够更好地培养团队合作精神。
2.2 分层次精心设计选题
为了防止学生互相抄袭程序,课程设计的选题按照老师提供题目,学生自由选择或者随机抽取的方式来进行。
在课程设计题目的拟定上,为了能够更好地激发学习较好、动手能力较强学生的学习兴趣,同时兼顾学习较差,动手能力较弱的学生,使各层次的学生都能得到提高和锻炼,将课题按照难易程度分成了三种级别(一星级,二星级,三星级)。其中,三星级难度相对较大的题目,可由课程学习成绩较好的学生选择。
2.3 培养学生团队合作精神
学生自主组建课程设计小组,然后共同协商选择合适的选题。由小组组长负责(建议优秀的学生主动担任组长,带动组内基础和动手能力较弱的学生),小组成员自行对模块进行划分和任务安排,要求每个成员都有自己需要独立完成的模块,填好选题表。在任务实施的各个重要环节,要求每个组员都要积极参加讨论,出谋划策,相互帮助,形成一个良好的团队氛围,最后齐心协力完成设计任务。当然小组之间也可以相互帮助,共同攻克难题,这样一个任务完成后,学生的团队合作精神在不知不觉中就培养起来了。
2.4 培养学生交流表达能力
在课程设计的最后阶段,我们要求学生分小组集中答辩。答辩的主要目的是训练学生的表达能力。各小组先由小组长指派一位同学对整个项目进行综合性讲解,包括项目研究意义、整体设计思想、主要功能模块以及各成员的分工,展示设计成果,回答老师提问;再由小组成员针对自己完成的模块进行讲解,重点要讲出自己是如何根据实际问题定义相应的数据结构并解决问题的。
2.5 培养撰写文档的能力
培养学生按要点写出规范文档是课程设计需要培养学生的又一大能力,教师不光是要给出规范文档的要求和范例,还要给学生讲清楚为什么要这样写。我院的文档要求主要包括以下几个方面:
(1)问题描述;(2)ADT抽象数据类型定义;(3)模块调用关系;(4)详细设计:结构的定义;算法的描述;(5)分析与讨论;(6)参考资料;(7)致谢
2.6 考核成绩的评定
课程设计的总评成绩应包括平时表现、课设检查(包括成果展示和答辩情况)和课设报告三部分,三部分所占总评的比例分别为20%,50%,30%。
平时表现的成绩从学生是否按时出勤、课设过程中是否存在玩游戏的情况、是否服从老师管理等方面酌情评定。课设检查的成绩根据学生完成课设的实际情况来考核。本次课程设计要求课设检查统一采取学生答辩的形式来进行,即要求学生在完成课设的题目后,演示并讲解自己的程序,且回答老师提出的问题。指导老师主要从:问题的理解及解决能力,设计过程中独立工作能力,设计说明书p程序清单p开发的程序质量与工作量,设计题目的难度、先进性和实用价值,创新能力等方面进行评价打分(难度系数为一星级分数60~75,难度系数为二星级分数75~85,难度系数为三星级分数85~95)。要严格控制90分以上的高分人数,我们鼓励原创、鼓励创新、鼓励优化算法、鼓励扩展知识体系,只有做到了这些中的某些点才能给出90分以上的高分。课设报告的成绩根据学生完成的报告文档质量进行打分。课设报告若出现雷同或抄袭现象,报告的考核成绩一律为0分。
关键词 数据结构 教学模式 层次化教学
中图分类号:G424 文献标识码:A
1 数据结构在本科生教学中的地位
数据结构是计算机学科本科教学中的核心课程,课程知识丰富,内容抽象,实践性强,主要研究各种基本的数据结构在存储器中的映像和各种基本操作在相应的存储映像上的实现。学习本课程旨在使学生增强分析计算机所加工数据的数据结构特性,选择合适的逻辑结构、存储结构和相应的算法的能力,并初步掌握算法的时间效率分析和空间效率分析的技术,编写出高效的程序。①
数据结构作为实践性很强的计算机专业基础课,在计算机科学教育中有着重要的地位和作用。美国IEEE和ACM的教学计划均把算法与数据结构类课程列为计算机以及信息技术相关学科专业的本科必修基础课程。②
2 数据结构教学体系的实施和效果
数据结构课程内容比较抽象,教学中长期存在一部分老师重理论轻实践的现象,即使老师花费很多时间备课和授课,却经常出现学生只能大致明白算法思想,而无法真正实现算法的情况,学生逐渐对这门课程的学习失去了兴趣和信心。
由于我院的授课对象是三本学生,如果只是枯燥地介绍各种数据结构以及算法实现,学生很难理解并掌握相应知识点,最终只能勉强应付考试,而失去了学习该门课程的真正意义。为了实现课程的教学目标,使学生不但掌握数据结构的基本理论知识点,更要掌握各种经典算法,学会分析实际执行的算法,培养学生创造性地应用各种数据结构和算法,解决实际的应用问题的能力,以及探索和创新能力。针对我院学生的特点,在教学中采取层次化教学,既要培养多数应用型人才的实践能力,又要培养少数研究型人才的科研能力。
2.1 强化实践,注重培养能力
数据结构是一门理论性和实践性都很强的课程,培养学生的实践能力是教学的首要目的,理论知识的传授是为提高实践能力的,因此必须通过上机实验来加强实践能力。由于学生的学习主动性和学习能力各不相同,为了达到因材施教的目的,每个上机题目既要考虑学生总体的动手编程能力,又要考虑学生的个体差异,上机内容采取层次化思想。上机题目中包括了基础性、设计性和综合性实验,各种类型的上机题目之间存在着承接关系。经实践证明,采用由浅入深的上机实践环节,既有全体学生都能顺利完成的基础验证性题目,可以巩固并深化理论内容,实现教学要结合实际应用的特点,又考虑到学生专业特点和个性的设计综合题,培养了学生独立运用所学知识解决实际问题的能力,最大程度挖掘自身潜能。
2.2 注重引导学生思考,采用多样化的理论教学
课堂教学应把学生放在一种根本的、重要的位置上,从根本上确立以学生为主体的地位,把学生看成是积极的、富有创造性的程序语言使用者,而不是被动的接受者。为了避免传统的学生被动地接受书本知识的教学模式,在数据结构的教学中,采用“问题”组织教学,包括问题设置、学生通过思考和讨论提出解决方案、教师对学生的解决方案的评价并给出最佳解决方案。这样可以把课程的知识点转化为对某个问题的求解过程,使学生通过解决问题掌握知识。强调学生在学习和发展中的主体性和潜力的发挥,同时又不忽视教师的主导作用,通常采用小组协作式、个别化等教学形式或采用多种教学形式组合起来进行教学。数据结构教学的过程,实际上就是师生互相协作的一个过程。在课堂教学中充分发挥学生的主体性,让学生主动积极地去学习。
在教学方式中,如果只通过传统的黑板加粉笔的教学模式让学生通过脑海中执行静态的程序代码来了解数据结构的动态变化,这种方式缺乏直观性效果,难以充分展示算法的动态变化过程,学生难以想象数据之间的复杂关系。因此要充分利用多媒体教学课件动态地演示各种数据结构和算法,把知识生动、形象、动态地呈现给学生。
2.3 加强前导课程复习
学习本课程前学生虽已学过C语言程序设计与离散数学,但仅仅是初步掌握,并不精通,不能熟练运用程序设计语言进行编程。很难将算法转化成程序设计语言中的函数并编写出调用该函数的主函数,有的同学甚至直接将算法放到机器上运行,这是摆在学生面前的难题。针对以上情况,在开始讲授数据结构前,都会将之前学习的C语言程序设计中的数组、指针、函数、结构体和离散数学中的树和图相关知识进行复习,然后再开始学习数据结构。对于课程中的算法,除了讲解之外,部分算法在课上都会写出完整的源程序并运行,使学生理解算法和源程序之间的关系。
2.4 激励个性化学习,改革考核方式
在教学内容和实施上,适当考虑多样性和灵活性,对于应用型人才着重培养学生通过典型数据结构和算法实现的学习和训练,逐步掌握根据实际问题分析数据和数据结构,设计相应的运算和处理算法。对于研究型人才着重培养学生建立数据结构与算法的思维方法,形成数据结构和问题求解的知识体系,理解抽象的概念和复杂算法。对于能力较强的同学,可以选择一些数据结构应用等高级主题予以介绍,例如红黑树、伸展树、后缀树等复杂结构。学生在将来的科学研究和工程项目实践中将广泛接触到这些实用的数据结构和算法技术。
为了体现上机实践对该课程的重要性,我们在数据结构课程考核中采取重视上机实践成绩的考核方式,即平时成绩30%(其中上机占20%)+期末考试成绩70%的形式对学生学习成绩予以评价。
3 结语
以“学”为中心的教学设计,设计起来容易,因为那只是做一些决策。难在具体地教学实施。只有在教学实施过程中才会检验出教师是否真的坚持以“学”为中心的教学。教学过程中,以学生为主体,教师为主导,让学生体会到数据结构是一门与实践紧密联系且非常有趣的课程。通过数据结构的学习提高了学生的逻辑思维能力和数据抽象能力,提高了设计高质量程序的能力,为学生奠定了扎实的软件开发基础。
注释
关键词:数据结构;教学设计;教学目标;内容体系
中图分类号:TP3-0 文献标志码:A 文章编号:1674-9324(2013)08-0209-04
一、引言
《数据结构》是计算机科学与技术及相关专业的一门非常重要的专业基础核心课程,其主要研究内容是数据之间的逻辑关系和物理实现,即探索有利的数据组织形式及存取方式。有关计算机的各类软件的开发和设计,首先要考虑数据的表示,即使用何种类型的数据结构。因此,如何更好地解决实际问题,仅仅依赖几种计算机程序设计语言是不够的,还必须学习和掌握好数据结构的有关知识。当我们使用计算机来处理一个具体问题时,一般需要经过下列几个步骤:首先要从该具体问题抽象出一个恰当的数学模型,然后设计出解决此类数学模型的算法,再编写相应的程序并进行调试、测试,运行程序并最后得到答案,如图1所示。
早期计算机为解决问题而涉及的运算对象都是一些简单的数据类型,如整型、实型或布尔类型数据,所以一般把着重点放在程序设计的技巧上,而不必重视数据结构。随着计算机的发展,它的应用领域的不断扩大,涉及非数值计算问题的应用所占的比例越来越大,许多问题涉及到的处理对象不再是简单的数据类型,其形式更加多样,结构更为复杂,因此,解决这类问题的关键不再是数学分析和计算方法,而是要设计出合适的数据结构,以便更有效地解决问题。
二、课程说明
1.课程的定位。《数据结构》这门课程,是计算机理论与技术的重要基石,该课程一般是在大学二年级上学期开设,具有承上启下的重要作用,既要对前一年学习的软件技术进行总结提高,又要为后续专业课程提供基础。它贯通始终,是计算机科学与技术人才素质培养框架中的中坚课程,对学生的软件开发能力培养至关重要,也为学生今后的专业生涯打下牢固的基础。所以《数据结构》课程是计算机专业提高软件设计水平的一门关键性课程,它在整个课程体系中具有非常重要的地位。《数据结构》课程在计算机学科中与其他课程的关系如图2所示。
2.课程的教学目标。温州大学瓯江学院作为独立学院,其定位为培养“应用性”本科人才,同时结合本课程的地位,因此,在本课程的教学中体现“基础性”和“应用性”。本课程的定位与目标是:①注重基础性:掌握基本数据结构的特点,了解数据结构与算法的关系;培养学生的算法设计与分析的基本理论知识和技能;培养学生设计及选择有效的算法、设计合适的数据结构的能力;增强学生发现问题、分析问题和解决问题的能力。②突出应用性:本课程强调理论和实践的统一,突出对学生的动手能力的培养。在对学生进行基本数据结构的理论、技术和设计等的知识运用和技能培养的同时,突出对学生进行将实际问题转化为基本数据结构和算法问题的分析能力。鼓励学生学以致用,用学到的知识来解决实际问题。
3.课程内容体系。数据结构课程的内容主要是围绕着数据的逻辑结构、数据的物理结构(数据在计算机中的存储方式)和选用合适的算法来实现对数据的相关操作展开。数据的逻辑结构有:线性结构、树形结构、图结构;数据的物理(存储)结构有:顺序存储结构和链式存储结构。在教学中引入抽象数据类型(ADT)观点介绍数据结构技术,采用算法时空分析来判断算法的好坏。在此基础上介绍数据结构的具体应用。数据结构课程的内容体系如图3所示。
我们把数据结构课程的内容划分为基础部分、数据结构与算法部分和应用部分。基础部分的内容有数据结构与算法的基本概念,抽象数据类型(Abstract Data Type,简称ADT)的表示,算法时空分析(算法复杂度)等。数据结构与算法部分是课程的核心内容。介绍各种基本数据结构的特点、ADT、各种存储实现方法、相关的操作的实现。应用部分主要介绍排序、查找(或检索)、索引和散列等经典算法。
三、理论教学设计
1.教学方法与手段。由于独立学院的学生本身基础不够扎实,加上《数据结构》课程理论性强,内容抽象,学生在学习该课程的开始阶段,容易产生畏惧和茫然的情绪。为了提高教学质量,我们在对教学方法和教学手段等方面进行了有益的探索和尝试。要处理好多媒体教学模式与传统教学模式之间的关系。多媒体教学模式以其形象性、生动性和信息量大等特点已成为主要的课堂教学手段,但也存在一些不足,一方面影响教师的即兴发挥,而这恰是传统黑板教学的长处;另一方面,由于多媒体教学具有信息量大、呈现快速、表现直观、操作简便的特点,教学活动很容易出现“课件喧宾夺主”的不良倾向。笔者认为,在讲述如算法思想、编写程序时,采用传统的教学模式更能清晰地表达。因此,在教学中要综合使用多媒体教学模式与传统教学模式两种教学手段,以达到良好的教学效果。
2.把握课程的重点和难点。①课程的重点。基础部分:数据结构的有关概念术语、算法特性、算法描述和算法分析;数据结构与算法部分:线性表、栈、队列、串、树、二叉树、图等数据结构的逻辑结构、存储结构、相应基本操作的实现,这些基本数据结构的应用:一元多项式的运算、递归算法的设计和实现、哈夫曼算法的实现和哈夫曼编码的设计、最小生成树和最短路径的求法及实现;应用部分:顺序查找算法的设计,二分查找算法的设计,二叉查找树的创建、查找、插入和删除的算法的设计,散列表的建立和查找算法的设计;直接插入排序算法、冒泡排序算法、简单选择排序算法、快速排序算法、堆排序算法和归并排序算法的实现,这些排序算法的性能比较。②课程的难点。基础部分:抽象数据类型(Abstract Data Type,简称ADT)概念的理解和描述,算法时间复杂度和空间复杂度的估算方法;数据结构与算法部分:栈在递归函数中的应用,模式匹配KMP算法。图的遍历方法、Dijstra、Floyd、Prim、Kruskal等典型的图应用算法;应用部分:排序算法的复杂性分析,排序方法在各类实际问题中的应用。散列表的建立和查找算法的设计。
四、实验教学设计
1.实验类型。根据独立学院应用型人才培养目标,注重培养实践动手能力,结合教育部的“面向21世纪教学内容和改革计划,保留少量必开的经典验证型实验,增开综合型、设计型实验”的精神,为了保证实验课的正常运行,完成实验教学目标,针对独立学院学生普遍编程能力比较弱,C程序设计语言基础较差的情况,我们打算增开一些巩固C语言的课程预备型实验,保留了必要的经典的验证型实验内容,增加设计型实验,加强综合型实验,使得实验类型不再单一,实验内容更显层次化,做到既要有基本实验的训练,又有独立思考、综合运用知识、创新等能力和素质的培养。预备型实验:主要加强学生C语言的薄弱环节,如结构体、指针、数组、函数调用等,掌握C语言的这些知识点是完成数据结构实验的有力保证。验证型实验:主要是为了理解和巩固数据结构的基本知识点,用来验证典型数据结构的逻辑定义及在具体存储结构下的相关操作实现。综合型实验:实验内容涉及本课程的综合知识或本课程相关课程知识,主要是为了培养学生的综合分析能力、实验动手能力、数据处理能力及查找参考资料的能力。
2.实验方法。对于验证型实验,学生在做实验的任务基本上,只是将课本的算法修改为在某种编程语言环境下可以运行的程序而已。但对于设计型和综合型实验,尤其是综合型实验,它是多个知识点的综合训练,包括问题分析、总体结构设计、程序设计等基本技能,需要用更科学的实验方法系统地完成。所以,为完成《数据结构》实验,我们引入软件工程的方法来指导实验,以实现实验方法的规范化。需求分析:说明实验的主要任务,如输入的形式和输入值的范围、输出的形式、程序功能和测试数据等。概要设计:说明本实验中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次调用关系。详细设计:实现概要设计中定义的所有数据类型,对每个操作用程序设计语言编写代码;画出函数之间的调用关系图。调试分析:调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;算法的时间复杂度与空间复杂度的分析;算法的改进设想。
3.实验过程。数据结构课程实验同其他课程不同,在上实验课之前需要做大量的准备工作,整个实验从开始到结束不可能在有限的实验计划课时中全部完成,因此对整个实验过程的控制和管理显得非常重要,要求对每一次实验课都进行精心地策划,我们主要从课前预习阶段、实验操作阶段和实验总结阶段等三个阶段进行改革,以实现实验过程的规范化。课前预习阶段:以往的实验教学环节,往往是学生到了课堂上才知道实验的内容,学生往往措手不及,这不利于实验教学的正常开展。现在我们采用把每个实验内容提前放在网上,要求学生课前充分预习,详细了解实验目的和原理、实验要用到的数据结构和算法,在实验之前必须提交实验预习报告。通过课前预习,保证学生在实验中思路清晰,能及时发现问题,易于取得实验的成功。实验操作阶段:学生上机实验的过程是实验成败的关键,我们一方面培养学生在实验过程中养成做实验记录的良好习惯,另一方面引导学生在实验过程中积极思考,当出现异常情况时,教师要指导学生分析其产生问题的根源,寻求解决问题的方法。学生在每次实验结束后,要将实验记录交给教师检查签字。实验总结阶段:这一阶段要求学生完成高质量的实验报告,实验报告中除了包括数据结构定义、算法思路、异常情况分析、测试数据及运行结果等必备的内容外,更重要的还要包括实验设计实施的成败得失、经验教训和心得体会。整理和填写实验报告的过程,即是学生对自身存在的问题进行修正和完善的过程,通过分析整理实验报告,学生可以更深刻地认识到自己在实验中存在的问题,加强其设计思维的训练,也能不断地积累解决实际问题的动手能力。
五、课程考核
1.《数据结构》课程的考核学生成绩以100分制评定,其中,平时成绩(包括书面作业、课堂测试、期中测试),占总成绩的15%;考勤和学习态度,占总成绩的5%;上机实习(加实习报告),占学期总成绩的20%;期末考试,占总成绩的60%。
(玉林师范学院 数学与信息科学学院,广西 玉林 537000)
摘 要:提出在主流数据结构教材基础上进行课程改革,包括降低课程难度、充实核心章节、精简次要部分、引入面向对象思想描述抽象数据模型、增加4类习题和上机任务等。
关键词 :数据结构;抽象数据类型;教学改革
基金项目:2014年广西高等教育教学改革工程项目(一般项目A类)“移动互联网背景下信息与计算科学专业应用型人才培养模式的研究与实践”(2014JGA207)。
第一作者简介:程裕强,男,讲师,研究方向为中文信息处理、本体论、语义网,chegnyuqiang@qq.com。
0 引 言
人类解决问题有三种途径,一是理论分析,二是计算(也称算法),三是实验。数据结构课程属于第二种计算范畴。数据结构的学习有利于培养学生的模型抽象能力和算法设计能力以及创新性思维。现在越来越多的专业开始将数据结构课程设置为核心专业课程,数学类、经管类等专业也设置数据结构为选修课。数据结构是数据库、操作系统、计算机网络等课程的先修课程,数据结构课程的学习效果对后继课程有着重要的影响。
1 数据结构教学中存在的问题
与其他专业课程不同,国内高校选择的数据结构课程教材相对单一,主要是1997年严蔚敏和吴伟民主编的《数据结构(C语言版)》[1]。该教材的最大优点是数据结构描述较为全面、言简意赅,适合学习能力较强的985和211等重点高校相关专业的学生使用。对于非重点本科高校以及高职高专的学生而言,该教材具有一定难度,存在如下问题:①该教材使用类C来描述数据结构,使用了部分C++特性,而大部分非重点高校的学生在学习数据结构之前没有学习过C++语言,让他们将类C描述的数据结构转换为具体的C语言代码时具有一定难度。②C语言在描述数据结构时表述不方便。由于C++语法较为复杂,如果引入C++相关语法,又会大大增加数据结构课程的教学难度。③该教材于1997年编写,至今已过去将近20年,有些章节没有更新过。④该教材每章结束处缺少习题,虽然编者提供了另一本配套的习题参考书[2],但在实际中需要重新购买,且该习题参考书所设计的习题难度较大,不适合非重点院校使用。
2 数据结构教学改革措施
2.1 使用纯C语言描述,降低难度
1)删除&参数传递。
在描述数据结构操作算法时,可能需要实现参数双向传递。教学实践中,我们将C++的&参数全部转换为C语言的指针操作,虽然增加了算法表达的复杂性,但是在算法具体实现时带来了极大方便。
2)减少复杂的动态内存分配操作。
在构建数据结构时,不宜面面俱到,应做到主次分明,重点分析问题的核心流程,次要问题的处理点到为止即可,不需作深入描述。比如对于数据存储结构中关于存储空间扩展问题,在数据结构设计中可以简单说明或者注释一下,不宜使用大量代码来处理这个问题,容易造成代码结构复杂,主次混乱,增加学生理解的难度。例如,严蔚敏主编的数据结构教材出现最多的顺序存储结构的代码如下:
这种结构对于数据结构的初始化操作和添加新元素的操作带来了复杂性,虽然考虑问题周全,但是算法语句的主次情况不清晰,可读性差,算法逻辑结构复杂。比如对于添加新元素的操作算法,需要考虑“当前存储空间已满,增加空间”的问题,在算法中需要增加如下代码:
可以使用数组来描述顺序存储结构,这样做的好处有两个:一是大部分二本院校的学生C语言基础不扎实,特别是对于指针操作,采用数组可以减少指针的使用,降低数据结构表述的难度;二是数组描述的顺序存储结构不会改变相关操作算法的本质。比如对于栈使用顺序存储结构描述时,简化后的代码如下:
其他代码省略。对于栈满情况,只是简单判定,没有进行存储空间扩展操作,这样对于进栈操作push()的核心流程更加清晰。
3) 删除指针函数。
在数据结构设计中,较多涉及数据元素的比较问题,而对于不同类型元素的值比较,C语言没有通用的函数。严蔚敏主编教材中引用函数指针来解决这个问题,对指针函数,学生大多望而生畏。可以在教学中暂时删去指针函数,不会改变算法设计的本质。
4) 统一数组下标。
与C语言保持一致,数据结构中涉及数组,其下标统一从0开始。
2.2 引入面向对象思想描述数据结构
数据结构课程的主要任务是培养学生对模型的抽象能力,可是C语言在数据模型抽象时存在先天不足。在实际教学中,甚至出现学生编写的数据结构代码不能运行的情况,因为学生没有理解数据结构的本质,没有明白数据结构代码实现是对某一数据模型的实现,不知道对该数据模型的测试需要再提供一个主函数。
面向对象语言具有较强的数据模型抽象能力,但是数据结构课程开设时学生还没有学习面向对象语言,这也是国内数据结构教学主要使用C语言或类C的原因。我们提出使用面向对象思想来描述抽象数据类型ADT,在算法具体描述时使用纯C语言,最后在数据结构实现时提供纯C语言版和Java语言版[3]。两种不同语言实现的数据结构,通过纯C语言版代码可以方便阅读Java语言版代码,反过来通过阅读Java语言版代码又可以加深对纯C语言版代码的理解。
我们以顺序存储结构的栈为例来说明,首先从抽象数据类型角度来看待数据结构Stack。
抽象数据类型的描述以及面向过程语言和面向对象语言实现对比,可以让学生更好地从抽象数据类型角度来思考数据结构。
2.3 删除次要章节,充实核心章节
首先,增加“预备知识”一章,复习C语言的主要语法,补充Java语言的简单语法部分(不涉及Java语言高级特性)。对于非重点院校来说,部分学生的C语言基础不扎实,需要复习一下C语言的核心语法。由于采用面向对象思想来描述抽象数据类型,需要引入简单的面向对象语法。而C++语言本身语法较为复杂,没有C++语言基础的学生难以看懂C++描述的数据结构算法,Java语言在C++语言基础上进行了简化,在C语言的基础上,学生只需了解简单的Java语言即可掌握使用Java语言来描述数据结构[4]。Java语言最大的特点是有完善的描述抽象数据类型的类定义机制[5]。
其次,对于栈与队列一章,栈与队列是一类特殊的线性结构,重点不是链式结构而是顺序存储结构,补充共享栈和两类循环队列以及递归机制的描述。
第三,对于串一章,使用合并定长与堆两种描述的优点,统一使用数组存储结构描述。
第四,简化数组与广义表一章,删去m元多项式与广义表相关内容。
第五,简化哈夫曼树问题和最短路径问题等非线性结构的描述。哈夫曼树算法较为复杂,如果引入堆结构进行描述,可以降低其算法难度。对于多源点最短路径,可以增加矩阵计算过程来降低算法理解的难度。
第六,充实快速排序相关内容。快速排序以及改进方案是IT企业面试中最常问到的问题,这部分内容需要充实。
第七,删去动态存储管理和文件两章内容。
2.4 增加习题与上机任务
单独提供与数据结构教材配套的习题集和上机指导参考书,虽然可以有足够的空间来展现丰富的习题和详细的上机指导,但是独立的参考书使用不方便。我们提出在数据结构教材中适当添加具有阶梯难度的习题和上机任务。
1)增加习题。
在每章内容结束时,增加相关习题,习题内容需要涵盖基础概念题、全国二级等级考试题、经典考研试题和企业面试题。每章习题平均为10道,对于不同章节可以适度调整,比如关于树与图两章,相关内容较多,可以增加题目数;关于排序一章,企业面试题较多。总体习题设置见表1。
2)上机任务。
由于教材版面限制,每一章提供两道精选的上机任务。比如对于栈,设计一道上机任务:编码实现抽象数据类型栈Stack,并利用Stack求解一个整数的2进制形式。该上机任务包含了栈Stack基本概念与编码实现,进而进行简单应用。上机指导教师可以根据所在院校上机报告具体形式和实际的教学效果进行指导。
3 结 语
多年的数据结构教学实践表明,我们提出的数据结构课程改革方案,对于非重点院校来说是急需的、可行的。新的教学方案一方面降低了课程教学难度,方便学生自学,提高了学生的学习兴趣;另一方面增强了前后课程的联系,特别是C语言、数据结构和面向对象程序设计语言。下一步工作是总结教学经验,编写适合广大非重点二本院校以及高职高专院校的数据结构教材。
参考文献:
[1] 严蔚敏, 吴伟民. 数据结构(C语言版)[M].北京: 清华大学出版社, 1997.
[2] 严蔚敏, 吴伟民, 米宁. 数据结构题集(C语言版)[M]. 北京: 清华大学出版社, 1999.
[3] 梁燕来, 程裕强. Java面向对象程序设计[M]. 北京: 人民邮电出版社, 2013.
[4] 程裕强. 编程语言中浮点数精度丢失问题[J]. 计算机安全, 2013( 6): 59-61.?
关键词:python;数据结构;算法;图的遍历
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)33-7593-03
计算机信息处理依赖于有效算法的设计,信息处理时间是衡量算法有效性的重要测度,算法是基于特定的数据结构实现的,所以算法的设计与数据结构的选择会影响到算法的执行效率。算法程序的实现需要使用某种特定的语言,Python语言是一个混合体,丰富的工具集使它介于传统的脚本语言和系统语言之间,工具集中提供了Python内置数据结构作为语言的基本组成部分。
本文分析了python内置数据结构,基于python内置数据结构构建了栈、队列、图等数据结构,并实现了图的深度优先遍历算法,熟练应用python内置数据结构可以构建算法依赖的如树或图等较为复杂的数据结构,有助于大型开发项目数据信息的高效规范处理。
1 python内置数据结构
Python中有四种内置数据结构——列表、元组、字典和集合,它们用来存储一组相关数据,可以应用于简单的算法操作中。
1.1 列表
列表(list)是处理一组有序元素的数据结构,类似于java中的ArrayList,常作为函数的返回类型,列表中的元素应该包括在方括号中,每个元素之间用逗号分割。列表可以实现添加,删除,查找等操作,列表元素的值可以被修改。
列表的append方法将添加的元素排在列表的尾部,被添加的元素可以是元组、列表、字典等任何对象,remove方法删除指定元素,insert方法将给定元素添加到指定位置。列表支持分片、负索引操作和连接操作,所以列表是一种可变的数据类型。
列表的查找有两种方式,一种是使用index方法返回元素在列表中的位置,另一种方法是使用保留字in来判断元素是否在列表中。
列表分别用sort方法和reverse方法实现列表自身的排序和逆序。
1.2 元组
元组(tuple)相当于只读数组,由不同的元素组成,每个元素可以存储不同的元素,如字符串、数字甚至元组,元组中的元素应该包括在圆括号中,每个元素之间用逗号分割。
python中创建元组的过程成为打包,元组创建后其内部元素的值不能被修改,不能添加或删除任何元素,和字符串一样是不可变的。
元组中的元素可以通过索引方式即一对方括号指明某个元素的位置来访问,元组的下标可以为负数,即支持负索引、分片操作。
可以将元组的元素分别赋给各个变量,避免用循环去获取每个元素的值。可以用python内置函数range()和len()遍历元组,len()计算出元组中元素的个数,range()返回由一个数字组成的列表。
1.3 字典
字典(dictionary)是由键/值对组成的集合,值通过键来引用,键必须是唯一的且只能使用不可变的对象(比如字符串),值可以是不可变或可变的对象。
键/值之间用冒号分割,键/值对之间通过逗号隔开,并且被包含在一对花括号中,键/值对是没有顺序的。
通过一对方括号和索引可以访问字典。字典的添加、修改通过一条赋值语句如dict["x"]= value可以实现,如果x对应的值在字典中,则可以修改字典的内容,如果x对应的值不在字典中,则添加相应的字典元素。python内置函数del()可以删除指定的字典元素。字典方法pop()可以删除参数索引所指定的元素,方法clear()可以清空整个字典。
通过字典方法items()可以实现字典的遍历,items()方法返回由若干元素组成的列表,items()把字典中每对键/值组成了一个元组,并把这些元组放到列表中返回。
1.4 集合
集合(set)是没有顺序的简单对象的聚集。当在聚集中一个对象的存在比其顺序或者出现的次数重要时使用集合。使用集合,可以检查是否是成员,是否是另一个集合的子集,得到两个集合的交集。
2 python内置数据结构的应用
基于python的内置数据结构可以构建其它较复杂但更实用的数据结构,可供相关算法采用。下面主要实现了栈和队列的构建、图的表示和深度优先遍历算法的实现。
2.1 栈和队列的构建
栈是只允许在一端进行插入或删除的线性表,具有后进先出的操作特性。队列也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除,其操作特性是先进先出。栈和队列都可以基于python内置结构列表实现,进栈/队列用列表的append方法,出栈/队列用列表的pop方法,并且需要用python内置函数len检测列表的长度。栈和队列的实现类似,栈结构实现代码如下。
class Stack:
def __init__(self,size = 16):
self.stack = []
self.size = size
self.top = -1
def setSize(self, size):
self.size = size
def isStackEmpty(self):
if self.top == -1:
return True
else:
return False
def isStackFull(self):
if self.top +1 == self.size:
return True
else:
return False
def getTop(self):
if self.isStackEmpty():
raise Exception("StackIsEmpty")
else:
return self.stack[self.top]
def push(self,obj):
if self.isStackFull():
raise Exception("StackOverFlow")
else:
self.stack.append(obj)
self.top +=1
def pop(self):
if self.isStackEmpty():
raise Exception("StackIsEmpty")
else:
self.top -= 1
return self.stack.pop()
def show(self):
print(self.stack)
2.2 图的表示和深度优先遍历算法实现
图G由顶点集V和边集E组成,如果点对是有序的,那么图就是有向图,无向图中顶点间的连接是没有方向的。若给定某有向图G1=(V,E),其中V={1,2,3,4,5,6},E={(1,2),(1,4),(2,1),(2,3),(3,5),(4,3),(4,5)},通过python内置列表和字典可实现图的表示,如graph={1:[2,4], 2:[1,3],3:[5],4:[3,5],5:[] },graph是一个字典,每个键都是图的顶点,每个键的对应值是一个列表,列表包含与键所代表的顶点邻接的顶点。
图的深度优先遍历算法是指首先访问某个源顶点vi,然后由vi出发,访问与vi邻接且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2,……,一次遍历能够访问图中的一个连通分量,访问的顶点和边存储在表示图结构的字典graph中,代码编写如下:
class Graph():
def __init__(self, graph):
self.visited = []
self.visited = [0 for i in range(len(graph)+1)]
self.dict = graph
def DFSGraph(self, source):
self.visited[source] = 1
print source,
if self.dict.get(source):
for v in self.dict[source]:
if self.visited[v]==0:
self.DFSGraph(v)
图的深度优先遍历在有向无环图的拓扑排序或寻找图的关节点等算法中有重要的应用。
3 结束语
文中利用python内置数据结构构建了栈和图,实现了图的深度优先遍历算法,诸如二叉树、二叉排序树、散列表等程序中常用的数据结构,都可以在字典、列表等python内置结构基础上实现,多注重灵活运用内置数据结构将会提高解决程序实际问题的能力。
参考文献:
[1] David B.Python Cookbook[M].New York:O'Reilly Media,2013.
[2] Wesly M.Python for Data Analysis[M].New York:O'Reilly Media,2013.
[3] Robert S.Algorithms[M].New Jersey:Addison Wesley,2011.
关键词: 数据结构;教学方法;学习兴趣;专业素养
中图分类号:G424 文献标识码:A 文章编号:1009-3044(2013)14-3338-02
任何软件开发人员和计算机相关专业人员都离不开编程,而编写的程序性能如何往往取决于采用什么样的逻辑结构、存储结构以及解决问题的具体方法和步骤。数据结构是c语言程序设计的后续课程,也是计算机相关专业的一门核心课程,主要分为树型结构等逻辑结构、存储结构及其相关运算,算法是解决问题的步骤,因此,编程需要考虑数据结构和算法两个方面的问题,算法的设计取决于数据的逻辑结构,算法的实现依赖于数据的存储结构,编写程序时所依据的算法采用哪一种数据结构严重影响程序的执行效率。通过最近几年的教学调研笔者发现只有5%的学生对数据结构学习感兴趣并会在优化算法时巧妙使用,20%左右的学生对数据结构学习感兴趣,也知道在算法设计时有用,但懒得去用,75%左右的学生对数据结构学习毫无兴趣,只是为了应付考试和拿到学分。因此,如何通过改进《数据结构》的教学方法来提高学生学习兴趣并使学生具备较高的专业素养是一个值得探讨[1]和研究的话题。
1 教学现状
在诸多高校的《数据结构》课堂教学中教师讲课以教师为主体,对学生进行填鸭式教学,以完成教学任务为目的,只要学生会做题就够了,从不考虑其应用价值,将理论与实践相互分离,导致有些学生对于学习数据结构课程的目的和意义不明,或者不知道学习本节课到底对编程有何用,缺乏学习主动性,缺乏发现问题、独立思考问题和解决问题的能力,专业水平不高,再加上《数据结构》本身又是一门比较抽象的课程,学生学起来更觉得比较枯燥乏味,学习兴趣不高。
2 教学策略分析
教师除了认真备课、讲课以及督促学生养成课前预习、课后复习并进行巩固练习的习惯之外,还要讲究授课技巧和方法,该文运用任务驱动法和启发式教学法从学生比较熟悉的嵌套的if语句着手深入浅出地去讲解最优二叉树,既可以将所学知识点由繁变简,将不同学科的知识点进行融会贯通,又能强化学生的编程能力,培养学生的专业素养,调动学生学习主动性,使学生成为课堂的主体,激发了学生对《数据结构》的学习兴趣。
3 新型的数据结构教学方法在教学中的应用举例
首先创设问题情境,要求学生用嵌套的if语句表示一个分段函数并给出对应的判定过程,学生在黑板上编写出不同的算法,提示学生执行时间越少的算法效率越高,然后通过比较每个算法的执行时间找到最高效的算法,最后明确教学目的,通过构造Huffman树寻求程序的最优解。教学实践表明,这样上课会激发学生学习兴趣,增强学生学习的好奇心和求知欲,变“要我学”为“我要学”,使学生成为课堂的主体,教学效果较好。
3.1任务一:创设问题情境
3.3 任务三:最优二叉树的构造方法[2]
在同等条件下,依据最优二叉树可以直接快速编出最高效的算法3,下面以21,38,20,14,7为权,阐述构造一棵有5个叶子的最优二叉树的方法。
1)将每个权值看成是只有一个结点的二叉树,则它们构成一个森林T。
2)从T中取出两棵根最小的二叉树作为左右子树构造一棵其根为这两棵二叉树的根之和的二叉树并将这棵新生成的二叉树放入T中。
3)重复步骤2),直至森林中仅有一棵二叉树为止。
通过构造最优二叉树可以得到描述判定过程的判定树,它可使大部分输入的数据结构成绩经过最少的比较次数得出所有学生的考试等级,按此判定树即可编写最优的程序,学生学习兴趣增强,从“要我学”变成“我要学”的学习态度。
4 结论
笔者以最优二叉树为教学实例,将任务驱动法和启发式教学法用于课堂教学,揭发了数据结构的实质性问题即优化程序,进而使学生真正体会学习这门课的意义,使学生从思想上真正重视这门课程并对这门课感兴趣, 主动学习,认真听课,不仅培养了学生专业素养,又提高了课堂教学质量。
参考文献:
关键词:高职;数据结构;实验教学
中图分类号:G424 文献标识码:A 文章编号:1006-4117(2012)01-0275-01
数据结构课程是计算机专业的重要基础课,主要介绍和研究数据在计算机中的存储和处理方法[1],其实验课程通过上机实践,利用C/C++等高级程序设计语言对理论知识进行验证,达到理解和巩固理论知识的目的,是整个课程学习中的一个重要环节。
一、高职数据结构实验课程存在的问题
在传统的数据结构实验中,有指定的实验课教材,记录了理论课中所有算法的实现程序,由教师向学生详细讲解算法的理解、实现过程和运行结果,学生只要按照教材上机编辑并调试通过,验证一下结果就可以了。这样的教学模式使学生毫无学习兴趣,也不用动脑思考,并且由于高职学生大多学习基础较差,对于程序设计语言中的数组、结构体和指针等知识掌握不够,根本不能理解大量的复杂算法,只是机械的录入,使上机调试变得十分困难,这就失去了开设该课程的意义。为了能够更好的发挥实验课程的作用,使学生提高程序设计能力,理解数据结构研究数据处理方法的意义并掌握基本的算法设计,我针对高职学生特点,在实验课程的教学内容、教学方法及考核方式进行了初步探索。
二、实验教学改革的具体措施
为了能够更好的发挥实验课程的作用,使学生提高程序设计能力,理解数据结构研究数据处理方法的意义并掌握基本的算法设计,我针对高职学生特点,在实验课程的教学内容、教学方法及考核方式进行了初步探索。
(一)夯实基础,弥补先行课知识的不足
由于程序设计语言课程课时少、内容多,学生接受能力差等原因,导致其教学内容往往停留在初级阶段,关于数组、指针、循环、结构体等内容,学生没有成分的时间去理解和吸收,但这些内容是数据结构实验课必不可少的基础内容,所以,在课程的初期,教师要带领学生弥补先行课知识掌握的不足,深入解析指针和循环的有关内容,设计一些简单的应用数组及结构体编程的任务,让学生上机独立完成。这样不仅可以夯实学习数据结构实验课程的基础,达到良好的知识迁移效果,而且可以使学生在完成任务的同时,体会成功,建立学习的兴趣和信心。
(二)逐步添加,合理安排教学内容
在数据结构这门课程中,根据数据的不同逻辑结构,又结合数据的存储结构,总结出数据处理的许多具体算法,在实验教学中逐一实现所有算法是不必要的也是不实际的。所以教师必须对该课程的知识点进行梳理和规划,合理安排教学内容,使实验中的知识点随着教学进度逐渐增加。
考虑到高职学生的接受能力,实验的内容不宜选择较复杂的实验项目,只要能够使学生通过典型算法的实现,循序渐进地理解算法的实现方法及后续改进策略,掌握数据结构的本质,提高程序设计能力就可以了。
如C++程序设计语言中的数组与数据结构中顺序存储的线性表是不同的,但学生在学习之初并不能透彻理解二者的差异。教师可以先设置一个对10个整数进行升序排序的算法,学生只要在main()函数中定义int a[11]及循环变量 int i,j,应用循环嵌套就可以实现了,然后教师再增加任务,要求在数组中连续插入若干不同数据,使数组仍然保持升序,并输出每次数据插入前后数组的状态。如果学生仍然应用数组,在原程序基础上修改就会十分繁琐,并且输入输出语句和插入程序代码不断重复出现。这时教师再引导学生通过三方面修改程序,首先应用线性表的顺序存储,将数据定义修改为
const int m=50; //设不超过50个数据
struct L{
int list[m];
int n; //n为线性表当前长度
};
其次,针对输入输出及插入代码的不断重复出现,定义插入、输入和输出算法,并添加函数声明。最后完成主函数的设计。
通过这样逐渐添加任务要求,可以从完成任务的过程中体会到学习数据结构的意义,掌握算法的具体实现方法,在知识的逐渐积累和更新中,增强学习信心,提高编程能力和理论应用于实践的能力。
1、组建学习小组,促进学习互助与提高。考虑到高职学生学习水平的差异性及数据结构实验课程的难度,教师无法在课堂上对程序的编辑、调试及改进做逐一的指导,这样将造成一部分学生跟不上教学进度,当无法完成任务时就以抄写实验报告等方式蒙骗过关,久而久之丧失了学习的兴趣和信心。对此可以在教学中组建5人左右的学习小组,将程序设计水平较好的学生与学习困难的学生组织到一起,共同完成各项学习任务,促进学习互助和自主探究,达到实践水平的共同提高。
2、改变考核方式,保证学习效果。合理的考核方式是数据结构实验课程取得良好效果的保证,为了切实达到促进学习的目的,要彻底改变过去单纯依赖实验报告定成绩的现象,针对课前准备、上机实践和实验效果三个方面制定考核标准。要求学生在上机实验前做好相关知识的预习,完成算法的初步设计,拟定实验数据,在上机实践过程中要求学生边实践边记录所遇到的问题及解决方法,记录算法的实现和运行结果,实现算法的改进并记录未解决的问题形成新的记录报告;对实验过程及结果及时作出总结,如怎样设置输入输出能改进程序的可读性,采用哪种存储结果使算法更加简单灵活,怎样定义算法更利于修改等等。总之,教师要针对实验的各个环节提出具体要求和考核标准,定性定量地从各个方面评定实验成绩,调动学生的积极性和自主性,保证实验教学的学习效果。
作者单位:营口职业技术学院计算机系
作者简介:郭洪荣(1974―),女,汉族,辽宁营口人,营口职业技术学院计算机系,讲师,计算机专业学士学位,教育学原理硕士学位。
参考文献:
[1]徐卓群.数据结构[M].北京:中央广播电视大学出版社,2001.
关键词:数据结构;研究型人才;工程型人才;案例教学法
作者简介:王作为(1980-),女,山东莘县人,天津工业大学计算机科学与软件学院,讲师。(天津 300387)邹晓健(1978-),男,吉林德惠人,军事交通学院政治部,讲师。(天津 300387)
基金项目:本文系天津工业大学高等教育教学改革研究基金项目的研究成果。
中图分类号:G642.0 文献标识码:A 文章编号:1007-0079(2013)04-0058-02
“数据结构”是一门研究非数值计算的程序设计问题中有关计算机的操作对象以及它们之间的关系和操作等的学科。[1]“数据结构”作为计算机和信息等专业的核心课程,在教学体系中起着举足轻重的作用。
2006年,教育部计算机专业委员会提出了计算机科学与技术本科专业的“分类培养”的教育目标,并具体将计算机专业人才培养分为“研究型”及“工程型”两大类。[2]该目标的提出为计算机课程建设及改革提出了新的要求,计算机专业课程的改革应该根据社会的需求及学生自身的实际情况,为学生提供不同类型的教学计划和培养方案,并具体改革相应的教学方法。因此,加强“数据结构”课程建设,探讨不同类型培养目标的教学方法是非常必要的。
目前,“数据结构”课程建设主要关注教学手段的完善,例如“数据结构”课程教学网站的建设、[3]动态教学软件的研究以及案例式教学方法的实施,[4,5]很少顾及不同类型的人才需要不同的案例引导。另外,我国计算机专业的本科教育一般着重于培养工程型计算机专业人才,对于研究型人才的培养从研究生阶段才开始重视,这样导致了不少学生对于研究生阶段的学习不能很快适应,他们的创新能力差。
本文重点探讨针对不同类型的培养目标,提出“因材施教”的教学模式。实施的重点在于案例选择的侧重性、学生的主动性以及针对不同类型学生所要采取的教学方法,力争突出研究型人才的培养模式,经过课程组多年的摸索与实践,不断地改进与发展,在培养不同类型人才方面取得了良好的效果。
一、“数据结构”教学现状分析
“数据结构”课程的核心可概括为以下几个方面:数据的逻辑结构;数据的存储结构;在不同存储结构的基础上对不同数据结构的操作并讨论一些经典的算法。在教学过程中发现,学生对数据的逻辑结构的理解较容易,对数据存储结构的理解相对较难,对不同存储结构基础上的不同数据结构中算法的理解则仅限于表面,对算法在计算机中的实现过程难以理解,并且缺乏举一反三的能力。综合分析,产生上述问题的原因在于以下几个方面:
1.学生的算法设计能力普遍薄弱
著名的计算机科学家沃思说过“程序=数据结构+算法”,足以见得算法在程序设计中的重要地位。在合理的数据结构基础上,算法是对数据结构的操作(运算),是数据处理的核心。对于传统“数据结构”的教学,偏重于基础理论知识的传授,对于学生的算法设计能力的培养则显得比较单薄。算法设计能力的提高必须通过多做多练,在解决实际问题中达到自我提升。因此,在“数据结构”的教学过程中,采用案例教学法可以达到较好的学习效果。
2.前导课程基础较弱,尤其指针部分
“数据结构”以学生对编程知识的掌握为基础,数据结构的描述语言主要为类c语言,并且大量地用到了里面的指针等知识内容。大部分同学对指针运算掌握不扎实,不能将其灵活运用,导致了算法无法实现,学生缺乏成就感,降低学习兴趣。因此,在“数据结构”的教学过程中,除了要复习指针部分知识以外,还要利用实验实践教学达到教学目的。
3.缺乏多元化的人才培养方式,与实际应用相脱节
从实际的教学过程来看,教师对“数据结构”相关内容的实际应用讲述得不够清楚,学生学习过程中比较困惑。即便讲述过程能够理论联系实际,也主要偏重于工程应用,对数据结构科研方面的意义探讨极少,这样导致了很多学生在读研究生阶段时非常吃力,很难将自身调整到研究的状态。为了响应国家的“研究型人才”及“工程型人才”的分类培养目标,必须兼顾学生进一步学术深造和提高工程实践两个培养目标的需求,在教学内容和案例选择上要有侧重性,引导学生将理论知识与以后实际的应用相结合。“数据结构”不仅对于工程实践非常重要,同时对于培养学生的数据抽象能力以及提高学生的研究水平和创新能力也非常重要。教师应该结合自己的研究方向,尽量给出一些偏重算法研究的案例来培养学生的科研能力,为学生以后继续深造打下坚实基础,同时也帮助学生尽早定位自己未来的发展方向。
二、不同培养目标下的课程教学改革
1.教学内容的改革
在理论教学内容的安排上,笔者将近几年国家研究生统考题穿插在每章最后,检验学生的学习效果,提升学生的应试能力。除此以外,为了更好地激发学生的学习兴趣、使学生能够学以致用,提高其专业素质,在授课过程中采用基于案例引导的教学方法,并且对于不同类型人才的培养采用不同的案例。
基于案例的教学方法是将案例的实施贯穿到课堂教学中,教师根据需要讲的知识点设计一个具体案例,在讲授过程中以该案例为切入点,引导学生去思考解决这一应用问题所需要的知识,逐渐引出概念和原理。让学生在具体的案例实现过程中消化知识,这是培养学生分析问题、解决问题的一种教学方法。
案例的设计是案例教学的核心内容。案例的设计除了一些验证性的外,还应设置一些综合性的。验证性案例用来帮助理解教材中的各个知识点,建立起数据结构和相应算法的概念,培养学生基本的算法设计能力。验证性案例较简单,可以让学生独立完成,因此验证性案例对于不同培养目标的学生没有特殊区分。综合性案例是指一些实用性强、应用价值高的案例,包括问题分析、总体设计、详细设计、用户界面设计、多人合作以及一整套软件工作规范性强的工作。研究型综合案例需要学生查阅算法、模糊数学、图论等资料,这对学生的研究学习能力和创新能力都有更高要求。因此,对于综合性案例,学生可以根据自己的特点以及兴趣选择不同的设计性题目,自愿结成小组,并且协调好内部分工,定期举行小组讨论等。
2.教学方法的改革
传统的教学方法一般采用以教师在课堂上讲授基本知识点为主,以学生上机实践以及做课后作业为辅的教学模式。这样会导致学生动手能力差、只会应试不会实践。
在教学过程中,重点实施“以学生为中心”的教学模式,教师在整个教学过程中扮演“导师”的角色。学生根据自己的兴趣爱好选择案例,根据案例任务需要按照3~5人建成标准组并细化分工。教师重点负责准备案例,并且根据每组完成任务的不同,与学生共同讨论问题、分析问题,并能指导调研、引导学生找到解决问题的方法等。在案例完成后,教师需带领学生分析和总结案例解决方案的优缺点。
为了提高教学效率,达到教学效果,除了采用课堂授课的教学方法外,还采用了其他教学方法,例如课堂讨论、案例分析、小组汇报、教师或学生总结等多种教学方法。对于不同的培养目标,教学方法相似,但是教学内容和教学手段的侧重点则有所不同。对于工程型人才的培养来讲,教学目标应侧重于软件工程规范的训练及培养,提高学生组织数据及编写大型应用程序的能力,教学内容侧重于需求分析、概要设计、详细设计、用户界面设计、程序设计、软件测试、多人合作等基本技能和技巧的培养和学习。教学手段除了依赖于动态ppt、动画演示、算法演示软件等,还应该针对不同的培养目标选择不同的教学手段,比如引导工程型学生参与程序设计论坛、学习群等;培养研究型学生的学术论文检索能力;鼓励学术型学生参加算法设计论坛以及学习一些算法分析工具的使用等。在教学过程中,对相关的知识给出一些延伸的阅读文档,指导感兴趣的同学在课后进一步拓展思维、拓宽视野。
不同于传统教学的评价方法,此教学更加关注学生最终所能达到的专业能力及实践能力。广泛借鉴国外高校的Assignment的评价形式,采用阶段性作业、期末大作业、撰写实验报告等多种方式相结合的考核方法。为了防止学生从网上下载源代码或者抄袭等非诚信行为,还要对学生进行汇报答辩。对于不同的培养目标,应采取不同的评价标准。对于工程型学生,应注重程序设计文档是否规范、完善;程序的调试和测试是否科学、合理。对于研究型学生,应注重问题调研是否够全面、算法设计是否合理、是否具有创新性等。
三、结语
在适应IT行业快速发展的新形势下,我国教育部提出了计算机科学与技术本科专业的“分类培养”的教育目标,该目标的提出为计算机课程建设及改革提出了新的要求。我校从“数据结构”课程入手,针对不同的培养目标,提出了“因材施教”的培养模式。通过课程组多年的摸索与实践,在不同类型人才的培养方面均取得了良好的效果,尤其对于研究型人才培养方式的探索积累了宝贵的经验,这些经验可以推广到其他计算机相关课程当中,对于不同类型人才的培养方案尤其是研究型人才的培养方案的实施都具有重要的现实意义。
参考文献:
[1]严蔚敏,吴伟民.数据结构(c语言版)[M].北京:清华大学出版社,1997.
[2]教育部计算机专业委员会.发展战略研究报告暨专业规范[R].北京:高等教育出版社,2006.
[3]张丽萍,刘东升,王春晖.计算机应用型人才培养与数据结构课程改革[J].计算机教育,2010,(5).
关键词:数据结构;实验;编程;教学
中图分类号:TP3-4 文献标识码:A文章编号:1007-9599 (2011) 06-0000-01
Teaching Research on Data Structure Experiment
Zhang Xiujian
(Guangzhou University Sontan Collehe,Guangzhou 511370,China)
Abstract:Data structure is a course that emphasizes that exercise of logical thinking and programming ideas.In this paper,we argue that the appropriate experimental program and integration of software engineering can improve student’s innovative ability.
Keyword:Data Structure;Experiment;Programming;Teaching
《数据结构》,是一门重要的理论学科。通过调研看出,该科目在各个院校的实验教学情况存在较大差异。学生学习理解过程缓慢,教师教学也不能得心应手,尤其是实验课,由于部分学生对编程语言掌握不熟练,实验内容抽象,而有较大畏难情绪,甚至不参加实验课。虽然曾经有些教师参考了任务驱动、实例教学等方法,但过于强调某种教法,也会影响教学效果。所以,该课程宜结合课程特点设计教学,切实通过贴近于实际的方法传道授业,结合实验落实教学效果是非常重要的。
一、数据结构课程实验教学中问题所在
(一)实验课时欠缺。有的学校压缩实验时间,让位于理论教学,这对学习效果的落实来说是本末倒置。没有足够的实验课时,学生就无法把理论知识加以系统地整理,进而在实验中消化吸收。
(二)综合性、创新性实验科目欠缺,系统性不强。开设的数据结构的实验课程中,虽然安排了相关知识点的实例,但是对设计的创新性和综合性上有待提高,要加强知识点的综合运作。
(三)没有很好地结合课堂教学和实验教学。作为一门比较抽象的理论教学课,尤其要重视课堂和实验教学相结合。实验中要突出该课程的实践性,教学中要注重理论和实践的结合。现在,不少教师只重视知识的灌输,在实验中任务不明确,要求不明晰,让学生在实验中迷失了对理论的进一步实践的方向。
二、实验教学的改革探索
(一)教学模式的改变。基于数据结构课程理论难于理解的特点,要突出实验课的效果,要注重“课堂.一章的基础性实验.综合实验”相结合的框架。注意从逻辑机构到存储结构,再到实现基本算法,继而具体应用的方法,一以贯之地落实到数据结构教学中去。算法的讲授要先分析算法,再运用编程语言演练算法,最后进一步分析算法。如能采用多媒体演示算法的步骤,会使学生更加清晰地理解。课堂教学始终要把应用的要求作为做种目标,辅以实验训练,加强学生动手编程和自我创新的能力。
(二)基础实验环节要重视。实验环节要让学生进一步理解数据结构的特点,明确相关概念,熟练各种基本算法的实现。枯燥的理论讲述的再多,也不如配合实验让学生一练,所以教学要重视基础实验环节。要想获得扎实的教学效果,教师要提供实验编程语言,Turbo C、Visual C++、Delphi等都可以。根据教材确定实验方案,明确实验目的、内容、要点和必备注意事项,最后安排几个演练题目,比如矩阵的遍历、数据的折半查找等。实验课程要贴近学生的编程水平,不可偏离太过。实验中,学生有章可循,对要点有较强的针对性,实验效率就会大大提高,使学生真正能举一反三。
(三)课程实验要理论应用相结合。实验要注意结合原理和应用,让学生在解决实际问题时学会调用学过的知识点,养成动手练习语言编程的习惯,所以,这个层面的综合实验要求要高于普通的课下练习和基础实验,更贴近于应用。平时虽然侧重练习简单的算法程序,但综合实验课是软件设计的高级训练阶段,融合了问题的分析,系统结构设计、操作界面设计、编程技能技巧,是软件设计的系统工程。教师分阶段拟定数据机构在实践中的各种应用,比如:汉诺塔问题、约涩夫环问题、Huffman Coding方式、班级信息管理系统等,把任务分配给学生,让学生组织课题公关。课题的结题要提供课题表述、基本要求、实验数据、实现结果和关键实现步骤等内容,这能协助学生破题解题,以免形成错误的认识,同时也讲解了程序设计的基本路线,确保实验目标的实现。最后每个课题组都集中展示实验过程接结果。试试证明,这样的实验环节,综合了数据结构知识、编程语言技能和软件工程思想,让学生系统地理解各门课程的联系,融合相关专业课的精髓,锻炼了学生的团队合作互助精神,提高了组织能力和管理水平
三、重点组织好教学实验的各个环节
(一)实验题目的设计。鉴于实验环节教学时间的限制,学生的编程基础和技能较为薄弱,所以,设计和拟定合适的实验题目尤为重要。实践题目应该由易到难循序渐进:
1.常用算法练习。主要讲解各章节知识点,深入贯彻算法理论的理解;2.基础性应用练习。主要让学生针对单一的数据结构解决应用难题,其难度中等;3.综合应用题目练习。要涵盖多个章节的内容,系统性强,难度较高,可以组织学生成立课题组,在课外实验环节共同研讨解决,再集中展示。课题的设计要注意:(1)常用算法的练习要有一定代表性,重点练习各个章节的知识点,难度较小,目的在于理论知识的掌握。课堂教学要和实验环节对应,学生在试验中重点演练课上讲授的内容。(2)基础性应用练习难度要适中,既要带动基础薄弱的学生,又要注意发挥基础好的学生的能动性,可以加以延伸,或是鼓励提供多种解决方法,进行不同思路的性能的比较,让各个层面的学生都能参与实验。(3)综合应用练习题不宜太难,但要引起学生的兴趣,宜于结合实际中的事物或应用系统,让学生宜于接受和理解,这样才能促进学生的积极性。
(二)实验环境的搭建。现在很多学校选取谭浩强教授出版的《数据结构(c语言版)》作为教材,应用C语言进行数据结构的设计语言,用TC搭建实验环境。而在实际教学中,应用C语言讲解数据结构常常对算法设计和实现上较为突出,对数据结构的系统性容易忽视。如果用C++进行数据结构的实验练习,可以注重其整体性和系统性,先定义数据结构的类,再分析其逻辑特性,然后把存储结构延伸到算法的实现中去,能帮助学生构建数据机构的概念。
(三)实验过程的组织与实施。实验中可以采取学生分组、一人负责的机制进行实验。提倡互动探讨和交流,既能让学生接触更多的实验题目,也能提高学生的团队合作精神。
(四)实验结果的检验和考核。对实验结果,教师要辅以必备的检查来进行督导。对于实验报告的书面汇报,要设计题目、要求、步骤、结构、程序代码和改进方法,以及最后的体会等。教师通过实验报告书可以详细了解学生的实验情况,进而发现共性的问题集中解决。
(五)实验问题的总结与弥补。通过实验,教师对于学生学习中存在的问题要进行系统总结和分析加以更正,有些不良的编程习惯,教师要着重强调。
四、结束语
《数据结构》的实验课注重学生动手能力的培养,强调创新思维的养成,通过实验,结合应用案例,能够进一步提高该课程的教学质量,加深学生对知识点的理解,具有积极的现实意义。
参考文献: