时间:2023-02-18 00:58:43
序论:在您撰写数据结构课程设计时,参考他人的优秀作品可以开阔视野,小编为您整理的7篇范文,希望这些建议能够激发您的创作热情,引导您走向新的创作高度。
关键词:课程内容;结构分析;教师素质;学习能力
随着我国综合实力的不断增强和国际地位的不断提升,大学计算机教育的重要性逐渐突显出来,而计算机教育中数据结构课程则是重中之重。进入21世纪,计算机科学与技术及相关的专业一度成为热门专业,而数据结构是该学科的基础课程,要想掌握良好的计算机技术就一定要打好基础,学好数据结构课程。然而,数据结构课程内容较为抽象、复杂,具有动态性,学生在学习的过程中感觉无从下手,到实践的过程中更是由于没有理论知识的支持而感到疑惑重重。因此,培养学生的自信心,激发学生的热情便成为当务之急。笔者将在下文中结合自己几年的执教经验对数据结构课程进行探究,不足之处,还请指教。
一、数据课程内容及体系结构分析
数据结构是计算机科学与应用专业的基础课程,该课程内容主要是介绍了软件设计中最常见的数据结构及其储存结构,本课程的难点是数据组织方面的动态储存结构及递归技术。笔者认为,可以从以下几个方面进行教学:
1.做到学以致用
在进行数据课程教学的过程中,教师可以结合实例向学生展示整个课程的内容及每个章节的重难点知识,最大限度地激发学生的学习热情和积极性,这样不仅可以使学生对本课程有个大致的了解,使学生很好地掌握理论知识,还可以培养学生运用理论知识解决实际问题的能力,真正做到学以致用。
2.为学生总结知识框架
教师要采用科学的方法对教学内容进行整理,为学生总结知识框架,这样便于学生自主学习。知识框架要由多个相互关联的模块构成,便于课程中多种知识的组合。
3.进行严格的训练
由于数据课程知识较为抽象,对于一些难度较大,较难理解的知识一定要进行及时、严格的训练,这样可以很好地培养学生严谨的学习态度,在试题之中,教师要适当地考查学生对知识的深入理解情况,便于掌握学生的学习情况。
4.对疑难点知识的补充教学及总结
针对数据课程中某些重难点知识,教师一定要进行深入地剖析,并且可以根据实际情况对教材之中的原理部分进行转化便于学生接受,还可以对教材中未提及的简易算法等进行补充,使学生便于掌握、理解。
5.注重对学生能力的培养
数据课程具有较强的实践性,在理论教学的过程中隐含了许多重要的技术知识,但教材中多是一笔带过,使学生很难理解。针对这种情况,教师一定要对教材中没有展开讨论的重点技能性知识进行解析,以培养学生解决问题的能力。
二、解析课程设计对计算机教师的要求
课程设计主要是针对学生的学习能力进行的,教师一定要根据学生的实际情况及兴趣爱好进行,要注意课题的难度,尽量控制在通过学生的努力可以完成的范围内,既不要太难,也不要过于简单。需要注意的是,计算机教师一定要对整个过程进行掌控,如果发现这个课题较难,学生花费了很长的时间也不能解决,教师就是及时进行指导,帮助学生渡过难关。因为,如果经过长时间的思考还没有解决问题,学生的兴趣和信心都会在一定程度上减弱,最终会出现消极心理,这非常不利于学生的发展;不仅如此,还要对数据结构课程的设计进行严格的验收,严谨的对待学生的成绩评定。在设计完成后,教师要进行现场评定,要充分地检查各种数据,明确指出设计之中存在的缺陷,以便于学生形成良好的治学态度,此外,对于学生设计中的闪光点,教师也要及时肯定,不吝啬鼓励、表扬的语言,使学生感受到教师对其的期望感,激发起学生的学习动力。
通过对上文的论述可知,对数据结构课程设计进行探究具有重要的意义,对我国整体高校计算机教育事业的发展是大有裨益的。数据结构课程作为计算机技术与应用专业的基础课程,对该专业学生的未来发展起到很大的作用,我们数据课程教师任重而道远。尽管在当前的数据结构教育中还存在很多问题,在未来探索的道路上更是阻碍重重,但我坚信,天道酬勤,只要我们广大高校计算机教育工作者恪尽职守,无私奉献,不断对数据结构课程进行探究,一定能够有效缓解我国当前的教育现状,为祖国培养出一批又批的综合素质较高的计算机专业人才,最终为祖国的发展和社会的进步奉献自己的一份力量。
参考文献:
[1]任雪萍,王立波,赵葆华.融入PIC-CDIO理念的“数据结构”课程教学改革[J].计算机教育,2012(12).
[2]查建中.面向经济全球化的工程教育改革战略:兼谈CDIO工程教育模式实施[J].计算机教育,2010(11).
关键词:数据结构;微课;思维导图
一、背景
数据结构课程作为计算机专业的核心基础课程,学好数据结构才能为许多后续课程的学习打下良好的基础。课程要求学生通过理论与实践学习之后,能掌握各种数据结构以及与之相关的算法的知识,并将这些知识应用到对具体实际问题的分析中。参照ACM/IEEE-CS的《ComputeCurricula2001》报告中提出的数据结构课程内容主题[1]有几十个,即课程的教学内容多,覆盖面广,而且由于很多重要知识的理论性较强,特别是一些难点知识比较抽象而难以理解,所以数据结构是被学生广泛认为难学、难懂、难实践的课程。学习的过程通常由“信息传递”和“吸收内化”两个阶段构成,采用信息化技术手段开展以微课、慕课、云课程、翻转课堂为代表的数字化教学是实现知识信息传递的有效手段[2]。微课一般是在课堂教学之外,由学生主动参与的轻量化、碎片化、结构化的学习方式,通过良好的课程结构设计,结合短视频、动画、语音等手段,能有效地将抽象的知识转为形象化的内容,从而高效促进学生“吸收内化”的进程。
二、微课及设计方法
微课(Microlecture),是指运用信息技术按照认知规律,呈现碎片化学习内容、过程及扩展素材的结构化数字资源[3]。微课课程平台是学生在课堂教学外的细化教学知识,实现“自主学习”和“个性化学习”的环境,在微课平台上,学生可按需选择学习,既可查漏补缺,又能强化巩固知识,是课堂学习的一种重要补充和拓展。从逻辑结构角度看,一个完整微课课程通常由一系列微课单元构成,一个微课单元除了用来讲述该教学主题知识点的课堂教学短视频及与短视频配套的描述或解释的短文这一最重要的核心部分之外,通常还包含与该教学主题相关的练习测试及师生交流等辅教学资源,这些资源共同组成了一个主题式、半结构化的微课教学单元。一个设计良好的微课单元通常具备主题选题精准和内容组织合理的特点。选题精准就是一个微课单元是一个教学主题,在设计这个主题时,要注意这个选题所覆盖的知识或原理应较为简单[4],其涵盖知识点可选2—3个;内容组织合理就是知识内容的组织和分解简明,将一个教学主题核心知识点和目标分解为若干个子知识点或步骤,这个核心知识点的分解最好只要一层逻辑,尽量不要在子知识点下再分解。
三、数据结构微课设计过程
数据结构课程要求学生能合理选择数据结构,并把与问题相关的数据组织起来实现准确和高效计算处理,所以数据结构的核心概念由数据的逻辑结构及其定义在逻辑结构上的运算、数据的存储结构以及运算的实现、运算算法的复杂度分析三个方面构成,而且在课程中数据的结构又与其相关的算法缠绕在一起[5],使得在微课设计时所做的知识点分析必须循序渐进地展开,采用由浅到深、由易到难的步骤,再从这个课程的知识体系出发,选取其中的重点、难点、疑点、考点、易错点、热点和扩展点,设计和制作一系列既相对独立,又环环相扣的微课主题单元[6]。
(一)知识点分析与微课主题单元划分
设计数据结构课程的微课时,首先按照课程内容的知识结构来完成各个主题单元的设计和划分。我国的大部分数据结构与算法的教材[7-8]把课程的知识体系对应到教学内容之后,分成了基本概念和基础知识、线性数据结构及相关算法、树形结构及相关算法、图结构及相关算法四个教学组成部分,这四个组成部分又可分别分成若干子模块,每个子模块又可再分成若干主题单元;划分方法可以使用表格或思维导图来协助完成。思维导图是表达发散性思维的有效图形思维工具,能直观地把各级主题的关系用相互隶属与相关的层级图表现出来[9]。借助思维导图,我们能有效完成微课课程知识结构的设计工作,图1是我们设计线性数据结构及相关算法部分的微课主题单元思维导图。
(二)微课主题单元设计
在完成对课程的教学内容主题划分之后,开始对每个教学主题单元做设计。设计主题单元时要以学生为中心,其内容选择先考虑突出主题单元中的重点知识点,同时需要保证学生能看懂、能听懂,就是尽量以生动形象的语言和动画表达知识点,特别是难点和常见疑点必须演示或解释得详细清楚。这里以单链表主题单元为例。单链表是最简单的链式存储结构,是深入学习树与图(非线性结构)的基础,其概念及其实现是本节教学的重点和难点内容,我们按照内容介绍的次序来绘制思维导图,图中带星号的是重点知识点。在制作微课资源时,可以针对不同特点的知识点采用不同的讲解形式。对于概念性的内容,只需用语言或文字以学生容易理解的方式讲述清楚概念,而对一些抽象的内容,可采用图形、对比表格、动画等方法来讲解。如单链表结点与单链表结构的知识点,我们采用的是图形动画演示配合语音讲解方法;在讲解单链表的实现时,我们采用了代码单步执行分析与图形动画演示相结合的方法来讲述,取得了较好的教学效果。
关键词:数据结构;数据结构课程设计;评价方式
中图分类号:TP3 文献标识码:A 文章编号:1009-3044(2013)05-1088-02
数据结构课程内容抽象,信息量大;在学习过程中所用到的技术多,而之前所介绍的专业性知识又不多,因而加大了学习难度;隐含在各部分的技术和方法丰富,也是学习的重点和难点。根据数据结构课程本身的技术特性,设置数据结构课程设计环节十分重要。通过实践内容的训练,能达到学生程序思维的训练和动手上机调试程序能力的增强 , 提高学生组织数据及编写大型程序的能力。
1 概述
当前我国工程教育面临的普遍问题是:工程教育与社会和产业的需求脱节,包括,工程教育的培养目标与社会需求不一致;工程教育中的质量评估结果不能真实的反映学生的能力;工程教育环境与职场环境相差甚远。当前工程教育中,很少能体现课程体系,学科之间的关联很少。关于课程评价和反馈,包括师生双方地互评。老师评价学生的手段是在学期结束时,给学生一个或好或差的成绩。学生从这个结果中,无法得知他需要进一步努力的方向。用人单位无法依据这份成绩来判断这个学生是否符合他们的需求。学生评教制度就是让学生在某个时间段(比如第14周到第16周)给老师一份评价。学校根据这份评价来考核老师的教学工作是否合格。而评教的根本目的:促使教师改进教学,服务学生,满足学生学习需求并实现学生学习利益,在很大程度上被忽略。
数据结构课程设计作为工程教育的一个环节,同样存在上述问题。另外总共32学时的课时太少,导致学生没有充分时间去实施系统分析、设计和实施的完整过程。
学生的语言掌握程度较大程度地影响到数据结构课程设计的实施。往往系统实施的思路是正确的,由于语言不熟练,又缺乏正确的调试手段和调试方法,导致程序无法通过调试或者花费大量时间进行调试。由于没有软件工程的思想,系统事先没有经过周密的设计,程序调试通过,验收时发现题目理解错误,与老师的要求相差甚远。需要重新设计,编写代码,造成学生大量时间的浪费。
最后,学生的创新能力、沟通和团队协作能力有待于进一步提高,而这些能力是作为一名工程型和创新型的计算机专业人才所必需具备的。比较显著的就是沟通问题。在验收阶段,一个简单问题无法用恰当的语言回答教师。
2 课程改革的理念和思路
课程改革的理念是充分利用本校本学院已有资源,结合CDIO理念,提高学生整体计算机专业能力,训练良好的思维方式,培养扎实的实践能力,具备创新能力和团队合作精神。
课程改革的思路:课程改革从课时数、教学内容、教学方法和评价与反馈等多方面展开。首先是在教学大纲上增加本门课程的学时数。在教学内容上,把程序语言和软件工程的内容以恰当地形式加入课程设计中。
在教学方法上,加强思维方式的训练,强调产学结合,增加学生工程经验,训练实践能力。思维方式的训练从两方面展开:在布置任务时,提醒学生按照一定的方法进行抽象,尽量避免手工操作(自动化手段);在验收阶段,针对具体的代码和算法设计思路,教师提具体的改进方案,并相应地指出可能存在思维误区。思维方式的形成不是一天就可以完成,希望经过一学期的训练可以有效地改变部分同学的思维方式。工程实践(包括工程开发各个环节的实践)能力提高也是从两方面展开:一是让学生经历工程开发的整个过程;二是提业界真实地案例供学生模仿分析学习。
评价和反馈从师生双方互评入手。教师对学生的评价要真实反映当前的知识和能力,让学生明白自己的优势和不足。学生对教师的评价真实反映这一学期教师的教学能力和教学态度。让教师进一步清楚学生具体的学习需求和自身能力提高的方向。
课程改革的目标包括加深学生数据结构基础知识的理解,拓展知识面,增强学生实践动手能力,激发学生的创新和团队协作能力,训练学生的沟通表达和思维能力,培养学生具备良好的职业素质,使学生成为一名工程型和创新型的优秀计算机专业人才。
3 课程改革的内容
该综合课程设计预计需要32学时。其中6学时用来帮助学生加强程序设计能力,先由老师讲解部分的难点重点(主要是在数据结构实施过程中常用的知识点),然后学生完成一个相对复杂的程序。
数据结构的课程设计占用中间的26学时。一学期的课程设计需要学生完成3到4个不同章节的题目。由于学生能力水平参差不齐,每章教师给出3到4个难度不同的题目供选择。这些题目部分来自配套教材,部分由教师自行设计。学生根据自身能力选择完成其中的一个题目(也可以自主选择题目,经教师审核后去实施),然后提交教师验收。在此过程中,诱导学生按照软件工程的思想去完成各个题目。具体的手段是给学生一个合理的、按照软件工程思想设计的课程设计指导书。(先设计后实现)
充分利用学院已有资源,在ACM网站开辟一个数据结构专区,按照ACM竞赛的模式设计一些题目供有余力的学生选择。对于已完成教师安排任务的学生,建议他们注册登录学院ACM网站去完成额外的题目,以此增强他们的实践动手能力。
课程设计的其中一个重要环节是验收。它不仅起着评定成绩的作用,而且还承担着训练思维,提高算法设计和沟通表达能力的作用。程序测试通过后,教师选择部分感兴趣的代码,要求学生解释。如果得不到满意的解释,教师可以暂停此次验收。这个环节可以考验学生的沟通表达能力,以及对系统的理解程度。在一定程度上的杜绝拷贝这种现象,退一步,就算是拷贝也必须完全理解整个系统,强制学生必须实际参与课程设计。
接着去提高代码的质量和效率。先一起分析具体的代码,研究算法的效率有无进一步提高的空间。若有该如何修改,教师根据学生的具体情况,讨论确定方案后,交由学生完成。效率提高后的系统,可以在下一次课再次要求验收。另外,教师需要明确指出明显不符合计算思维的代码,要求学生当堂修改。
最后根据题目难度、完成的质量以及验收时的表现,给出一个成绩并登录在册,作为最终成绩的一部分。每个验收的系统必须提交一个配套的课程设计报告。课程设计报告能让学生学会正确的测试和事后的分析总结,起到部分的自我评价功能。每份课程设计报告也有成绩,同样登记在册,作为评定最终成绩的一个标准。
在课程设计结束时,老师除了给每位学生的一个成绩以外,再对出现的问题进行分析总结并以文档的形式反馈给学生。内容包括语言的掌握程度以及还存在的问题;数据结构的基本内容掌握情况,提交程序的效率、有无按照软件工程的思想完成,还需重点解决的问题;创新能力、沟通和团队协作能力如何等等。
参考文献:
[1] John Malmqvi st. The Application of CDIO Standards in the Evaluation of Swedish Engineering Degree Programmers[J].World Transaction on Engineering and Technology Education,2006,5(2):361-364.
[2] 查建中. 面向经济全球化的工程教育改革战略[J].计算机教育,2010(11):2-7.
[3] 中国CDIO网站. CDIO简介[EB/OL].http:///vNews.asp?typeID=30&parentID=29. 2011.
[4] 苟喜霞.车载导航系统最优路径规划的研究[D]. 北京:北京交通大学,2009.
[5] 任雪萍,王立波,赵葆华.融入PIC-CDIO理念的“数据结构”课程教学改革[J].计算机教育,2012(7):29-32.
数据结构是计算机科学的基础理论知识,也是软件设计的技术基础。本课程设计的性质是检验理论科学系的效果以及综合运用的能力,目的是训练学生进行复杂程序设计的技能和培养良好的程序设计习惯。本课程设计的任务是要求学生使用C或C++语言编程,解决具有一定规模的、具有实际意义的应用题,实现理论课所要求的数据组织、存储、处理的基本方法。
二、课程设计所用到的工具
这次课程设计所用到的工具Microsoftvisualc++6.0PC机一台。
三、这次课程设计我所选择的两个题目
1、一元多项式计算。
设计分析
一)一元多项式计算
1、需求分析
要求按照指数将序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输入。
2、概要设计
在分析题目要求的基础上,我首先设计了一个结构体,定义如下:
structpoly
{floatcoef;
intexp;
polytypenext;};
在这个结构体中,定义了一个浮点型的系数coef,还定义了一个整形的指针exp。接下来要做的就是定义各个不同用途的函数,以满足课程设计的需要,所用到的函数定义如下:
polytypeCreate_Empty_Node(int);创建一个空链表
voidInput_Values(polytype,int);输入值
voidInsert_Node(polytype,float,int);插入接点
voidAdd_Poly(polytype,polytype);将两个多项式相加
voidSub_Poly(polytype,polytype);将两个多项式相减
voidOutPut_Results(polytype);将结果在显示器上显示
3、源代码
#include"stdio.h"
#include"stdlib.h"
typedefintdatatype;/*定义多项式节点的结构*/
typedefstructnode
{floatcoef;/*系数*/
intexpn;/*指数*/
structnode*next;/*指向结构体的指针*/
}PotyNode;/*建立连表,返回指向多项式头节点的指针*/
PotyNode*Creat_PotyNodeTail()
{PotyNode*L,*s,*r;/*声明结构体指针*/
floatc;/*系数*/
inte;/*指数,建立头节点,头节点指针设置为空*/
L=(PotyNode*)malloc(sizeof(PotyNode));
L->next=NULL;/*是指针r指向头节点*/
r=L;
printf("\ninputcoefandexpn:");
scanf("%f%d",&c,&e);
while(c!=0)/*输入的第一项系数不允许为0,防止无意义的输入*/
{/*初始化节点*/
s=(PotyNode*)malloc(sizeof(PotyNode));s->coef=c;s->expn=e;s->next=NULL;
r->next=s;/*连接节点*/
r=s;/*指针r指向当前节点,用于连接下一节点*/
printf("\ncoefandexpn:");
scanf("%f%d",&c,&e);
}returnL;
}/*获得多项式的长度,参数为多项式头节点指针*/
intGetlength(PotyNode*L)
{PotyNode*p;intcount=0;p=L->next;
while(p)
{count++;p=p->next;}
returncount;}/*获得指向i节点的指针,在删除节点的时候来获得准备删除的前一节点*/
PotyNode*GetElem_PotyNode(PotyNode*L,inti)
{PotyNode*p;intj=0;p=L;
while(p->next&&j!=i)/*当p不是尾节点,并且不是第i个节点*/
{j++;p=p->next;}
if(i==j)
returnp;/*找到节点*/
else
returnNULL;/*没有找到节点*/}/*删除节点i*/
intDelete_PotyNode(PotyNode*L,inti)
{PotyNode*q,*p;/*获得节点i的前一个节点,便于删除节点i*/
p=GetElem_PotyNode(L,i-1);q=p->next;
if(q)/*如果P为空,则说明节点p也就是节点i-1就是尾节点,节点i实际并不存在*/
{p->next=q->next;
free(q);return1;}
else
return0;}/*对输入的多项式LA,LB进行相加,结果为LC,返回指向LC头节点的指针*/
PotyNode*Add_PotyNode(PotyNode*LA,PotyNode*LB)
{PotyNode*LC,*q1,*q2,*r,*s,*p;
intx=1;q1=LA->next;q2=LB->next;LC=LA;
LC->next=NULL;/*指针r是当前指针便于进行各种操作*/
r=LC;
while(q1&&q2)/*当多项式LA,和LB都没有结束的时候*/
{if(q1->expn<q2->expn)
{s=q1;q1=q1->next;}
elseif(q1->expn>q2->expn)
{s=q2;q2=q2->next;}/*指数相同,相加*/
else{q1->coef+=q2->coef;
s=q1;q1=q1->next;q2=q2->next;}/*结果连接到多项式LC*/
s->next=NULL;r->next=s;r=s;}/*如果LB已结束,把LA剩余的部分连接到LC上*/
if(q1)r->next=q1;
if(q2)r->next=q2;/*去除多项式中系数为零的项,我对代码作了小的修改*/
p=LC->next;
while(p->next)
{if(p->coef==0)
{p=p->next;
Delete_PotyNode(LC,x);}
else
{p=p->next;x++;}}
returnLC;}/*打印多项式*/
voidprint_PotyNode(PotyNode*L)
{inti;PotyNode*p=L->next;
for(i=0;i<Getlength(L);i++)
{printf("%fX%d",p->coef,p->expn);
if(p->next==NULL)
return;
elseprintf("+");
p=p->next;}}
voidmain()
{PotyNode*LA,*LB,*LC;
intx;
printf("inputLA(endby0):\n");
LA=Creat_PotyNodeTail();
printf("f(LA)=");
print_PotyNode(LA);
printf("\ninputLB(endby0):\n");
LB=Creat_PotyNodeTail();
printf("\n");
printf("f(LB)=");
print_PotyNode(LB);
printf("\n");
LC=Add_PotyNode(LA,LB);
printf("Afteraddf(LA)andf(LB),f(LC)is:");
print_PotyNode(LC);
scanf("%d",&x);}
3、运行结果
提示输入一个多项式LA(以0结束)然后输入每项的系数和指数,输入后再提示输入另一个多项式LB(以0结束)然后输入每项的系数和指数。按回车键后得出f<LC>=f<LA>+f<LB>。
1、需求分析
1)输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。
2)输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出“全部字母数”、
“数字个数”、“空格个数”、“文章总字数”(3)输出删除某一字符串后的文章
2、概要设计
a、建立文本,存储结构用链表
voidCreateTXT(LINE*&head){
printf("\n请输入文本,每行最多输入80字符!\n");
printf("输入Ctrl+E(^E)则结束输入\n");
LINE*p=newLINE;//首先为链表建立一个附加表头结点
head=p;//将p付给表头指针
chartmp[80];
b、计算空格数
intCount_Space(LINE*&head){//统计空格数
LINE*p=head;
intasc_space=32;//空格的ASCIC码值
intcount=0;
do
{intLen=strlen(p->data);//计算当前data里的数据元素的个数
for(inti=0;i<Len;i++)
if(p->data[i]==asc_space)count++;}//计算空格数
while((p=p->next)!=NULL);//遍历链表
returncount;}
c、统计数字数
intCount_Num(LINE*&head){//统计数字数
LINE*p=head;
intcount=0;
do
{intLen=strlen(p->data);//计算当前data里的数据元素的个数
for(inti=0;i<Len;i++)
if(p->data[i]>=48&&p->data[i]<=57)count++;}//计算空格数
while((p=p->next)!=NULL);//遍历链表
returncount;}
d、统计文章的总字数
intCount_All_Word(LINE*&head){//统计文章的总字数
LINE*p=head;//保存链表的首地址
intcount=0;//总字母数
do
{count+=strlen(p->data);}//计算当前行内的字符数!除''''\0''''结束符外!注意,该统计包含“空格的长度!”
while((p=p->next)!=NULL);//遍历链表
returncount;}
3、源代码
/*definemacrovariables*/
#definetrue1
#definefalse0
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<conio.h>
#defineSTACK_INIT_SIZE100/*variablesinthesavestoragespace*/
#defineSTACKINCREMENT10/*incrementofdistributioninthesavestoragespace*/
typedefstruct
{char*base;/*beforeandafterthecreatingoftheshed,baseisNULL*/
char*top;/*shedpointer*/
intstacksize;/*thesavestoragespacedistributivebytheelement*/
}SqStack;
SqStackS,q;
/*constructastructuerarray*/
typedefstruct{
charcc[9999];
intno;}Array;
/*definethewholebureauvarible*/
Arraya[10000];
intm,n,i,j;
charname[40];
chart=''''\n'''';
FILE*fp;
/*constructanemputyshed*/
voidInitStack()
{S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(S.base==NULL)
exit(1);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;}
/*usingcharactershed,acceptthedatafromtheterminal*/
voidpush(chare)
{if(S.top-S.base>=S.stacksize)
{/*applyanewroom*/
S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base)
exit(1);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;}
/*acceptthenextcharacter*/
*S.top++=e;}
/*carrythewholedatainthestackintothedatasection*/
charpop()
{chare;
if(S.top==S.base)
returnfalse;
e=*(--S.top);
returne;}
/*emptythedatainthestack*/
voidClearStack()
{S.top=S.base;/*letS.topandS.basepointtothesameplace*/}
/*destroythestack*/
voidDestroyStack()
{free(S.base);/*freethedatainthestack*/
S.top=S.base;}
/*judgetheemputyoftheshed*/
intStackEmpty()
{if(S.top==S.base)
returntrue;
returnfalse;}
/*takeoutthedatafromthestackandtheputinthestucterarray*/
voidBuffer(){
n=0;m=1;
/*movethedataintheshadeuntillthestackisempty*/
while(S.top!=S.base)
{n=n+1;
a[m].no=a[m].no+1;
a[m].cc[n]=*(S.top-1);
S.top--;}}
/*savethedata*/
voidsave()
{printf("\n\nfilename:");
scanf("%s",&name);
fp=fopen(name,"wb");
for(i=1;i<=m;i++)
{for(j=a[i].no;j>=1;j--)
{fwrite(&(a[i].cc[j]),1,1,fp);}
fwrite(&t,1,1,fp);}
fclose(fp);}
/*mainfunction*/
voidmain()
{charch,e;
printf("\n\n\n\t\t\twelcometousethewholescreeneditor");
printf("\n\npressF6ifyouwanttosavethefile,youcansavethefilewhenyousee\"^Z\"\n");
printf("\n******************************************************************************\n\n");/*SqStackS_stack,D_stack;*/
InitStack();/*InitStack(D_stack);*/
ch=getchar();
while(ch!=EOF)
{while(ch!=EOF&&ch!=''''\n'''')
{switch(ch)
{case''''#'''':e=pop();break;
case''''@'''':ClearStack();break;
default:push(ch);break;}
ch=getchar();}
Buffer();
ClearStack();
if(ch!=EOF)
ch=getchar();}
save();
DestroyStack();}
4、运行结果
三、这次课程设计的心得体会
通过实习我的收获如下
1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。
2、培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。
3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。
根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点:
1、认真上好专业实验课,多在实践中锻炼自己。
2、写程序的过程中要考虑周到,严密。
3、在做设计的时候要有信心,有耐心,切勿浮躁。
摘要:本文针对传统数据结构课程设计教学过程中出现的问题,提出一种案例驱动的数据结构课程设计教学方式,以帮助学生理解和掌握分析问题、解决问题的方法,提高自主学习能力,锻炼设计创新能力。实践表明,此教学方式能够弥补传统教学的不足,开阔学生的思路,提高自主完成率,达到课程设计目的。
关键词:课程设计;数据结构;案例驱动;教学改革
中图分类号: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.
(中北大学 计算机与控制工程学院,山西 太原 030051)
摘要:介绍数据结构课程设计辅助教学平台的设计过程,说明其构建思路、系统结构和实现方法,阐述该平台集内容提供、多媒体资料库浏览、流媒体播放和交流互动于一身,采用Adobe Flex、PHP、MySQL、Apache和flash Media Server等技术,以纯Flash方式展现,指出使用该平台可以更好地发挥教师引导、启发、监控教学过程的主导作用,同时又能充分体现学生作为学习过程主体的主动性和创造性,有利于教师启发教学和学生自主建构知识体系。
关键词 :数据结构;课程设计;教学平台
基金项目:国家自然科学基金项目(61379125);山西省自然科学基金项目(2012011015-3);山西省高等学校科技创新项目(2014143)。
第一作者简介:庞晓琼,女,讲师,研究方向为信息安全与密码学,xqpang@nuc.edu.cn。
0 引言
数据结构是计算机相关专业的核心基础课程,根据教学大纲安排,各章节安排相应教学内容的验证性上机实验,还设置针对课程内容的综合设计实验环节,这是考查学生理论联系实际动手能力的重要环节,对锻炼学生发现问题、解决问题的能力也很有裨益。数据结构课程设计实验步骤如下:需求分析——选择并构造合适的数据结构——功能函数设计——具体编码实现——运行测试——完成课程设计说明书。在传统的教学安排中,实验过程由学生独立完成,教师的作用主要是答疑、过程监督和成果验收等方面,这种强调学生的“学”而忽视教师主导作用的教学过程虽然会涌现出一些优秀的作品,但也存在一些问题:一是学生自由度过大,容易偏离课程设计教学目标;二是部分学生由于缺乏专业训练,没有形成正解的思维方法,拿到题目无从下手,只能生搬硬套基本数据结构;三是代码编写不够规范,可读性差,也不注重文档的整理;四是存在照抄他人课程设计的现象 [1-3] 。
数据结构课程设计是个综合性实践环节,不仅需要数据结构知识,还是对计算机程序设计语言、离散数学和软件工程等课程的综合运用。学生的自主学习和教师的主导学习相结合十分重要,为更好地发挥教师引导、启发、监控教学过程的主导作用,结合当前互联网应用开发的主流技术,我们设计实现了数据结构课程设计辅助教学平台,用于指导和帮助学生完成课程设计。
1 设计过程
1.1 目的与思想
数据结构课程设计辅助教学平台的主要目的包括:①通过优化学生自主学习环境,完善学习策略,充分发挥教师引导、启发、监控教学过程的主导作用;②为学生自主建构知识体系创造条件,使学生系统掌握数据结构课程内容、锻炼和提高编程能力,充分体现学生的主动性、创造性并得到成就感。设计思想主要体现在:①充分发挥互联网作用,互联网应用已成为学生课余生活的重要组成部分,教师应因势利导,利用互联网对学生进行指导和辅导;②要激发学生的兴趣,兴趣是最好的老师,教学平台的界面要美观大方和简洁明朗,注重多媒体组件的选择和使用;③学习环节的设计要贯穿整个课程设计过程,覆盖不同知识层面的学生;④注重新媒介和新技术的使用,紧跟时展步伐;⑤尊重互联网规律,在知识大爆炸时代,微课堂、“短平快”是主流,注重化繁为简和突出重点。
1.2 内容构建
(1)教师可结合数据结构实验环节的特点,挑选综合性强、涉及知识面广、适合学生自主创新的经典案例,由教师制作成设计分析讲解、代码编写讲解和运行测试讲解等分段视频,学生根据需要可自主点播。教师通过引导和启发,开拓学生思维,鼓励学生自主构造更合理的数据结构,实现更完善的功能。平台选取的案例均可用多种数据结构实现,适用于不同层次的学生,同时也考查学生对于算法设计、内外排序、文件存取和实现效率等各方面知识点的掌握情况,是对学生综合能力的考验。
(2)为了使学生能够学以致用,教师可通过咨询社会上相关领域的工程师、系统分析师和从业人员并对历届毕业、就业的学生进行问卷调查,在资源选择和案例讲解中注重理论联系实际,着力从项目管理、软件工程、测试驱动开发等方面传授从业经验,为提高学生的就业能力打下坚实基础。
(3)在教学资源的运用上,教师可提供视频、音像、文档、幻灯片、表格、图形图像和电子书籍等多种媒体形式,涵盖数据结构课程设计涉及的C语言程序设计、C++语言、算法设计、离散数学等资源内容;尊重原创者的版权,培养学生的版权意识,对所有引用的资源均详细标明来源及版权信息。
(4)注重有教无类,使不同能力水平的学生都能从中汲取养分。对于初级水平的学生,通过学习视频讲解、参考优秀作品和阅读教师点评,找到完成课程设计的入口,自主完成课程设计;对于能力强、学有余力的学生,通过查看共享资源和在自主探索中挑战自我,锻炼驾驭问题的能力,规范编程风格并实践软件工程。
(5)注重沟通交流,授人以渔。平台中开设释疑解惑栏目和课程设计论坛,预留微信公众账号,学生可以提出问题及求解,促进和强化师生间、学生间的互动交流,从点点滴滴中积累学习。
2 实现过程
2.1 系统架构
数据结构课程设计辅助教学平台的系统架构如图1所示。
数据结构课程设计辅助教学平台Web服务器采用Apache服务器,以纯Flex技术实现,数据库采用MySQL,由PHP从数据库中读取数据形成XML文件提供给Flex使用,用户通过浏览器以HTTP协议访问该平台。媒体播放采用两种形式:一是普通的媒体文件,均以Flash形式提供,包括幻灯片、课件、文档和书籍等;二是流媒体,通过FMS(Adobe Flash Media Server)流媒体服务器以RTMP协议向客户端推送。相对于下载后观看的网络播放形式而言,流媒体的典型特征是把连续的音频和视频信息压缩后放到网络服务器上,用户可以边下载边观看。采用流媒体方式和流媒体服务器还可以减轻服务器的访问压力,使得平台能够同时处理更多的用户视频点播请求。
2.2 技术特点
(1)平台是一个典型的富互联网应用(rich internet application,RIA),RIA的好处在于比用HTML能实现的接口更加健壮,反应更加灵敏,可视化特性更加出色。RIA的实现技术包括Ajax、Flex和Silverlight等,本平台使用的是Flex技术。Flex结合了音频、视频和实时通讯,用户体验极佳,具备桌面应用程序的用户交互感和传统网络应用的部署便利性。
(2)平台开发坚持跨平台、跨浏览器的特性,使用技术及组件包括Adobe Flex、Apache、PHP、MySQL、Adobe Flash Media Server等,均具备良好跨平台特性,后台服务器支持Windows、Linux和Unix等不同操作系统。平台以纯粹的Flash形式展现,具备良好跨浏览器特性,只要装有Flash Player的浏览器都能够正常浏览,支持所有主流浏览器,如IE、火狐、UC、Chrome等,客户端支持Windows、Linux等主流操作系统,同样也支持移动互联网以及基于Android、iOS的平板电脑、手机等便携设备。
(3)平台中使用到的视频、音像、文档、幻灯片、表格、图形图像和书籍等统一转换为flv格式文件,用户只需要通过浏览器就可以在线查看上述各种形式的媒体资源,不需安装任何其他插件或应用软件(如Word、 Excel、 Powerpoint等),充分考虑了客户端的跨平台和多样性。
(4)视频点播和视频直播中采用了FMS(Adobe Flash Media Server)流媒体服务器,该技术是主流的视频传播实现技术。通过FMS,流媒体文件将通过RTMP协议向客户端推送,图像压缩率更高,播放流畅清晰。与下载视频文件到本地后观看的网络播放形式相比,流媒体的典型特征是用户可以边下载边观看,浏览速度快,播放中支持拖拽和定位。此外,FMS还具备良好的可扩展能力,可根据用户群规模增加边缘服务器(edge server)迅速提高访问能力。
(5)流媒体视频讲解中充分利用了电子黑板软件,结合数位板硬件,在多媒体教学结合“板书”讲解,既“现代”又“传统”,让教师能够把握教学的主线,学生有充分的消化时间,弥补了多媒体教学中的不足。
(6)设计细节上注重界面设计,功能分区清晰、导航明确、操作简便、提示信息丰富;而Flash的动态特点可以增强平台的动感效果,使得颜色搭配赏心悦目、色调把握得当并以CSS样式表统一平台的风格,提高学生的使用兴趣。
2.3 功能模块
平台目前具备7个模块,分别是首页、影音中心、堂件集萃、资源共享、自主探索、优秀作品和释疑解惑,如图2所示。
1) 首页模块。
首页模块(如图3所示)是平台的门面,介绍平台的目的和特色,展示最新的信息和媒体介绍。首页分为4个功能区域:1是新闻区,用来最新的通知、相关信息、教师布置的作业等;2是最新媒体资源展示区;3是平台的菜单导航区;4是网络资源链接区。
2) 影音中心模块。
影音中心模块(如图4所示)集中展现平台中所有的媒体资源,包括flv形式的流媒体视频,Flash形式的教学堂件、幻灯片,Flash形式的文档、表格、书籍、代码和资料,分为3个功能区域:1是资源类目区,以树型结构展示;2是媒体放映区,支持各种格式的文档(如图5所示),也能进行视频点播和在线视频直播;3是资源区,显示当前类目对应的视频、幻灯和文档资源。
3) 堂件集萃模块。
堂件集萃模块(如图6所示)以图像列表方式展现理论课堂教学和案例视频教学中的堂件,每个堂件均配有标题、所属类目、内容介绍等文字信息。所有堂件都是以Flash的形式展现,支持声音、动画、切换等功能(如图7所示)。
4) 资源共享模块。
资源共享模块汇集教师和学生提供的电子书、国内外经典数据结构教材等信息资源和学习辅助材料,每个文档均注明资源名称、来源、所属类目、内容介绍、版权信息等情况。该模块以文字列表形式展现,通过点击单条记录可在线阅览相应文档。所有文档资料均采用FlashPaper形式提供在线阅读,不需安装其他插件或软件。
5) 自主探索模块。
自主探索模块提供一些课程设计实践环节要求之外的、富有挑战性的课题,方便学生开拓思维、勇攀高峰、锻炼挑战自我能力,促进学生自学。
6) 优秀作品模块。
优秀作品模块提供历届学生的优秀作品,这些作品均完成得较为出色且富有创新性,具有参考价值,可供广大学生下载和学习。每个作品都包含作者信息,详细注明题目要求和设计内容,有些还附有教师点评。
7) 释疑解惑模块。
释疑解惑模块(如图8所示)是师生之间、学生与学生间互助学习的园地,分为3个功能区域:1区显示既往学生提出的问题及教师的答复;2区是学生向教师提出问题的区域;3区提供“中北大学数据结构论坛”的链接。
3 结语
数据结构课程设计辅助教学平台已在3届计算机、网络工程、软件工程专业学生的数据结构课程设计过程中使用。通过指导教师和每个学生进行一对一答辩的结果来看,学生的课程设计水平有了明显提高,对数据结构的运用更加灵活,思路也更加开阔,达到了建设该辅助教学平台的初衷。下一步,我们将设计开发与该平台对应的微信公众账号,使平台成为师生课余交流的重要途径。
参考文献:
[1] 庞晓琼. 案例驱动的数据结构课程设计教学改革实践[J]. 计算机教育, 2009(1): 53-55.
[2] 马巧梅, 庞晓琼, 杨秋翔. 数据结构课程设计案例教程[M]. 北京: 人民邮电出版社, 2012: 1-3.
关键词:数据结构;课程设计;教学过程;实施方法;评价标准
中图分类号: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.
[2] 苏仕华.数据结构课程设计[M].北京:机械工业出版社,2005.