APP下载

案例驱动的数据结构课程设计教学改革实践

2009-03-06庞晓琼

计算机教育 2009年1期
关键词:数据结构课程设计教学改革

庞晓琼

文章编号:1672-5913(2009)01-0053-03

摘要:本文针对传统数据结构课程设计教学过程中出现的问题,提出一种案例驱动的数据结构课程设计教学方式,以帮助学生理解和掌握分析问题、解决问题的方法,提高自主学习能力,锻炼设计创新能力。实践表明,此教学方式能够弥补传统教学的不足,开阔学生的思路,提高自主完成率,达到课程设计目的。

关键词:课程设计;数据结构;案例驱动;教学改革

中图分类号: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] 姜芳,杨晋明. 浅析研究性教学在高校教学中的运用[J]. 教育与现代化,2004,(1):13-16.

[5] 严蔚敏等. 数据结构[M]. 北京:清华大学出版社,2006.

猜你喜欢

数据结构课程设计教学改革
“苏州园林:景致与情思”课程设计
数据结构线上线下混合教学模式探讨
重典型应用,明结构关系
A Study on the Application of Task—based Approach to English Vocabulary Teaching
基于人才培养的技工学校德育实效性研究
现代信息技术在高职数学教学改革中的应用研究
以职业技能竞赛为导向的高职单片机实践教学改革研究
微课时代高等数学教学改革的实践与探索
关于完善课程设计教学及教学管理工作的思考
数据结构与算法课程设计教学模式的探讨