前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇数据结构课程设计范文,相信会为您的写作带来帮助,发现更多的写作思路和灵感。
摘要:本文针对传统数据结构课程设计教学过程中出现的问题,提出一种案例驱动的数据结构课程设计教学方式,以帮助学生理解和掌握分析问题、解决问题的方法,提高自主学习能力,锻炼设计创新能力。实践表明,此教学方式能够弥补传统教学的不足,开阔学生的思路,提高自主完成率,达到课程设计目的。
关键词:课程设计;数据结构;案例驱动;教学改革
中图分类号:G642
文献标识码:B
1引言
数据结构课程是计算机相关专业的专业基础课程,属于专业课程体系中的核心课程。该课程着眼于对基本数据结构进行阐述和分析、讲解基本数据结构的应用并介绍典型的基本算法等三个方面,内容比较抽象枯燥,掌握起来相对困难。数据结构课程设计是一门独立的实验环节,是对数据结构课程教学理论的延伸和补充,是对理论知识的综合应用,其目的是发挥学生的主动性,培养学生分析实际问题并加以解决的能力,锻炼学生的设计创新能力。
传统的数据结构课程设计教学轻讲授,主要以对学生的单独辅导为主,督促学生完成课程设计。这种方式存在后文所提及的一些问题,随着互联网资源的日益丰富,部分问题更加突出了。为了能让学生通过课程设计更好的掌握数据结构的内容,我们设计了案例驱动的数据结构课程设计教学改革,实践证明,该项教改能够填补传统教学过程的不足。
2传统教学过程中暴露的问题
(1) 缺乏驾驭全局的能力。本科二年级学生计算机建模能力弱,没有软件工程的思想,因而缺乏驾驭全局的能力。软件工程课程一般都开设在数据结构课程之后,在进行数据结构课程设计前,学生也基本没有分析、编写较大程序的经验,这种情况造成了学生拿到问题后不知该从何下手和如何规划好课程设计的整个过程。
(2) 生搬硬套基本数据结构。数据结构教材中都是最原始的数据结构,不进行扩展和修改基本上是不能直接用到课程设计中解决实际问题的,而采用多种数据结构解决问题并加以比较找寻最优方案对于学生来说就更为困难。
(3) 对高级程序语言掌握不到位。数据结构课程设计是需要用高级程序语言来编写的,学生对该程序语言的掌握程度直接影响到课程设计的质量,常见的问题包括:变量定义不规范、函数功能划分不合理、代码可读性较差、文件读写掌握不好、调试程序能力较弱等。
(4) 照搬、照抄他人课程设计的现象存在。由于完成课程设计的时间有限,有的学生在无法自主完成的情况下,通过网络、书籍等方式来查找解题方法。本来通过查阅资料消化吸收他人的解题思路来求解自己的课程设计问题是毋庸置疑的正规途径,然而一方面课程设计的题目每个学校每届学生都相对比较固定,致使存在抄袭往届学生程序的现象,另一方面互联网的发展使得查找相似题目的课程设计源代码并非难事。此外,市面上还存在着大量快餐式的课程设计书籍在售,这类书籍良莠不齐,多是搜集、罗列了若干课程设计题目,源码、光盘附上,草草分析讲解了事。许多学生也习惯了这种快餐式的学习,能做到独立思考、举一反三的越来越少。
3案例驱动的数据结构课程设计教学改革特点
案例驱动的数据结构课程设计教学改革是将案例教学法引入数据结构课程设计教学中,教师通过讲解一个完整的案例分析解决过程,辅以多媒体的手段与学生交流、互动,达到培养学生分析并解决实际问题的能力,锻炼学生的设计创新能力的目的,同时也弥补了目前数据结构课程设计教学重实践、轻讲授的不足,丰富该项课程设计的教学内容。该方法有以下特点:
(1) 提前熟悉软件工程思想。案例的分析解决过程就是一个实践软件工程思想的过程,学生可以在讲解的过程中体会软件开发的完整流程,进而对自己的课程设计有全局性的考虑。
(2) 举一反三,定制合适的数据结构。对于案例讲解中所涉及到的数据结构,教师将进行细致的分析。采用不同数据结构解决同一问题,在性能和功能上会有所区别,学生可以在与教师的互动讨论中提高对各种数据结构的认识,从而设计适合解决自己课程设计的数据结构,甚至能够采取多种解法。
(3) 养成良好的编程习惯。优秀的代码就像优美的文章一样能使阅读者心情舒畅,教师讲解的案例都是代码级别的,定义规范、流程清楚、可读性强、具备参考价值,这样就促使学生养成良好的编程习惯。教师以多媒体手段演示代码的编制调试过程,使学生对编程环境更加熟悉,能够灵活运用跟踪、断点等调试手段,开发过程事半功倍。
(4) 最大限度避免抄袭课程设计的现象。大多数学生事实上都希望能够自主完成课程设计,只是因为不会做才导致抄袭往届学生或是市售相关书籍源码的现象存在。授之以鱼不如授之以渔,通过对典型案例的讲授,教师教给了学生解决课程设计的方法,学生找到了突破口,便愿意通过自己的努力完成任务,自己能制作“大餐”,也就不再求助于“快餐”了。
4典型数据结构课程设计案例分析
“活期储蓄帐目管理”是常见的数据结构课程设计题目,下面以其讲解过程为例简单描述一下案例驱动的数据结构课程设计教学的过程。
此课程设计需要实现的功能一般是:(1)采用交互工作方式;(2)实现储户开户;(3)实现储户销户;(4)向某账户存款;(5)从某账户取款;(6)排序显示所有账户信息;(7)查询某账户余额;(8)查询某账户交易记录;(9)所有账户及其交易信息存储至文件,程序运行时从文件中读入。该课程设计考察的知识点包括:选择并构造数据结构;使用与特定数据结构相应的算法来实现具体功能;对文件读写结构化数据;对程序设计语言的灵活运用等。
首先应对题目进行大致的分析,该题目包括两方面的信息。一方面是储户的信息,可设计为包含账号、姓名和余额等字段;另一方面是交易记录信息,可设计为包括账号、存取时间、存取标志、金额等字段,两方面信息通过账号字段关联起来。使用顺序存储结构、链式存储结构或树形结构都可以存储这些信息,但其中各有利弊。顺序存储结构设计简单,但容量固定,账户插入删除需要进行记录的移动,单个账户的交易记录信息存储不易连续导致列举时需要对全部交易记录进行完整遍历,对已排序顺序表查找某一记录时可以采用特定算法(如二分法)提高效率,总体上来说实用性和整体效率相对较差。链式存储结构设计略复杂,容量不设上限,账户插入删除较方便,采用链式结构存储的交易记录形式上连续,列举时很方便,但在查找某一记录时需要遍历整个链表效率较低,总体上来说实用性和整体效率中上。树形存储结构相对最复杂,容量也不设上限,插入、删除算法也相对复杂,采用特殊树形结构(如二叉排序树)能够提高查找记录时的效率,交易记录仍可采用链式结构存储,总体上来说实用性和整体效率较好,现实中的数据库管理系统(DBMS)多是用树形结构来实现的。从实现难度上来说,顺序存储最简单,链式存储次之,树形存储最难。因此,对学生一般要求其用链式存储来实现,对能力较强的学生可以鼓励其用树形存储来实现,以链式存储为例继续讨论。
账户信息和存取记录之间是通过账号来关联的,在链式存储结构中可以用指针来表示两者的联系,即每个账户节点(数据域可包含账号、姓名和余额等字段)具有两个指针域,一个指针指向下一个账户节点,另一个指针域指向该账户的存取记录链表(存取记录节点的数据域可包含存取时间、存取标志、金额等字段),如下图所示。
从功能上分析,储户开户、储户销户就是在账户链表中进行插入和删除操作;对账户存、取款时,首先找到相应账户,然后添加一条存取记录,同时修正该账户的余额;排序显示所有账户信息,就是对账户记录依据某一关键字进行排序并显示排序结果;查询某账户余额,就是遍历账户链表,找到对应记录并显示出来;查询某账户交易记录,就是先找到该账户,然后遍历显示该账户对应的存取记录链表。可以看出,对账户链表进行遍历查询在账户存取款、查询余额和查询存取记录是都有用到,因此在设计时,可以考虑编写查询账户函数,以供其他功能模块调用。
在文件存取方面,存取时都是以存储节点为单位进行的,即一次性存取一个结构体。该课程设计有其特殊之处,有两种类型的结构体需要存取,即账户信息和存取款记录,这两种结构体所占用的空间不尽相同,若是都保存在一个数据文件中则需要一定的技巧。以保存记录到文件为例,可以采用存一个账户信息,再存一个整形数,该整形数的数值为此账户对应存取记录节点的数量,然后再逐一保存每条存取记录,存储完毕后再用相同方法保存下一个账户的记录。读取文件过程则是存储过程的逆过程,这样可以保证存取时,账户信息和存取记录一一对应,不至于混淆。
在确定了上述思路后,便可以着手编码,值得注意的是数据结构的定义。由于采用了链式结构,许多同学便直接将链式结构的节点(包括指针域)直接存储到文件中。事实上,这个指针域是没有保存价值的,尤其在读取时如果也将指针域读出并赋值,将很有可能导致不可预知的错误。可以采取的方法是,先定义只包含数据域的数据结构体,再定义链表节点结构体将数据结构体封装起来并加上指针域,在文件读写时只对数据结构体进行操作。给出该课程设计数据结构参考定义如下:
typedef struct log //存取记录
{
char DateTime[25]; //存取时间
char W_D; //存取标志
float Amount; //存取金额
} log;
typedef struct node_log //存取记录节点
{
log data; //存取记录
struct node_log *next; //下一存取记录节点指针
} node_log, *p_node_log;
typedef struct account //账户记录
{
char ID[10]; //账号
char Name[10]; //姓名
float Balance; //余额
} account;
typedef struct node_account //账户记录节点
{
account data; //账户记录
struct node_log *nlog; //存取记录节点指针
struct node_account *next; //下一账户记录节点指针
} node_account, *p_node_account;
其他功能模块便可以参照数据结构教材上的相关算法设计实现。
5结果与结论
我们将来自3个不同专业(计算机、网络工程、软件工程)10个班级的57名同学分成了两组,一组(试验组)通过上述方法进行了课程设计教学,一组(对照组)仍采用传统方法教学,课程设计题目相同。课程设计对比统计情况如下表,其中试验组优良率达到44%,不合格率13%,对照组优良率21%,不合格率26%。同时,试验组采用了多种方式来实现了课程设计,且雷同情况较少,对照组多数采用顺序存储方式实现,程序雷同情况较多。很明显,试验组的学生思路更加开阔,自主完成率更高。
时代在变迁,信息获取更加便捷,部分学生的学习积极性在某种程度上也发生了蜕变,随之的教学方式也应有所改变,教师应从正面加以引导。在以案例驱动的数据结构课程设计教学改革实践中,教师通过对典型案例的细致分析,比较不同数据结构的优缺点,一方面使学生更加牢固的掌握了数据结构知识,另一方面让学生找到入手之门,激发学习兴趣,提高动手能力,更重要的是能让学生掌握分析和解决问题的方法,自主完成课程设计,这对今后其他课程的学习也是有所裨益的。
参考文献:
[1] 张培,肖天庆. 基于网络环境下教学设计与课程开发的合作模式研究[J]. 电化教育研究,2007,(9):60-63.
[2] 吴宏伟,张殿龙,梅险. 高校网络辅助教学的探索与实践[J]. 计算机教育,2007,(7):18-21.
[3] 张敏霞. 程序设计语言课程教学方法改革的探索与实践[J]. 中国高教研究,2004,(2):90.
数据结构是数据元素之间的关系。从概念和实现两个角度,可将数据结构分为数据的逻辑结构和数据的存储结构。按照数据元素之间前驱和后继关系来分,数据的逻辑结构可分为以下4种:集合(Set)、线性表(List)、树(Tree)和图(Graph)[2]。数据的存储结构主要包括数据元素本身的存储以及数据元素之间关系表示。数据元素之间的关系在计算机中主要有两种不同的表示方法:顺序映像和非顺序映像,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。JavaJDK为常用的数据结构定义了一些接口(Interface)和实现(Implementation)。这些接口、实现类以及常用的排序、查找等算法统称为JavaCollections框架(JavaCollectionsFramework)。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操作限制线性表中元素的插入和删除只能在线性表的同一端进行。JDK1.6引入的ArrayDequ<E>实现类被优先推荐作为栈使用。ArrayDeque<E>实现了Deque<E>接口。Deque<E>接口定义了双端队列,双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。JavaJDK中没有直接提供树和图的接口和实现类,但是可以通过研究TreeMap的源代码学习操作树的一般编写模式。综上,数据结构与Java面向对象程序设计两门课程内容的衔接见表1。
2面向数据结构衔接的Java课程实施方案
Java面向对象程序设计为1学期的课程。总课时为讲授54学时、实验32学时。其中,与数据结构知识点紧密相关的JavaCollections框架部分为讲授6学时、实验4学时。在讲授环节,按照表1列出的顺序进行。在实验环节完成与授课内容相关的验证性实验。在课程设计实践环节,要求学生使用Java设计常见算法,然后阅读JDK提供的源代码进行对照。具体方案如图1所示。比如,在java.util.Collections类中提供了数据结构中学生已经学过的常见算法,如二分查找、计算元素频数、查找最大/最小元素、反转线性表、按照指定距离旋转线性表、随机排列线性表、交换指定位置上的两个元素以及排序等。注意,在Java6中Collections.sort()使用的是MergeSort;而在Java7中,内部实现换成了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(1),而TreeMap内部对元素的操作复杂度为O(logn)。TreeMap记忆了顺序,TreeSet内部的实现使用了TreeMap。
3结语
关键词:数据结构预算法;国际化;互动式教学
文章编号:1672-5913(2013)18-0058-04
中图分类号:G642
0 引言
通过观察和对比,国际一流大学学生参与课堂发言和课后研讨的积极性要远远高于复旦大学学生,而参与研讨对于促进学生深入理解课程内容,培养学生在立题、思辨和协作方面的能力十分有益。为此,复旦大学软件学院开展了数据结构与算法设计类课程国际化建设工作,主要目标是研究如何在课堂教学中采用研讨型方式,在实验环节中采用协作型项目,并针对中国学生的特点,探索如何引导学生提出问题和参与讨论,以提高课程教学效果,缩小与国际一流大学差距的教学方法。课程建设教师团队的主要人员首先通过全程旁听美国麻省理工学院数门相同或类似的课程,认识与国际一流大学在教学手段和效果方面差距的同时,分析中美学生在提出问题、参与讨论方面表现差异的原因。然后通过与学生座谈方式收集整理中国学生不愿意在课堂上发言和参与研讨的主要原因和相应对策。最后介绍复旦大学软件学院根据课程国际化教学课题的研究成果进行教学方式调整和开展课堂教学实践的情况。
1 麻省理工学院在课程教学中促进学生参与研讨的先进经验
在开展数据结构与算法设计课程国际化建设过程中,课程建设教师团队的主要人员利用在美国麻省理工学院(MIT)参与研究工作的机会,在一年内全程旁听了Design and Analysis ofAlgorithms、Web 3.0、Economics 0f Information、Software Construction 4门课程,并且参加了MIT的IFF(International Faculty Fellow)国际大学教师培训项目。IFF是由MIT发起组织的、致力于提高国外高等院校教师的科研能力、培养研究生水平和授课技能的项目。在上述过程中,教师团队人员对于MIT在促进学生参与课程相关内容研讨方面的举措印象深刻,并将值得借鉴的教学方式和方法进行了归纳。
(1)学生参与课程相关内容的讨论需要相关知识的准备,只有将相关知识积累到一定的程度,学生才会自然而然地愿意对相关问题进行讨论,而课程教材和课堂讲义对知识积累是远远不够的。MIT在课程开始时就由任课教师提供课程相关的文献阅读列表,阅读完这些文献所需要的时间大约为课程授课时间的3倍左右。对比复旦大学类似课程的文献阅读要求,发现中国学生在完成课程相关文献阅读量方面远远少于国际一流大学的学生。
(2)每一门课程除了提供网站用于下载课程相关的资料外,还有课程的BLOG便于学生和教师在线交流。利用这样的系统,教师往往规定在课程授课期间,学生至少针对数个课题(完成相关文献的阅读后)在BLOG上发表自己的观点。由此促进学生围绕相关课题开展讨论,这样的方式也为那些不太愿意在众人面前发言的学生提供阐述自己观点的机会。
(3)MIT的教室一般都是阶梯教室,这样既可以让每一位学生能够清楚地看到任课教师各种面部和身体语言,也使授课教师能够看到所有的学生,时刻了解学生对课堂内容的各种反馈。学生座位之间留有通道,授课时教师会在整个教室里走动,确保能够走近每一位学生的身旁,让每一位学生感受关注和重视,这样也让学生感到亲切随和。实践表明,这样做更能让学生畅所欲言。
(4)教学内容融合任课教师的研究成果。任课教师对于自身的研究内容一般都有较深的认识和理解(甚至有些理论和技术是世界首创),讲解过程中能够广征博引,相关难点都能够娓娓道来,所以往往更为生动有趣,可以激发学生的提问热情和学习兴趣。教师只有在相关领域内具备一定的科研水平才能更好地讲授相应的课程内容。
(5)在讲解有关技术内容时,会邀请业界一些著名人物走进课堂为学生讲解其擅长的话题。以MIT互联网方面的课程为例,任课教师会请IBM、Google、Microsoft等著名科技公司副总裁或技术总监级别的人物为学生讲一堂课(有时是远程视频连线,教室配有大屏幕高清投影和高速网络),之后一般设有学生提问环节。这样的课程很受学生欢迎,学生提问也非常踊跃。
综上所述,在课程开始前精心为学生挑选各章节相关的阅读文献(分为必读和选读部分)、建设课程BLOG促进师生间交流、将研究内容融入课程内容等教学方式和方法都值得借鉴,并且通过一段时间的准备加以实施。但是中国学生不愿意上课发言和参与研讨也有其成长环境中文化背景的影响,例如,追求标准答案的应试教育、谨守中庸之道处事态度等。而美国学生从小就让他们不断地进行发言和表达的训练,从幼儿园开始,每天都会让小孩子轮流讲一下昨天发生的事情。参加各种活动和社团也是如此,久而久之,养成了愿意并且善于表达自己观点的习惯。所以对于我们的学生,不仅要营造让其发言的环境和气氛,也需要有意识地利用各种机会培养他们发言的习惯。
2 学生不愿意在课堂上发言和参与研讨的主要原因及改进建议
课题组对两个班52名学生针对不愿意在课堂上发言和参与研讨的问题进行面谈,每位学生面谈时间为20~30分钟。学生不愿意在课堂上发言和参与讨论的主要原因可归纳为:害怕回答错误后造成对自己不利的影响(特别是教师随后会给出答案的情况)、没有养成积极发表自己观点的习惯(与成长的文化和环境有关)、担心积极发言后被别人说爱表现、课堂上没有能够很好地营造出各抒己见氛围。调查过程中同时也听取了学生对让他们能够积极主动发言的一些建议和意见,归纳为以下几点。
(1)讨论的问题应该是一些不存在对错的开放性问题。
(2)可以先由教师开题和启发,然后找到学生感兴趣的几点展开讨论。
(3)教师要营造随和的课堂气氛,需要有一个破冰的过程,让学生放松不害怕。
(4)可以采取分组讨论然后再由学生总结发言的方式。
(5)提出一些学生比较熟悉且有启发的问题比较容易让学生展开交流。
(6)发言和讨论适当增加一些平时成绩(但也有学生担心别人认为他为了成绩而发言,所以增加成绩的比重也不宜过高)。
(7)不要仅对一个学生提问,要求其他学生可以随时补充。
(8)对于有标准答案的问题,可以采取按座位顺序点名提问回答的方式。
综合以上学生的意见和建议,为了让学生积极参与课堂发言和研讨应当尽量营造轻松随意的课堂气氛,提出的问题也应是开放性的(即没有标准的答案),任课教师要善于引导和组织课堂讨论,在提出问题前给予必要的讲解和启发。
3 教学方式调整和课堂教学实践
通过借鉴国际一流大学和国内名师的先进教学经验,针对中国学生,特别就数据结构与算法设计课程的教学方式提出了一些方案和措施,并且进行了相应的课堂教学实践。虽然这些方案和措施还有待进一步完善和改进,但是课堂教学效果和学生参与研讨和发言的意愿明显提高。具体的方案和措施包括以下几个方面。
3.1 尝试诱导式、研讨式和互动式教学方式
任课教师要改进之前以灌输式知识传授的教学方式,尝试采用诱导式、研讨式和互动式教学方式。教学过程中一般首先给出实际的应用问题,然后要求学生尝试提出解决问题的算法,其他学生需对提出的方法进行评价,提出不足之处和改进方法,然后通过讨论这个算法的缺点,引出克服这个缺点的其他算法,最后对解决相同问题的不同算法进行比较和归纳。适当增加学生对相关重要文献的阅读量,并且根据阅读和调研结果进行课堂讨论。以NP完全性问题教学为例,由于学生还没有学习计算理论方面的课程,对于理解NP问题和NP完全性问题有一定的困难。首先任课教师介绍旅行商问题,接着让学生尝试寻找有效地求解算法,在教师引导下讨论得出结论:在现有计算机体系结构和运算能力的基础上,一定规模的旅行商问题目前不存在找到最优解的计算复杂性为多项式的算法;然后指出存在一类这样的问题,并且任取这类中的一个问题,再任取这类中的另一个问题,则一定存在多项式时间复杂性的算法,即可以把前者转变为后者。如果存在解决前者的多项式算法,必定存在能够解决后者的多项式算法;最后指出目前仍然没有找到多项式算法来解决这类问题,同时也不能证明这样的多项式算法不存在。为了让学生加深对上述问题的体会并且熟知典型的NP问题,将学生分成9组,每一组给出一对问题,其中一个属于P(多项式)问题,一个属于NP问题。要求学生调查这一对问题在应用中出现的实例和变体,然后设计可行的解决方法。并且要求每组以课堂演讲的方式向师生介绍他们的调查结果,听取报告的教师和学生可以随时进行提问,要求做报告的学生回答。教学实践表明,此举加深了学生对NP完全性问题的认识和理解。
3.2 从解决实际问题出发,培养学生提问和思辨的能力
对于每个知识单元,首先提出若干个实际应用中的问题,在提出可行的数据结构与算法前,引导学生进行讨论,并且提出自己的解决方案。通过分析学生所提出的各种方法,比较之前已学方法,归纳出新的数据结构与算法的特点和用途,最后在深入剖析和讨论的基础上进行扩展和综合。
3.3 借鉴国际一流大学的教学内容和方式,弥补与国际先进授课水平之间的差距
数据结构与算法设计课程的教学内容和方式借鉴了美国麻省理工学院的同名课程,并尝试进行诱导式、研讨式和互动式教学。课程的教材、讲义、作业、实践和考试全部使用英文,外教采用英语授课。将世界顶尖级学者撰写的经典著作Introduction to Algorithms作为课程的教材,并且根据中国学生的生活经历和背景文化,对部分案例进行相应的增补和改写。
3.4 以应用为导向,培养综合型人才
目前计算机学科方面的教学,一般从计算机基础知识和编程原理开始,经过若干中级课程,直至大学三、四年级,学生才可能涉足整个软件系统开发的全过程,这样往往造成“只见树木,不见森林”的情况。学生已经学习了构成软件系统所需的知识和技术,但是难以针对某一现实应用,将所学较好地综合起来。在大学低年级时,以完整系统开发和应用为目标,让学生在专业学习的早期就能够了解和体会实际应用的复杂性,掌握并实践综合集成各项技术的方法和手段。学生只有较早地了解整个软件系统的开发与应用,才能在今后创造性地综合运用所学,成为既有较高专业水平,又对现实应用有敏锐洞察能力的复合型人才。
3.5 以科研带动和促进教学,将最新技术的发展成果融入教学内容中
数据结构与算法的基本内容虽然相对稳定,但对已有数据结构与算法的扩展和结合,特别是解决新的应用方面的发展却日新月异,知识更新和演化速度较快。数据结构与算法设计课程组的教师在现有教材的理论体系和教学内容的基础上,及时了解和把握技术发展的新动向,将最新的理论创新和技术进步充实到教学内容中,每年都增补紧跟学科发展的新内容。此外,任课教师会指导学生参与自己的科研项目,或者推荐学生进入其他教师的实验室从事相关的科研活动。
这些方案和措施的实施,使得数据结构与算法设计课程能够在较短的时期内形成科研和教学并线、讲解和演示并重、理论和实践并行的特色。课题组教师不断用科学研究和国际学术交流的成果充实课程的内容,使课程能够充分体现目前算法理论和应用方面最新的发展和动向。在教学中始终坚持理论与实践相结合的原则,从经典案例引出科学问题,并强调对学生逻辑思维和动手能力的培养。
4 结语
关键词:大数据;荷载与结构设计方法课程;教学研究;教学现代化
中图分类号:G642.0;TU 文献标志码:A 文章编号:1005-2909(2016)05-0086-04
大数据是21世纪的重要技术革新成果,大数据开发与应用带来更多新技术的出现,各行各业也急需适应大数据发展的人才。2015年8月国务院颁发的促进大数据发展纲要提出了应加快适应大数据发展需求的人才培养,所以培养适应大数据时代需求的创新人才是摆在高等学校面前的重要任务[1-4]。目前,国内高校土木工程专业人才的培养还不能满足大数据产业的需求,基于大数据背景下的教学改革也比较少[5-8],所以应积极推进基于大数据背景下的土木工程专业课程改革。结合土木工程专业背景和社会实际需求,融合大数据时代的技术和思想开展土木工程专业课程教学改革,除了要培养学生的基本技能,还应注重培养学生对海量数据的采集、存储、管理、挖掘与分析等综合能力。黑龙江科技大学土木工程专业荷载与结构设计方法课程组开展了面向大数据需求的教学改革。该项改革以荷载与结构设计方法课程的基本知识为基础,以项目为载体,以培养学生获取信息的能力、分析能力、工程实践能力和综合应用的能力为主线,从教学内容、教学方法、教学手段等方面进行改革探索,力求实现“信息―知识―能力”一体化课程教学目标。
一、大数据背景下荷载与结构设计方法课程教学现状及存在问题
(一)教学内容离散,系统性差,知识跨越性大
由于该课程涵盖了数学、力学及土木工程所有专业课程的荷载基本计算及原理知识,而且教材各个章节的内容联系不紧密,所以各章节的知识跨越性大、连贯性差,导致学生学习效果不尽人意。此外,与修订后的新规范相配套的教材内容滞后,导致教学内容差异性大,教师只能将新规范内容融入教学中,学生学习起来常常感到很茫然。加上该课程是专业基础课,其教学内容很多是后续专业课的内容,学生由于对专业课内容不了解,也不明白该课程的具体实际用途,因此对课程的重要性认识不够,以致学习效果差。
(二)主导思想滞后,教学方法、教学手段更新慢
教学中尽管教师也不断改进教学方法和手段[9],如创设启发式、讨论式、案例式、比较式、互动式等教学方法,但是并没有从根本上改变以教师讲授为主导的教学理念。在大数据时代,信息量大,而且传播速度快,很多知识仅靠教师的讲授是无法跟上信息时代步伐的。因此,教师必须要转变教学思维,构建教师与学生合作、协同参与的多元教学模式。
二、大数据时代背景下课程教学改革的总体思路
笔者所在学校荷载与结构设计方法课程教学改革总体思路:遵照国家大数据时代加快创新人才培养的纲要要求,结合土木工程专业人才培养需求,以及荷载与结构设计方法课程内容特点,借鉴国内外先进的教学理念、教学方式、方法和手段,以大数据建设为平台,以荷载与结构设计方法课程建设项目为载体,以培养学生获取信息的能力、分析能力、工程实践能力和综合应用能力为主线,实现“信息―知识―能力”一体化课程教学目标(见图1)。大数据时代背景下,最大程度挖掘学生潜力,使荷载与结构设计方法课程教学模式越来越趋于理性,教学活动更多地开展实践教学和情感教学,充分彰显以学生为本的教学理念,让教师与学生的沟通越来越多,让教学互动性越来越强,进一步完善该课程现代多元化的教学模式。
三、基于大数据需求的课程改革路径
(一) 依托大数据平台建设,构建分层次、分模块的课程内容体系
基于大纲要求,在改革原来课程内容的基础上进一步梳理,分成荷载计算与结构设计方法两个层次,然后将荷载计算分成竖向荷载、水平荷载两个大模块,结构设计方法分为结构可靠度理论、规范设计方法,并注重内容与新规范之间的差别,强调新旧规范的对比,同时更新规范知识,突出以信息化为主导,将各模块的内容与专业课程内容衔接起来,教学中引入各专业课程知识,将荷载课程内容平台与专业课程平台进行合理的衔接。
(二)借鉴国内外先进的教学经验,构建“信息化、开放式、多元化”的教学模式
1.构建“多元混合式”教学模式,实现翻转课堂教学
借鉴“慕课”网络教学平台的教育模式,开发该课程的网络教学平台,构建“多元混合式”教学模式,实现课程教学信息化。该课程教学中将网络在线教学与课堂教学相结合,实现每节荷载课程的课前网络在线导学,特别对课程中涉及的相关专业课程内容提前在导学内容中进行布置,学生可以利用多方资源有针对性地提前对相关内容进行学习。在课堂上教师可组织学生对学习过程中的收获、问题和心得进行交流、解答和分享,并针对学生的学习情况进行有针对性的指导和讲解,对教学内容的主要知识点进行总体梳理和总结,整个教学过程实现信息与知识的融合,加深教师与学生的沟通。可以说这种“多元混合式”教学模式,实现了由传统以教师为主的填鸭式课堂教学模式向以学生为主的翻转课堂教学模式的转变,有助于教学相长,有利于学生的全面发展。
2.采用微课教学的辅助模式,开放、拓展教学和学习空间
在改革传统教学模式的基础上,引入现代化的微课教学模式,发挥微课内容精短、主题鲜明的优势,利用其形象性、精品化、便捷性等特征,将每一章的重点和难点内容制作成微课。例如,水平荷载中的风荷载、地震、土侧压力等的计算是学习的重点,也是学习的难点,将这部分内容制作成微课后学生不仅在课堂上,而且在课堂后也可以对教师所讲的内容进行学习,非常方便。将微课教学与传统教学相结合,拓展了教师教学和学生学习的空间,使教学任务和学习任务得到分解,解决了传统教学中课堂时间紧、任务重的问题。目前微课教学应用越来越广,因此,在荷载课程教学中将微课教学模式与传统教学模式相结合,是大数据时代荷载课程教学模式改革的有效途径之一。
3.加强传统教学模式与新的教学模式的融合
一切事物都具有两面性,优缺点并存,教学模式也不例外,新的教学模式也存在弊端,需要与传统教学模式进行融合,这样才可以达到事半功倍的效果。新的教学模式可以体现学生的自主性,引导学生自觉参与学习。但是针对目前学生的基本功、能力等状况,荷载与结构设计方法课程学习还需要教师的督促和指导。另外,对荷载课程中实际规范的应用及新旧规范的对比,也需要在教师的指导下对具体实际问题进行分析,尤其需要教师与学生的及时沟通。因此,完全依靠学生通过网络等新的教学模式仍然不能很好地解决学习中的实际问题,现代教学与传统教学的融合才是理想的教学方式。
(三) 依托大数据的平台建设,创建荷载课程的教学空间与学习环境
以土木工程专业大数据平台建设为契机,创建荷载与结构设计方法课程教学现代化环境。通过大数据信息平台建设,建设并完善荷载与结构设计优秀课程网络平台,为教师教学、学生学习和师生交流提供网络空间,教师和学生都可以在网络平台上下载该课程的学习资源、作业要求,还可以实现学生和教师在线互动、答疑解惑。此外,平台还提供与该课程内容相关的众多专业课程优秀网络资源的链接地址(例如:土力学、工程结构抗震、高层建筑结构等精品课程资源网址),大家可以在这里获取与课程相关内容的有益资源。在此平台还可获取该课程在后续课程及工程中的实际应用实例、工程事故案例等,帮助学生明确该课程学习的重要性,拓展学生专业视野。另外,可以建立该课程的微信群和QQ群,师生可以随时随地进行沟通交流。教学和学习空间的拓展,能充分发挥学生和教师的主观能动性,开阔学生的视野,增强学生的学习积极性。
(四) 依托荷载优秀课程平台,建立“网上―课上―卷上”一体化、全方位的考核评价体系现代化的信息技术,为荷载课程考核评价提供了众多的评价手段。改革原有荷载与结构设计方法课程评定办法,在继续采取将期末最终评定与平时考核相结合的考核办法的基础上,基于荷载优秀课程网络平台建设增加网上评价的环节,评定内容更加全面,方式更加多样。最终期末成绩(100分)=网上(15分)+课上(15分)+创新(10分)+期末试卷(60分)。具体考核办法网络评价10分:由学生在荷载课程网络学习平台上完成各阶段学习任务及作业情况,系统给出评价;学生互评5分:通过网络平台学生提出并解决问题,学生之间给出客观评价;创新实践能力10分:学生应用荷载课程的知识对实际工程事故案例提出自己的观点和处理办法;课堂作业、出勤率和课堂表现各5分:课堂上学生对该课程的重视程度,对教学内容的掌握和课程参与互动情况;试卷评价60分:通过期末考试考核学生对整体内容的掌握情况。由此建立的“网上―课上―卷上”一体化、多样性、全方位的考核评价体系(如图2所示),打破了传统的一张试卷定成绩的考核办法,是信息时代荷载课程教学改革的又一突破。
四、结语
大数据正在改变当今的社会生活,对高等教育改革也提出了一个全新的课题。本文基于教育大数据平台建设,对荷载与结构设计方法课程教学进行前瞻性研究,从课程的教学内容体系、教学模式、教学环境及考核评价体系进行创新改革探索,立足该课程学科前沿,顺应大数据时代的需求,充分彰显荷载课程教学以学生为本的教学理念,最大程度挖掘学生的潜力,实现教学方法手段的现代化、多元化,以及“信息―知识―能力”一体化的教学目标,使荷载与结构设计方法课程教学符合时代的发展步伐。
参考文献:
[1]许晔.大数据时代中国面临的挑战与对策[J].中国科技论坛,2015(3):24-30.
[2]万静.大数据:大学变革的机遇[J].国家教育行政学院学报,2015(4):67-72.
[3]黄晋.关于大数据人才培养的思考与探索[J].教育教学论坛,2014(45):201-204.
[4]楚文波.大数据背景下的教育教学改革[J].教学与教育信息化, 2015(13):181-183.
[5]孙锋.面向大数据的信息与计算科学专业实验课程体系研究[J].福建电脑, 2014(2):57-59.
[6]詹少强.大数据背景下的数据挖掘课程教学新探[J]. 长春教育学院学报,2014(22):30-33.
[7]曾祥蓉,陈进,谢孝,王薇.土木工程专业网络课程推广应用研究与实践――以混凝土结构设计原理网络课程为例[J].高等建筑教育, 2012,(21)5:142-145.
关键词:数据结构;程序;教学模式;探索
中图分类号:G642文献标识码:A文章编号:1009-3044(2007)18-31759-02
The Research of Program Teaching Patterm on Data Strucure
MO Jia-qing
(Dept. of Computer Science, Zhaoqing University, Zhaoqing 526061, China)
Abstract:The current teaching status of Data Structure is analysed and the teaching pattern which emphasizes on ability of programming based on comprehension is presented. Some research has been carried on ,such as curriculum introduction, systematic structure of Data Structure, setting of experiment subject,providing aid-studying system, curriculum design and approval. The teaching effect shows these methodes can improve the the student abilities on computer program designing effectively.
Key words:data structure; program; teaching patterm; research
1 引言
《数据结构》是信息技术专业的核心课程,它的内容主要是介绍如何根据具体情况合理地选择逻辑结构(表、树、图等)去组织数据,并设计一定的物理存储结构(顺序、链式等)有效地存储这些数据,同时设计正确的算法并对算法作出分析和评价。它在培养计算机专业学生严谨的逻辑思维能力和培养良好的编程开发能力方面有着不可替代的作用,因此成为高校计算机专业研究生招生入学考试和软件设计师认证考试的首选课程。
《数据结构》内容广泛,涉及到的知识点众多,而且逻辑性和抽象性和动态性都很强,理论和实践紧密结合,因此对学生而言学习难度大,对教师而言授课难度高。教学过程出现众多问题,具体表现如下:
(1)学生由于没有编制过大程序和项目开发的经验,虽然知道《数据结构》的重要性,但是对于学习目的不明确。
(2)学生未能将所学内容融会贯通,没能将各大知识点的区别与联系弄清楚。
(3)学生由于C语言基础不扎实,对结构、指针、参数传递等概念掌握不好,在做作业或实验时如果题目要求与教材内容相差较大,无法入手,导致信心受到打击、畏难情绪增加。此后,为应付作业,出现抄袭别人作业,或直接上网搜索现成程序的情况。
(4)虽然教师自己对教材内容很熟悉,能够将各知识点讲得很透彻,但是没考虑到学生的实际学习状况和接收能力,出现学生越学越难,理论与实践越脱节,越学越不想学的情况。
(5)目前高校扩招,入学的学生素质有所下降,逻辑思维能力和自学能力不强,也是造成教学效果不理想的原因之一。
《数据结构》的教学目标之一是提高学生的软件编制能力,而上述问题的出现使得这个目标大打折扣,因此迫切需要运用新的有针对性的教学模式。
2 《数据结构》程序教学模式
2.1 加强技能,克服程序语言造成的困难
《数据结构》中大量运用了指针、地址、结构体、函数参数传递等知识,而这些知识又是C语言中的重点和难点。如果学生对这些内容掌握不好的话,学习《数据结构》将受到很大制约。因此在开学时,教师先帮助学生重点复习C语言中与数据结构相关的知识点,实现从C语言到数据结构的平滑衔接。复习的题目形式可以是选择、填空、编程题等。
目前高校普遍采用清华大学严蔚敏编著《数据结构》(C语言版)作为教材,该教材侧重于用类C语言描述各种数据结构和算法,从头到尾并没有一个完整的C语言程序,并且该教材为使学生能方便地调用教材中的算法函数,教材中的算法函数均采用了C++的“引用”作为参数,这种“引用”参数貌似C语言中的地址,而教材并没有着重强调。作者的初衷是好的,但此举对于接触过C++的初学者造成极大困惑。学习几周后,学生发现程序调试困难,实验过程障碍重重,导致信心受到打击、畏难情绪不断增加。因而有必要让学生熟悉C++中的“引用”。
以教材上的构造空链表算法函数为例,函数参数使用“引用”调用和不使用“引用”的比较,帮助学生掌握“引用”并明白使用“引用”的好处。
typedef struct
{ElemType *elem;
int length;
int listsize;
} SqList;
使用“引用”传递参数定义函数:
Status InitList_SqA(SqList &L) {//构造空链表
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!L.elem) return ERROR; // 存储分配失败
L.length = 0; // 空表长度为0
L.listsize = LIST_INIT_SIZE; // 初始存储容量
return OK;
}
调用方式如下:
SqList LA;
InitList_SqA(LA);
使用指针传递参数定义函数:
Status InitList_SqB(SqList *L) { //构造空链表
L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if (!L->elem) return ERROR;// 存储分配失败
L->length = 0;// 空表长度为0
L->listsize = LIST_INIT_SIZE; // 初始存储容量
return OK;
}
调用方式如下:
SqList LB;
InitList_SqB(&LB),
可以看到,运用“引用”作为参数,教材上的函数基本上可以原封不动地使用,而使用指针传递参数,则需要对教材上的函数作大量修改。
另外教材为使算法描述更为简洁,算法函数内部一律省略了变量定义,这对学生的学习也造成了很大困难。因此还需要作一些针对性的训练,如通过填空题等形式补充完整函数,并适当评讲。
2.2 理解课程体系结构,融会贯通
《数据结构》课程的内容由简单到复杂,循序渐进。从一般的线性表开始,到后面的非线性的树和更复杂的图,都是讨论各种数据结构的逻辑结构和保存这种逻辑结构所采用的物理结构,以及在这种存储结构上的相关运算。理解这个体系结构,有助于学生从整体上更深入地掌握数据结构。
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文
2.3 完善框架程序,培养自信
自信心是激发学生创新能力的积极情感和重要前提。为培养学生克服困难的自信心,笔者针对各种数据结构类型设计了不同的框架程序,让学生在实验过程中逐步完善,添加新功能,最终形式一个大的系统。例如针对线性表,笔者设计了线性表功能框架文本界面,其中的菜单功能分别为链表创建、链表插入、链表删除、链表合并,其中链表合并又为一个链表合并至另一链表尾部、合并过程相同元素保留和不保留三个功能,让学生逐步将单独的小功能添加至该界面中。又例如,在学叉树这一章内容时,笔者设计了二叉树功能框架菜单,菜单包括二叉树创建、先序遍历、中序遍历、后序遍历、左右子树交换、计算树高度和叶子数量等,让学生逐步完善。通过这种不断添加小功能,最终形成一个大的系统的实验方法,使学生具有一定的成就感,自信心不断增强。
2.4 提供学习辅助系统,减轻实验负担
《数据结构》的不少实验是验证性实验,为完成实验,学生需要大量调用教材上的算法函数或对这些函数作一定的修改。为了让学生提高实验效率,将主要精力集中于程序调试而不是文字录入,笔者设计了《数据结构》学习辅助系统。该系统把各章的算法函数分门别类,供学生做实验时复制至其程序中,以减轻实验负担。另外该系统还给出了一些调用这些算法函数的完整程序,供学生参考。
2.5 分组课程设计,培养团队合作精神
课程设计是体现《数据结构》理论和实践紧密结合的重要环节。通过课程设计,不但锻练学生描述概念、构建数据结构、设计算法的能力,而且锻练学生运用自己所学知识通过高级程序语言解决实际问题的能力。
课程设计的题目一般选择综合设计类型,如风景区景点路径查询、简单114查号台等。要求学生首先进行需要分析,明确目标如何,需要实现那些功能;其次是进行概要设计和数据结构设计,定义各功能模块和其内部流程、抽象数据结构,最后编码调试并写成小论文。
由于单个学生完成任务存在较大困难,课程设计还需要分组。分组时要考虑学生的实际情况,要考虑各个小组实力均衡,具体做法是把学习成绩较好的学生和成绩靠后的学生安排在同一组。课程设计完成后,还安排答辩。答辩的形式是随机抽查小组内的一个成员,由该成员代表小组进行答辩,该成员的成绩就是该小组的成绩。要求学生回答系统设计思想、总体架构、开发过程碰到什么困难、整个系统有何优缺点等。通过这种形式,可防止出现课程设计只是由小组内水平高的学生单独完成,而其他成员基本不参与的情况。这种答辩形式可以极大地调动了学生的积极性。为了不让自己拖小组的后腿,学生们相互学习,热烈讨论,表现出极大的参与热情。最后的结果是小组所有成员水平有了很大提高,培养了团队合作精神。
3 结束语
运用高级语言进行程序设计是一个创造性的过程。《数据结构》课程的教学目标之一就是要提高计算机专业学生的程序设计语言能力。笔者在《数据结构》教学过程中的上述措施,目的就是要解决学生在学习过程中由语言所造成的困难,最终提高其程序设计能力。教学实践也证明,上述措施提高了学生C语言技能,降低由程序语言造成的难度;而且针对性的训练可让学生很快地掌握调用教材上的算法函数,理解了教材的知识体系结构。程序功能整合使学生有成就感和增强自信,需要答辩的课程设计使锻练了学生运用所学理论解决实际问题的能力,也培养了团队合作精神。这种侧重程序的教学模式取得良好的教学效果。
参考文献:
[1]严蔚敏,吴伟民. 数据结构(C语言版)[M]. 北京:清华大学出版社,2006.
[2]严蔚敏,吴伟民. 数据结构题集(C语言版)[M]. 北京:清华大学出版社,2004.
[3]黄扬铭. 数据结构[M]. 北京:科学出版社,2005.