绪论:写作既是个人情感的抒发,也是对学术真理的探索,欢迎阅读由发表云整理的11篇数据结构课程设计范文,希望它们能为您的写作提供参考和启发。
二、课程设计所用到的工具
这次课程设计所用到的工具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、写程序的过程中要考虑周到,严密。
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.1编程语言基础差
数据结构课程设计通常是在大二进行,算法是基于C/C++语言。虽然学生之前已先修过这些课程,但C++本身规则复杂,面向对象的思想不容易掌握,而学生又没有经过系统训练,普遍存在编程语言基础薄弱、对调试程序的方法不够熟练、程序结构设置不合理、代码编写可读性差等问题。不少同学反映算法能听懂,看教师演示一些实例也觉得简单,但轮到自己编程就无从下手。这种状况直接制约了学生完成课程设计的质量[1]。
1.2缺乏系统的软件开发思想
计算机专业的课程体系中,软件工程通常安排在数据结构课程设计之后,这样学生在进行课程设计时,尚不具备软件开发的思想。遇到问题时,只考虑怎么实现,没有进行整体软件开发的过程规划,忽视了软件的性能、质量、甚至于需求都不甚明确就急于动手编写程序。这样的做法使得课程设计的完成效率很低,经常需要返工。
1.3教师的指导“过多”或“过少”
课程设计中,教师的指导相当重要,但是目前存在两个极端,有的教师对每个课程设计都讲解得面面俱到,如何实现,用什么样的存储结构,所得结果等都作了交代,学生只是被动的接收者,这种“填鸭式”的教学方式制约了学生的创新能力。而另一个极端,有的教师认为课程设计是由学生上机完成的,教师督促学生,最后给出考评,对学生完成课程设计的过程关注太少,很多学生因此敷衍了事。教师如何把握指导的度,如何指导是学生能力能否得到提高的一个重要因素[2]。
1.4考评制度不合理
长期以来,课程设计报告被看成是评定学生成绩的一个重要依据,而对学生软件开发的过程关注不多,学生只要上交了报告就能获得成绩[3]。这样的做法导致学生过度追求报告的整洁度、实验结果的正确性等。甚至部分同学抄袭、直接从互联网上下载报告交差。一个学期下来,除了交了几份报告,学生的收获甚少,课程设计教学效果甚微。因此,必须改革考评制度,才能真正培养学生的动手能力、创新能力。
2提高课程设计教学效果的措施
2.1规范软件开发的过程,培养良好的编程习惯
在学生开始课程设计前,教师首先通过一个具体的实例,从需求分析、概要设计、详细设计、编程测试等各个方面出发,让学生了解完整的开发软件过程。在数据结构课程教学中,所有算法均用可运行程序讲解,避免出现懂算法不懂编程的现象。有意识地让学生强化编程的技巧、调试方法、面向对象思想等内容。
我院数据结构课程组教师采用面向对象的思想,将数据结构中基本算法全部用C++模板类实现,学生通过多看、多读这些规范的程序,取得了不小进步。
2.2梯度命题,循序渐进开展课程设计
课程设计以往是教师根据实验指导书布置课题后由学生完成,部分学生感到难度很大,无从下手。现阶段我们将课程设计改为验证型、验证设计型、设计应用型多种层次,针对各种基本数据结构,教师首先用模板类实现,学生在课程设计时先用实例验证程序,在此基础上,设计出预留的一些函数接口,实现该类的部分功能。最后再针对某一具体问题,由学生开发出完整的程序。这是一个由易入难的循序渐进的过程,学生通过验证型实验更加牢固掌握基本数据结构,再由验证设计型和设计应用型实验学会如何应用数据结构,如何在计算机中实现存储,实现各种需求的功能。
下面以二叉树部分内容为例,首先实现二叉树的模板类如下:
/*二叉树类*/
template
class BinaryTree
{
public:
BinaryTree():m_root(NULL){} /*构造函数*/
~BinaryTree()//析构函数
/*按以先序次序输入结点值的方式建立二叉树的接口函数*/
void Create1(ElemType ch[],const ElemType &endChar);
/*以二叉树的先序和中序次序建立二叉树的接口函数*/
void Create2(ElemType ch1[],ElemType ch2[],int );
/*先序递归遍历二叉树的接口函数*/
void PreorderTraverse (void (*visit)(const ElemType &));
/*中序递归遍历二叉树的接口函数*/
void InorderTraverse (void (*visit)(const ElemType &));
/*后序递归遍历二叉树的接口函数*/
void PostorderTraverse (void (*visit)(const ElemType &));
……
private:
BTNode *m_root;
/*按先序次序输入结点值的方式建立二叉树*/
void _Create1(BTNode* &,ElemType ch[],const ElemType &,int &);
/*已知二叉树的先序遍历次序及中序遍历次序,建立二叉树*/
void _Create2(BTNode * &,ElemType ch1[], ElemType ch2[],int ,int ,int &);
/*先序递归遍历二叉树*/
void _PreorderTraverse(BTNode* ,void (*visit) (const ElemType &e));
……
};
对于这样的模板类,设定的验证型实验为:给定一棵二叉树,验证其先序中序和后序遍历结果。在掌握了二叉树遍历的基础上,设计出模板类中预留的两个接口函数create1和create2。最后,安排设计型实验为创建表达式树;分别用三种遍历方式遍历该树,比较它与实际的波兰式、中缀式和逆波兰式之间的区别;完成给定表达式树的表达式求值运算。这样有梯度地安排课程设计,一方面强化了基本概念,另一方面引导学生完成更复杂的设计。对基础薄弱的同学来说,验证型实验难度不大,基本都能完成,大大增强了自信;对优秀学生来说,挑战设计型实验更能提高自身的能力。
2.3抽丝剥茧,层层深入启发
学生遇到复杂问题时,往往一筹莫展,不知如何下手。教师应教会学生如何从问题本身出发,层层分析,应采用哪种数据结构,用到什么样的操作,在这样的操作需求下应用何种存储方法比较合适,最后细化到具体的函数实现。
如教学计划编制问题[4],要求根据课程和课程之间的先修关系,得到合适的教学计划安排。首先分析这个问题是对有向图进行拓扑排序,课程和课程之间的先修关系可用有向图描述出来。数据结构为有向图,存储方式为邻接表,应用的操作是拓扑排序。拓扑排序的基本思想是先输出有向图中入度为零的顶点,再从图中删除该顶点和所有以它为尾的弧,重复执行,直至图中所有顶点均输出为止。要完成拓扑排序,首先要求出图中所有顶点的入度。拓扑排序算法中还用到了一个辅助的数据结构栈,因此还需要初始化栈、出栈,入栈,判定栈空等操作实现。这样层层分析下来,程序中需要的函数一一明了:创建有向图、邻接表的建立、求顶点入度、初始化栈、出栈、入栈、判定栈空、拓扑排序等。函数层次关系图示如图1所示。
图1函数层次关系图
通过这样的教学方式,学生学会了带着问题去思考,逐步学会将大的程序化解成若干小函数,最终经过整合完成整个设计开发。
2.4加强团队合作,调动每位同学积极性
在课程设计中,针对每一种数据结构安排了一个工程性综合实验,这个综合实验由几名同学组成小组合作完成。团队成员分工明确,一名同学担任组长,负责组织和控制组内的工作进程,强调任务落实到组内每一个同学。
教师布置任务后,每个团队将软件开发流程应用到课程设计中,实质性进行问题规划、模块划分、项目整合等工作。只有团队中每个成员都积极面对,整个团队才能获得优秀成绩,无形之中鞭笞每位同学认真对待。在一个团队中,大家集思广益,可以跟伙伴一起交流,互相学习,形成共同进步的良好局面。
最后在验收答辩时,团队中每个成员都应汇报自己所做工作,教师和其他团队可以提问,交流开发过程中的心得。
2.5改革考评制度,从多角度综合考虑成绩
合理的考评制度可以对课程设计过程进行有效的监控,通过考评体系可以反馈各阶段的进展情况,便于总结经验,找出不足,保证课程设计的质量和效果。课程设计考评有别于普通的课程评分,我分院数据结构课程设计的成绩由几个方面综合决定:课程设计的内容、课程设计的实现以及实验报告。各项考评指标均有一定的权重,能够比较客观公正地确定学生成绩。其中课程设计的内容主要考虑学生所选课题的难易度、工作量多少。实现过程主要考虑完成情况、软件代码规范化、文档规范化、答辩质量等,最后由学生提交设计报告进行总结和讨论。设计报告除了包括常规的系统需求分析,概要设计,详细设计,调试分析和实验结果外,还鼓励他们提出优化方案,对于每个课程设计再“多想一点”,即其他可能存在的求解方法,如已经使用了链式存储结构实现,那使用顺序存储结构如何实现?各种设计的优缺点是什么?如何提高时间空间性能?通过总结,学生对问题有了更加深入全面的理解,锻炼了扩散思维方式,培养了创新能力。同时教师对评价优秀的学生或团队给与奖励,促使学生之间形成你追我赶的良好学习氛围,整体提高教学质量。
3结语
数据结构作为计算机专业的重要基础课程之一,对学生软件开发习惯的培养至关重要。提高课程设计教学质量不仅可以巩固基本知识,还可以让学生适应快速发展的软件开发技术,激发学生学习和研究的兴趣。本文从五个方面讨论了提高课程设计教学质量的措施,通过一个学期的教学实践,从效果上来看,这届学生分析问题、解决问题的能力,综合创新能力,学习积极性都比前几届学生有了明显提高,绝大部分的同学都能顺利完成课程设计并获得较好成绩,这为他们后续的课程打下了坚实的基础。
参考文献:
[1] 庞晓琼. 案例驱动的数据结构课程设计教学改革实践[J]. 计算机教育,2009(1):53-64.
[2] 陈越,何钦铭,冯雁.“数据结构”综合性课程设计教学探索与实践[J]. 计算机教育,2008(8):54-55.
[3] 李群,赵玉霞,庄波.《数据结构》实验课程设计与探讨[J]. 中国现代教育装备,2007(3):27-28.
[4] 严蔚敏,吴伟民. 数据结构(C语言版)[M]. 北京:清华大学出版社,2006:180-182.
Discussion and Practice on Improving Teaching Quality of Data Structure Course Design
XU Chong, WANG Libo, JIANG Juan
(College of Computer Science, Hangzhou Dianzi University, Hangzhou 310018, China)
中图分类号:TP312.1-4 文献标识码:A 文章编号:1007-9416(2012)10-0212-02
1、课程教改的原由
我院C程序设计课程与数据结构课程是分上下学期开设的,将C程序设计课程作为数据结构课程的前导课,综合两门课程的教学效果,发现具有以下弊端:
首先,在C程序设计的讲授过程中,教师和学生会花大部分时间在基本概念、程序结构、数组上,而数据结构的学习必须以函数、指针、结构体为基础,这样导致学生在数据结构的学习上不能得心应手。
其次,两门课程分上下学期分开学习,导致教师在讲解数据结构时还要花时间复习C语言的内容,这样就使得数据结构课程的学时不够用。
最后,数据结构部分内容对于高职高专学生来说,学习难度大、实际应用不上。
基于以上原因,我院教师觉得两门课程的改革势在必行,于是,为了有更好的教学效果,缩短学时,提出将两门课程合并。同时这两门课程的教学内容相互关联也使这两门课程的整合具有了可能性和必要性。
2、课程整合设计的理念和思路
我们根据市场对高职人才的需求,着重培养学生的实际动手能力,把高职学生的培养模式与课程紧密结合起来。在整合过程中,合理地分配学时,注重内容的新颖和信息量,重新构建课程知识体系,重新制定课程标准,重新设计教学内容,编写适合本校学习学生的教材、实验指导书、课件。同时我们秉承“以知识学习为基础,以素质培养为目标,以能力训练为本位”课程建设理念,设定了课程改革的大致方向。具体表现在以下三个方面:
(1)将知识融入到任务中。知识是学生可持续发展的坚实基础,是学生能力提升的坚强后盾。学习知识的最有效途径是应用知识,做到“学以致用、用学结合、边学边用”。我们围绕知识教学为中心,选择富有特色的教学实例,通过任务驱动、案例促进知识学习。
(2)将素质的培养贯穿到整个教学过程中。在课程建设和教学过程中,强调学生形成良好的编程风格,具有良好的职业道德、严谨的思维能力;通过课堂实例的讨论,使学生具备良好的团队合作能力、较强的表达能力和良好的心理素质,激发学生的创新能力;通过作业和思考题的布置,培养学生自学和自我增值的能力。
(3)基于能力训练的项目设计。针对完成项目的过程,将程序设计能力分解为编写流程图能力、阅读程序的能力、按流程图写程序能力、调试程序的能力。我们在教学项目实践中设置了多个能力点,在项目设计时,要求每个项目实现过程的完整性,尽量覆盖每个能力点的训练。
3、课程整合措施
3.1 教学内容的整合
整个课程的教学内容以C程序设计内容为主线,将数据结构的内容渗透、溶入C程序的教学内容中,对于数据结构的内容以“必需、够用”为度。具体的教学内容包含:
(1)C语言和数据结构的基础知识:C程序编辑与运行环境、算法、流程图、数据类型、常量、变量、表达式与运算符,数据结构的基本概念和术语。
(2)顺序程序设计:格式、字符输入输出函数,顺序程序设计的应用。
(3)选择结构程序设计:关系与逻辑运算符、If、Switch语句。
(4)循环结构程序设计:while、do-while、for、break与continue语句的格式及其应用。
(5)函数:函数的定义与调用、函数的嵌套与递归调用,变量的作用域与存储类型,编译预处理。
(6)数组和结构体:数组和结构体的定义及应用;线性表的顺序存储结构,顺序线性表的创建和输出;顺序线性表中的排序、查找算法。
(7)指针和链表:指针的定义及其在程序中的应用,指针变量作为函数参数的使用方法;链表的表示和实现。
(8)栈、队列和树:栈、队列、树及二叉树的定义及存储结构、应用。
(9)图:图的基本概念、图的存储结构、图的遍历 、最小生成树、最短路径与最短距离、拓朴排序。
3.2 实验设计思想
C程序设计和数据结构都是实践性很强的课程,因此在理论教学的同时,还要合理安排上机实践。两门课程整合后,根据以往实验教学的经验,重新安排各种实验,以巩固、加深教学内容。实验形式较以往的单一形式不同,为验证型、纠错型、引导型、设计型,实验内容做到循序渐进、由浅入深,有利于学生阅读、调试、设计程序能力的提高。例如:在学习顺序结构设计时,教师安排一个设计型实验,由键盘任意输入一个四位的正整数,编程求各位数字之和。学习选择结构设计时,将实验改为由键盘任意输入一个四位的正整数,编程判断并输入它的位数以及各位数字之和,要求学生用“选择结构”编制程序。学完循环结构程序设计后,将其改为引导型题目,要求学生用“循环结构”实现。
顺序结构程序如下: 选择结构程序如下:
#include #include
void main( ) void main( )
{ {int x,a,b,c,d,sum;
int x,a,b,c,d,sum; printf(“请输入一个四位的正整数:“);
printf(“请输入一个四位的正整数:“); scanf(“%d”,&x);
scanf(“%d”,&x); if(x>=1000&&x
a=x/1000; {a=x/1000;
b=x%1000/100; b=x%1000/100;
c=x%100/10; c=x%100/10;
d=x%10; d=x%10;
sum=a+b+c++d; sum=a+b+c++d;
printf(“\n各位数字之和=%d\n”,sum);} printf(“\n各位数字之和=%d\n”,sum);}
else
printf(“\n输入的数字有误!\n”);}
通过完成不同类型的实验,有目的的、分层次地培养学生的实践能力,使学生学会从实验过程中获得启发,获取知识、积累经验。
在课程学习结束后,进行2周的课程设计。课程设计是由指导教师根据本门课程的教学目标和能力训练的要求选择设计一个项目,该项目的内容不仅涵盖了C程序设计与数据结构课程理论教学的主要知识点,同时能够提高学生应用C语言与数据结构的知识解决实际问题的能力。
3.3 教学方法探讨和手段设计
首先,不管学习什么样的课程,兴趣是最好的老师。在过去的教学过程中,发现大部分学生抱怨程序设计太难、不好学、难读、编程无从下手等问题。因此,针对学生的这种情况,调动学生学习的兴趣和积极性显得尤为重要。经常用学生生活中的小实例来结合课程的教学,让学生明白C语言和数据结构离我们很近,而且很有用。再者,采用“启发、引导”教学方法。在授课过程中,引导学生提出问题、分析问题、划分程序模块、算法设计,最终编写出程序。这种教学方法能够很好的吸引学生的注意力,调动学生的学习主动性。最后,有效利用现代化教学手段辅助教学:一是精心制作课件,制作Flas,使用多媒体进行教学。二是有效的利用实训室和教学软件进行一体化教学,边讲边做,增加互动教学过程,提高学生的动手能力。三是借助职教新干线、BBS等网络平台进行网络互动交流。
4、结语
整合之后的课程以C程序设计内容为主线,将数据结构的内容溶入其中,根据需要对课程内容进行相应的调整。整合后的课程更注重学生阅读程序、调试程序、编写程序能力的培养。当然,肯定还是存在一些问题,需要在今后的教学实践中不断地修正和完善。
参考文献
[1]谢莉莉,李勤,傅春等.“C语言与数据结构”课程的教学改革实践[J].北京:计算机教育,2009(7).
摘要:针对计算机类本科专业数据结构课程与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
1 引言(Introduction)
随着便携式移动终端的发展,“碎片化”时间的利用率越来越高,人们进入了“微时代”。“微课程”成了时代的产物。所谓“微课”是指按照新课程标准及教学实践要求,以教学视频为主要载体,反映教师在课堂教学过程中针对某个知识点或教学环节而开展教与学活动的各种教学资源的有机组合[1]。现如今各高校大力推动微课程,组织各种微课程比赛,调动教师的积极性,“微课”对于教师来说已不是一个陌生的名词。然而,目前的微课程只是针对一门课程当中的一个组成部分,仅是单独讲解某个知识点,没有形成一门完整的课,还没有完全发挥微课程的优势,并没有应用于真正的教学当中。
《数据结构》课程是计算机课程体系中的专业基础课程[2],作为程序设计的基础,数据结构课程不仅成为高校硕士研究生入取的必考科目,还是各企业招聘员工入职笔试中青睐的学科。如何让学生在课堂教学中对课程有更深刻的理解,并在复习考研和准备找工作中进行更好的自主学习,成为数据结构课程教学的研究重点,本文在分析数据结构教学现状的基础上通过对数据结构知识点的分析,构建合理的数据结构微课程框架,并将其应用于教学中,使得学生能更好的应用“微课程”进行学习。
2 数据结构课程的现状分析(Current situation
analysis of data structure)
数据结构课程是一门比较抽象的课程,而且学生本身知识储备不足[2],所以仅靠课堂上的讲解,不能使学生达到很好的消化吸收的效果。目前,很多高校也开发了网络教学平台,积极倡导教师和学生通过网络平台实现在线探讨交流,通过对网络教学平台的建设,如将大纲日历、教案、教学课件,教学视频上传到教学平台,使学生增加课下自主学习的意识,同时,老师在上课的时候也会给学生提供一些教学视频的网站,如清华教育在线等,然而,虽然教学平台的建设很完整,教师提供的教学视频也很不错,学生却很少好好利用网络教学平台或教师提供的网络视频进行自主学习。主要原因有三点:
(1)教师的课堂教学主要以集中讲授为主,并没有引导学生利用网络教学平台的资源进行自主学习,学生把网络教学平台当成了一个简单的提交作业、下载课件的平台。
(2)教学平台的内容过于繁多,视频基本上为课堂讲授的视频,即使有学生想课下自主学习,在看到45分钟甚至90分钟的教学视频也会打退堂鼓。
(3)教师提供的教学视频,如清华教育在线虽是名校老师讲解,但对于一般高校的学生来说讲解内容过深,没有针对性,很多学生觉得听不懂,打消了自主学习的积极性。
通过“微课程”的概念,专家学者认为“微课程”就是针对一个具体的知识点在短时间内(一般为10分钟左右)做简单明确的讲解,这种讲解不是泛泛的介绍,而是通过精心的设计,最终完成容量小,内容精的视频制作[3]。可以说,“微课程”的出现为我们解决数据结构自主学习难的状况提供了很好的解决方案。如何做到容量小,内容精成了“微课程”视频制作的关键,也是本文的研究重点。
3 基于微课程的数据结构模块化设计与实现
(Modular design and implementation of data
structure based on micro-lecture)
本文依据清华大学出版社出版的严蔚编的数据结构教材[4]进行知识点的划分,构建知识点的模块化,并将其应用在教学中。
3.1 数据结构相关知识点的分析与研究
数据结构课程研究的是数据和数据之间的关系,其基本分为四大类:集合、线性结构、树形结构和图形结构。在数据结构课程中,主要讲解的是后三种结构的逻辑结构、物理结构,以及相关算法的实现。在课程的最后讲解了利用已学过的数据结构解决基本的查找和排序的问题。
上述这些知识点中都具有一定的顺序性、关联性,但又相互独立。如果只是把课程讲解的内容分解成10分钟之内的小视频,除了时间上看着短了以外,没有改变课堂讲解的实质,没有做到真正意义上的微课程。在多年教学经验的指导下,本文要研究的是什么样的知识点适合做成微课程,让学生课下自主学习,课上共同讨论,培养学生自主学习的能力,并且在考试复习时通过温习微课程的视频可以更快的掌握主要题型的解决方法,节约复习时间。
微课程知识点的设定原则为5―20分钟可以被清晰地讲解,且尽量不涉及程序性的内容。栈和队列可以说是操作受限的线性表,其抽象数据类型和现实生活中的很多例子都有相似性,可以将其作为微课程的一个知识点,让学生自主学习。在树形结构中,如何在连续的存储空间中把非线性的东西表示出来可以在短时间内很经典的讲解出来,其链表的表示所以也非常适合做成微课程。二叉树的结构和树非常像,对二叉树的遍历,以及树和森林的转化都是比较独立的知识点,其方法不涉及难理解的程序,将这些放入微课程中。赫夫曼树是二叉树的重要应用,其构造方法可以放入微课程的知识点框架中。在图形结构中图的邻接矩阵表示法和邻接表表示法都可以作为微课程的一部分,深度优先遍历和广度优先遍历的算法虽然不易理解,但其求解方法的思想却可以通过微课程表达出来。最小生成树,关键路径,单源最短路径都是图里的应用,仅把问题的解决方法放入微课程中是比较好的选择。在查找中的折半查找和二叉排序树的构造都是独立的知识点,可以很好的用于微课程的制作。在排序中,会选择相对复杂一些的快速排序和堆排序,仅仅介绍排序的思想。微课程的知识点设定如图1所示。
3.2 翻转课堂辅助数据结构微课程的实现
学生在刚接触数据结构时会觉得特别的抽象,其基本概念和相关的术语并不适合让学生自主学习,线性表是学生接触的第一种线性结构,其逻辑结构,顺序存储和链式存储,以及插入删除等操作都非常的重要,但多数都是枯燥的程序,想让学生在短时间内掌握其精髓并不是一件容易的事,如果这个部分让学生自主学习很可能会打消学生的积极性,所以前几节课程并不适合做翻转课程。在学生已经对线性表有所掌握的情况下,可以将栈和队列的逻辑结构微课程要求学生自己学习,在课堂上进行讨论,在讨论的基础上讲解实现通过自主学习了解的各种操作的程序。树形结构是学生接触的第一种非线性结构,所以其逻辑结构需要在课堂上进行讲解,虽然树形结构的存储结构已经安排在微课程中,但由于是学生第一次接触,所以本微课程部分并不作为翻转课堂的一部分,学生在复习时可以通过微课程进行复习,以更好的掌握知识点。而二叉树的相关微课程可以要求学生自行学习,在课堂上根据学生学习的结果共同研究算法的实现。图形结构和树形结构都属于非线性结构,所以二者具有很多相似的地方,可以由学生自主学习课堂讨论,通过讨论的情况分析学生的掌握情况,因为微课程的内容简单,重要的算法实现还需要在课堂上详细讲解。经过前面的学习,插入和排序的内容无论是应用方面还是程序实现方面都由学生自主完成,通过讨论和测试考察学生的掌握情况。
经过和微课程相结合的翻转课程的设计,使学生习惯通过微课程进行学习,掌握自主学习的能力。
4 结论(Conclusion)
微课程的系统框架对微课程的制作起到了指挥棒的作用,在总体框架下进行各个微课程的制作,在制作过程中绝不仅仅是录制简单的视频,虽然仅仅是10分钟左右,但工作量绝不亚于一节课的准备,不仅要对微课程设计方案,制作电子课件,还要精心准备习题,并配合易理解的答案。只有一个完整系统的微课程,再加上与课堂的相辅相成,才能使得学生在课下自主学习时更有针对性,学生学的更明白,课上讨论也会更丰富,形成良性循环,真正实现了教师学生共同授课,共同讨论的多样化教学体系。
参考文献(References)
[1] 梁乐明,曹俏俏,张宝辉.微课程设计模式研究――基于国内
外微课程的对比分析[J].开放教育研究,2013,19(1):65-73.
[2] 董丽薇.“数据结构”课程教学方法的改进[J].沈阳师范大学
学报:自然科学版,2012,30(2):307-309.
[3] 刘名卓,祝智庭.微课程的设计分析与模型构建[J].中国电化
教育,2013,(12):127-131.
[4] 严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版
社,2012.
作者简介:
引言
面向21世纪教学内容和课程改革计划的目的之一,就是培养学生勤动脑、善思考的素质及综合运用知识、创新知识、解决问题的能力。实践教学是培养新型人才重要的基本环节,在学生能力培养和综合素质提高方面有其独特的作用。通过分析现行的数据结构实验教学模式,我们发现在现行模式下,教师只是灌输式地教,学生被动式地学,实验以验证性实验为主,不利于学生的独立思维能力和创新能力的培养。
结合教育部的“面向21世纪教学内容和改革计划,保留少量必开的经典验证型实验,增开综合型、设计型实验”的精神和我院2008培养方案的要求,我们在数据结构实践环节中保留了必要的经典的验证型实验内容,增加了设计型实验,加强了综合型实验,并新开设了探索创新型实验。
实践证明,实验是培养学生创新能力和优良素质的有力手段。随着计算机科学技术的迅速发展,为了提高数据结构实验和计算机专业学生的质量,充分发挥数据结构实验教学丰富的素质教育功能,数据结构实验教学的课程设置和教学内容急需更新。为此,我们在数据结构实验教学中创新性地增加了探索创新型的实验项目,使实验项目由原来的三个层次增加到四个层次。但如何设计出一些新的综合型实验和探索创新性实验以满足培养21世纪人才的需要,尚需不断地探索。
1 设立综合型和探索创新型实验的原则和思路
1.1 综合实验和探索创新型实验要体现专业方向性
数据结构是计算机各专业方向的专业基础课程,对于这样的课程来说,找不到“一药治百病”的实验题目,而是要根据专业方向特点来设计符合相应专业培养目标的综合和探索创新型实验,例如我校的计算机专业方向是计算机网络工程和软件工程,相应地我们在设计综合型和探索创新型的实验时既要考虑到数据结构的专业基础性又要结合软件和网络相关的内容。
1.2 综合实验和探索创新型实验要具有创新性
实施创新教育,培养创新人才,已成为国内外教育改革的一大潮流。创新能力是以创新思维能力为核心的、创造新颖而有价值的成果的能力。因此,我们要以培养创新思维能力为核心,对学生进行创新能力教育。创新思维是科学认识和技术进步中一种高级的综合性的思维方法,是人类创新活动的灵魂和核心。它包括一般的思维形式,又包括特殊的思维形式,还包括想象这样的心理活动。根据专家研究,创新思维活动一般经过四个阶段来解决问题:准备期、酝酿期、明朗期和验证期。在实验教学中,能够更有效、最直观、最快速地经历创新思维这四个阶段的是创新实验。要培养富有创新力的学生,就必须有创新性的教师。教师创新能力的高低,对学生创新能力的培养至关重要。为迅速培养学生的创新思维能力,教师必须建立创新实验的意识,也必须有创新实验的综合知识和能力。
创新实验的选择应遵从的原则是:①课题新颖,能反映计算机学科的发展及现实生活的要求,使学生有新鲜感;②内容全面,并便于设计;③难易适当,学生在老师的指导下结合文献的查阅就可以实现;④能起到扩充知识,锻炼操作技能,培养分析问题、解决问题能力的作用。
1.3 教学、科研和科技开发三结合是设立数据结构综合实验和探索创新型实验的途径
从培养学生的能力特别是创新能力这一根本宗旨出发,数据结构综合实验和探索创新型实验绝不是教学的单一过程,而应当成为同时具有实验教学、科学研究与科技开发三项职能的活动途径,由此培养学生的实践、创新等各种能力。
(1)实验教学
必须克服过去实验教学依附于某门课程并且主要是验证性实验的弊端,打破课程界限,将原来的实验教学内容逐步整合成综合型实验并力求成为设计型、探索创新型实验。应该让学生从基本概念和原理出发,通过对设计的简单算法分析,再进入到更高一级的算法设计,从而锻炼分析问题、解决问题的能力,进而锻炼创新能力。
(2)科学研究
计算机专业学生进入数据结构实验环节时还处于低年级,专业知识还不够全面,在实践过程中,我们可以适当加进教师的部分科研成果,对学生进行初步的科研锻炼;同时也可以解决教师科研中人手不足的问题,提高设备的利用率。这是一举多得的好事。
(3)科技开发
数据结构综合实验和探索创新型实验也可以与科技开发相结合,利用校有设备或与企业合作让学生做些初步研究与开发工作,这对学校和企业都是很有利的。一方面,综合型和探索创新型的实验项目内容可来自科研和科技开发项目,结合实际;另一方面,综合型和探索创新型实验对培养学生的研究兴趣,扩展其视野,使学生了解社会与市场都是很好的切入点。
2 数据结构综合实验和探索创新型实验开设的经验及效果
我们从2005年开始开设综合型实验,并尝试从2009年开设探索创新型实验,经过2006、2008培养方案的制订和修订,又经过2008年教学大纲的完善,形成了反映本专业的特色的综合型实验。综合型实验的开设,取得了较好的效果。
(1)精心编选综合型和探索创新型实验的教学讲义和教材
实验项目的内容设定对提高学生实践能力具有重要作用,也关系着精品课程和品牌特色专业的建设。
结合培养方案设置的专业课、专业方向课及实践环节的课程,开展数据结构实验项目建设,完善与提升实验内容,设计含有较高水平的设计型、综合性和探索创新型实验,对培养学生的探索创新思维和实际研究动手能力具有重要的现实意义。为培养学生的创新能力,对学生能够提供规范而系统的指导,需要对数据结构实验教学进行系统的研究,并编写一本体现我校特色的实验指导教材。
(2)注意多吸纳教师的科研成果用于实验教学
我们在数据结构的综合性和探索创新型的实验中,多数项目都取自教师的科研成果,这些成果在实验课程中加以系统安排,变成了丰富的、理论与实践相结合的综合型和探索创新型的实验内容。教师的科研成果引入实验有很多好处。首先教师对实验内容理解非常透彻,对学生的创新性导向比较清晰;其次,学生对老师的实验成果有崇敬心理,会积极地做好实验,消除了学生应付完成实验任务的现象。
例如,利用顺序存储的线性表、链接存储的线性表、二叉树、多叉树和Tile树以及Hash表等各种不同的数据结构来实现字符串的最长前缀匹配,并分析不同数据结构下的不同算法的时间和空间复杂度的实验,使学生透彻地理解了数据结构预算法的作用以及数据结构设计的重要性。
(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引言
实施网络教育精品课程建设对于促进优质网络教育资源的建设和共享,减少低层次重复开发,促进网络教学改革和创新,提升网络教育的社会地位等都具有十分重要的意义。2007年4月,教育部颁发了《关于2007年度国家精品课程申报工作的通知》(教高厅[2007]25 号),把网络教育精品课程纳入到国家精品课程建设体系。网络教育精品课程是具有一流的教师队伍、一流的教学内容、一流的教学方法、一流的资源和教材、一流的教学管理和支持服务的高水平网络课程。因此,网络精品课程的建设是“高等学校教学质量和教学改革工程”重要内容之一。本文针对网络教育的特殊性,从网络资源建设、师资队伍建设、教学和学习活动设计以及网络服务支持等几方面,介绍了国家级网络教育精品课程“数据结构与算法设计”的建设与实践。
2针对网络教育的特殊性,构建资源丰富的网络教学平台
网络教育是指远程网络教育。这种教育不同于一般的在校面授教育,其教育的对象不像全日制学生那样有大块的学习时间,而是利用零散的、业余的时间学习,而且学生的基础也不一样。他们更多的是为了学习实用的知识帮助他们解决工作中的问题。在学习的过程中还会有工作和学习的矛盾、家庭负担等影响因素。因此,远程教育课程教学设计的总体原则应该是,所教授知识有充分的实用价值和可实践性,适合于在职从业人员业余学习和终身学习,满足远程教育对象最紧迫的工作和应用需要。而在教学内容的选取上,则应采用教学与应用相结合的方式,将课程的基础性的理论与综合应用知识相结合,优化课程知识内容体系,达到应用型人才培养目标。
远程教育师生时空分离导致远程学习中学与教的时空分离,这是远程教育的重要特征之一。因此,要构建资源丰富的网络教学平台,将教学内容与学习资源整合起来,以实现远程教育。
北京理工大学现代远程教育学院成立于2000年,是经教育部2000年批准的15所现代远程教育试点高校之一。在发展和建设中,逐步形成了以人为本的教育理念。在实施远程教育过程中,加强对教学过程管理,并不断完善教育质量管理体系。“数据结构与算法设计”课程作为计算机基础教学基本要求的第三层次课程,2003年开始了网络教学和网络辅助教学。
“数据结构与算法设计”网络教学平台充分利用了多种媒体技术,构建了多种媒体资源优势互补的、支撑网络教学的立体化资源,风格独特,特色鲜明,实现了以“学生为中心,教师为主导”的教育思想。在选取教学内容和学习资源的建设时依据以下四个原则:第一,以学生为中心的原则,按照业余学习特点进行教学设计;第二,围绕网络教育应用型人才培养目标,选择适合远程教育对象学习的教学内容组织教学;第三,紧扣时代和学科最前沿,为学生提供多种形式的学习资源的原则;第四,紧扣网络教育特点和要求,选择适当课程授课方式。在学习资源建设方面,根据学生的学习条件和自身基础的差异性,采用多种媒体(文字、音频、视频、模拟、仿真、动画等)技术的应用呈现课程内容,为学生自主学习提供最大方便。我们编写并开发了该课程的教材、实验指导书、视频、电子教案、流媒体课件、Flas、实验案例、素材库、网络课件等,形成了丰富的立体化的教学资源,并将这些资源放在教学网站上供教师和学生浏览。在媒体设计上一体化,突出各自优势、形成优势互补。除具备课程所需的课件外,还设置了诸如实时交互、网上答疑、远程网站、自学导读、电子阅览等网络教育可以实现的现代教学形式。
课程的教学平台是立体化的,在设计上既体现了基于建构主义理论的教师主导型,引领型的价值理念,又给予学生自主选择、自主讨论、自我测试的平台空间,实现了教师主导引领和学生自主选择的统一。通过导学,学生可以快速掌握网络学习的方法,利用教学平台进行师生交互。同时,我们还创建了一个完整的教学支持服务体系,可以合理、有效地组织每个教学环节,注重教学过程和教学质量的跟踪管理,以确保应有的教学成效,培养了学生网络环境下的自主学习能力与实践能力,达到培养优秀应用型人才的目标。
3针对网络教育的特点,建设师资队伍
在网络教育中,师生分离的特征决定了师生之间的交流不方便、不及时,教师从学生身上获得的信息很少,相反也是如此。这就从客观上决定了网络教学中的师生需要建立更多同步或异步的交流途径,以弥补师生交互的缺失,而教师则需要投入大量的时间和精力与学生进行交流,如解答学生疑问,指导学习过程,组织网上教学活动等。
在现代远程教育中,教师通常由学校教师兼任,教师的学校教学和网络教学之间经常发生矛盾。为了解决这些问题,我们在师资队伍建设时注意了各种不同类型人员的配备,包括了主讲教师、教学辅导教师、班主任以及网络维护技术人员。其中,主讲教师主要负责课程的学术质量,包括:制定课程目标,设计教学大纲,组织教学内容,完成教学设计,录制课程讲解,设计考试试题等;辅导教师主要负责教学过程的指导与支持,包括:课程信息,组织教学活动,指导学习过程,答疑讨论,布置和批阅作业,批阅试卷等;班主任则负责学生的管理工作,随时在网上和学生沟通,一方面增加了学生的归属感,另一方面能及时把握学生各方面的动态,及时解决他们的问题,对促进学生持续、有效的学习,降低辍学率有很大的帮助。网络维护技术人员则全天候为学生提供技术支持服务,维护与建设网络教学资源,确保系统平台正常运行。
经过几年的建设,目前我们已经形成了一支稳定的教师队伍。在完善的网络教学制度管理下,促进了学生个性化的自主学习,规范学生个性化自主学习的行为,引导学生按照开放教育的要求学习,并保证学生个性化自主学习的质量。
4网络资源建设中的教学设计与学习活动设计
在网络教育中,网络教学资源是学生进行自主学习、获得知识和技能的基本途径。远程学习者与本科生在自身特征上存在很大不同,需要建立导学策略和组织学习活动,引导和督促其完成学业。通过网络教学资源,应该能为学生系统化呈现教学内容,促进学生对课程的理解,引导学生进行学习。因此,我们在课程的网络教学资源建设时,精心进行了教学设计,主要包括以下几个方面:
(1) 学习内容设计:选择适应应用型人才培养的课程内容;打破课程内容的线性章节结构,设计出适合学生自主学习的内容组织结构。
(2) 教学策略设计:设计教学内容的呈现方式和使用方式,如文字呈现、教师讲解、动画演示、效果对比、模拟操作等。
(3) 动机策略设计:设计富有激励性的学习环境,激发和维持学生的学习动机,如技术的新颖性、界面的艺术性、反馈语的归因导向、学习伙伴的伴学等。
(4) 学习指导设计:设计学习指导的内容和呈现策略,包括学习的重点、难点、学习方法的建议等。
(5) 学习评价设计:设计学生自我评价的内容和评价策略,如自测练习、模拟考试、学习游戏等。
(6) 学习资源设计:设计并提供与教学内容紧密相关的扩展学习资源。
同时为满足学习者的需要,学习活动则设计了以下一些模块:
(1)“课程概况”,包括“课程介绍”、“课程大纲”、“考试大纲”和“参考资源”等模块,为学生提供学习的准备性材料。
(2)“自学周历”模块为学生的学习时间和活动安排提供指导。
(3)“教学互动”中“主讲教师”、“课程论坛”、“小组论坛”、“语音答疑”、“留言信息”、“问题解答”等模块是学生与老师和同学进行交流讨论学习的平台。
(4)“教学互动”中“学习进度”、“在线作业”等模块,帮助学员把握自己的学习进度以完成学习任务。
(5) 每一章的学习中,给学生提供了“学前指导”、“内容讲解”、“总结评价”和“扩展学习”模块。“学前指导”为学生学习章的内容提供准备性的材料,使学生明确学习的目标、方法、重点难点等;“内容讲解”是学生学习的主要内容,由老师进行讲授;“总结评价”让学生及时地评价自己对内容的学习情况及效果;“扩展学习”为学生提供更多的学习资料,满足学生的个性化学习需求。
(6)“原理动画”模块将课程中比较难以掌握的学习知识点内容,以动画和具体操作的方式呈现,帮助学生更好地理解学习内容。
(7)“概念速查”为学生学习提供一些辅的工具。
(8)“参考资源”模块给学生以广博的辅助材料,拓展学生的理论视野,增强学生的学习兴趣和知识面。
上述的教学设计和学习活动设计,在课程的远程教学方面起到了重要的作用。
5网络支持服务
远程教育不仅要为学生提供教学内容和资源、组织学习活动,还要提供强大的学习支持服务。这不仅包括提供关于课程内容答疑、资源、实践等与学习有关的服务,而且包括提供与教学管理及其他相关的支持服务。
为了网络教育的顺利开展,在本课程在网络资源建设中,提供了包括授课、课程发送、学习辅导、学习资料提供、作业批改和意见反馈、考试实施和成绩管理,技术培训等支持服务内容。
授课过程中,注重培养学生的自主学习、协作学习和探究性学习的能力,包括对资料的收集、整理、分析、判断、评价、综合等能力。
通过在线课程基本信息和课程导学完成了“学习目标、学习要求、学习内容、学习模式、学习方法、考核方式、评价标准、评价内容”等课程发送功能。
在学习过程中提供“语音答疑”,使学生能跟老师实时地交流学习中问题;在“主讲教师”、“小组论坛”、“班级论坛”等教学互动的模块中,可以通过发帖提问、跟帖学习的方式,让师生共同参与,讨论学习中出现的问题,引导学生积极思考,逐步提高;另外,学生还可以通过“友情链接”进入到与课程相关的资源网站。
完成课程学习后通过“总结评价”、“自测习题”、“模拟试题”等模块,帮助学生总结所学的知识,并对学习效果进行评价;通过“扩展学习”、“参考资源”等模块,帮助学生拓宽学科的视野,把握学科前景。
提供的学习资源具体包括:静态资源和动态资源。教学视频、教学讲义、教学实验录像、参考书目、历年考卷、在线习题、案例讨论、在线答疑、网络课堂、课程论坛、优秀作业等等。
考试实施和成绩管理,具体包括“编制考卷、施测、评阅考卷、成绩查询”,考卷的编制,由教学办公室组织,任课教师具体完成。考试工作的开展,由学院统一组织,各教学点配合,统一按北京理工大学考试管理制度进行实施。教师阅卷后,在线登录成绩,学生可在线查询成绩。
专职技术人员全天候为学生提供技术支持服务。北京理工大学现代远程教育学院还设立了技术支持免费网络电话,用来提供关于网络学习、操作指南、常见问题的支持。
另外,北京理工大学远程教育学院坚持定期开展教学效果评价和实时跟踪评价。建立了包括教学内容、教学手段、教学过程、媒体应用、考试管理等方面的多种评价措施,对教学效果进行全面评估。
对学习过程的监控,则利用教学管理平台,统计学生网上资源使用情况和教师对学生开展支持学习服务的情况。
经过几年的建设,本课程的学习支持服务系统全部实现了网络化,极大提高了服务的效率和水平。
6结论
“数据结构与算法设计”网络教育精品课程的建设,主要是针对远程教育的特性进行的。通过对“一流的教师队伍、一流的教学内容、一流的教学方法、一流的资源和教材、一流的教学管理和支持服务”的建设,体现了一流网络教学的特点,体现应用型人才培养目标,符合科学性、先进性及网络教育规律和教学改革的方向,适合于在职从业人员和业余学习和终身学习。通过现代教育技术、方法和手段的运用,到位的学习支持服务,发挥着示范、辐射和共享的作用。“数据结构与算法设计”2008年被评为国家级网络教育精品课程。该课程所建设的网络教学资源始终开放,这些资源已经与北京理工大学该门课程的本科教学共享。课程资源网址为/2008/ public/。课程资源今后将会不断地更新维护,以保障该课程的可持续建设与发展。
参考文献:
[1] 教育部办公厅. 关于2007年度国家精品课程申报工作的通知(高教厅函[2007]25 号)[EB/OL]. jpkcnet. com/new/ zhengce/default.asp.
关键词 :Android 数据结构 课程算法 动画演示
数据结构课程,传统的教学方法缺少直观性和动态性,很难形象地使学生理解相关知识点。基于此,出现了一些数据结构算法的动画演示系统,其输入一些初始数据即能以动画的形式演示算法的整个执行过程,提高了学生的学习效率。但是这些系统都是基于PC机设计实现的,学生学习场地受到了限制。如果将该系统在智能手机或平板电脑上实现,将极大地提高该系统的方便性。为此,我们设计并实现了基于Android平台的数据结构课程教辅演示系统。
一、系统功能设计
该系统是一个基于Android的动态演示数据结构算法执行过程的辅助学习软件,它可根据学习者输入的算法初始数据以及算法执行过程中控制方式的不同在Android终端设备具有不同的显示效果,包括算法执行过程中数据逻辑结构或存储结构的变化情况以及递归算法执行过程中栈的变化情况等。整个系统使用触摸按钮驱动方式,设计多个按钮选项。每个按钮选项对应一个动作,系统将一直处于选择按钮项或执行动作状态,直到选择了退出动作为止。整个系统的功能设计如下。
一是动态演示数据结构典型算法的执行过程,包括顺序表、链表、二叉树、图以及排序等。二是算法执行过程中跟踪变量的值。三是算法执行过程中动态显示相应的C语言代码。四是具有暂停、恢复运行、单步运行、复位等控制功能。
二、系统主界面设计
数据结构算法演示系统主界面设计启动各个算法的按钮,通过这些按钮启动每个算法演示界面。算法演示的图形用户界面采用的模板有几个主要区域,每个区域对应一个组件。
一是主窗口:包括标题栏和工具栏,用来实现系统控制。
二是动画演示区:以图形和动画的方式模拟和显示算法执行的过程和结果。
三是源代码区:用来显示类C语言编写的算法描述。为了更清楚地描绘算法的执行过程,当程序运行到当前行时,用一条高亮度光带罩住此语句,表示该语句被执行。在系统的主界面中,利用GridView布局,显示功能选项,并在布局下方添加“帮助”和“退出”按钮。主界面的设计风格简约大方,操作方便。系统主界面及帮助界面如图1所示。
三、系统功能实现
以顺序表为例阐述系统功能的实现。在顺序表模块中,二级菜单中提供了顺序表的插入和删除选项。选择顺序表的插入或者删除后进入初始化界面,设置顺序表中的元素、插入变量以及插入位置,确认后将进入算法演示的主窗口。主窗口的工具栏包括执行、暂停、单步和重置。动画演示区的图形模拟是在原有的布局中通过添加TextView控件,生成新的布局进行算法的动画演示。源代码区是定义代码字符的数组,利用初始化函数接收数组中的元素,并根据数组长度添加TextView控件的个数,循环将TextView中的内容添加为代码字符数组中的元素。这样,实现的顺序表模块的界面如图2所示。
图3所示活动图,描述了顺序表模块的执行过程。
CDIO是Conceiving,designing,implementingandoperating的缩写,即“构思、设计、实现、运作”。2014-2015年度第一学期,我们对辽宁工业大学(以下简称我校)电信学院数据结构课程,以CDIO模式进行了数据结构课程设计教学模式的探索。数据结构课程是一门实践性很强的专业核心课程,将CDIO教学模式在数据结构课程设计运用,就是培养学生创新能力、分析设计能力和团队合作能力的重要途径。培养学生充分考虑数据结构特性、响应速度、处理时间、存储空间和单位时间的处理量技术参数,鼓励学生自己去尝试各种设计方案,找出最有效的解决办法,着重培养学生专业能力、分析设计能力和合作能力。
一、传统实践教学存在的问题
实施教学改革前,传统的数据结构的课程设计是一般性设计。课设布置题目是针对教学内容的小型练习题,让学生独立完成程序设计与实现。从学生的认知规律以及学生不同个体差异来看,把一些难懂的、晦涩的、抽象的东西原封不动地给出并采取传统的教学模式进行教与学有几点弊端:第一,学生在毫无知识背景的前提下,要完全理解这些抽象概念及抽象数据类型比较困难。第二,课设涉及到的知识点内容单一,不需要学生考虑创新思维方面的设计方案。只要将课堂讲过的内容直接拿来用就可以,对于课设中各种技术参数的要求可以说没有理解,导致设计解决方案不是最合适的。课程设计没有达到预期收获。第三,学生缺乏团队合作过程,自己完成一个小型题目,在设计方案和算法设计过程中锻炼的层次和涉及面都比较窄。没有体现数据结构在处理大规模复杂问题时才能体现出的优势,使学生没有真正认识数据结构存在的意义。对以后学生参加实践类课程活动有很大影响。
二、课程设计的改革措施
《数据结构》课程设计采用了CDIO教学模式,强调知识的综合运用,锻炼学生对复杂问题进行分析与求解的能力,在项目实施过程中始终围绕“构思、设计、实现、运作”。它的指导思想是:以工程设计任务为导向,以培养学生创新能力、团队合作能力为主要目标。通过利用综合性课程设计,培养学生进行复杂程序设计这个主线,将学生在课堂上所学的比较抽象的理论知识具体化,提高了理论和实践相结合的能力。具体做法如下:
(一)课程设计内容改革
第一,从课程设计选题上精心准备:需要介绍题目内容,介绍算法产生的背景。明确数据内在的必然联系,分析数据的逻辑结构;确定解决问题所需要用到的算法及设计参数的要求,设计数据的存储结构;解决该课设到底应该怎么做的问题。题目规模适宜,课程设计题目覆盖的知识点应尽可能避免单一,设计内容要新,具有综合性。第二,扩大知识面:要求学生从需求分析开始,通过查找大量的资料,充分理解设计技术参数的要求及实现方式,根据设计要求对空间复杂度、处理时间、时间复杂度和单位时间的处理量等技术参数,分析数据进行哪些操作,建立数据的存储结构。第三,数据结构课程特点逻辑结构强,概念抽象,学生对于知识点的综合运用能力差。在课设中明确知识点的前后序关系和知识点的归属,解决学生只见树木不见森林的盲目性和随机性。
(二)课程设计实施方法
我们对辽宁工业大学电子与信息学院数据结构课程,以CDIO模式进行了数据结构课程设计教学模式的探索,并且实施如下改革:第一,采用启发式的设计思路,引导学生围绕课程设计目标,通过查找与分析有关参考资料,培养和鼓励学生的学习兴趣,同时提高学生查阅资料的能力。第二,让学生能够按照软件工程的思想进行软件的分析、设计与实现,提高学生实践动手能力和协作开发大型软件项目的能力。第三,在项目实施中,进行探究式的学习,不应该只是“手把手”地教,要给学生留出发挥想象力和创造力的空间,激发学生创造的意识和能力。第四,努力使学生对规范性的软件开发不仅仅是以实现相应的程序为目标,更重要的是培养学生今后从事软件开发所需要的各种能力与素质,包括测试能力和文档写作的能力。因此,在课程设计实施中,我们考察学生程序编写、测试以及实验报告撰写工作。
三、实践情况及效果
CDIO模式在国际高等教育中已有共识,通过实践,根据软件工程专业本科教学的培养目标,解决了传统教学方式存在的问题,提高了实践能力,体会到数据结构课程设计实践教学采用CDIO模式,突出了学生在理论教学与实践教学过程中的主体地位,提高了教学的针对性和实效性。将CDIO教学模式引入到数据结构课程设计教学中,改变了该课程的教学理念,重理论,轻实践;重课堂,轻课外。改变了教师单向的知识传授与学生被动接受之间的教与学模式,实践情况及效果表现在:(1)学生学习方式发生了转变,从被动接受知识,到主动查阅资料,对于题目要求的设计技术参数有了进一步理解,使学生学会分析和研究计算机处理的数据结构的特点,分析数据的逻辑结构及设计存储结构,设计算法的基本思想,提高了理论和实践相结合的能力。对知识有比较全面深刻了解,实际解决问题的能力有了明显的提升。(2)采用CDIO教学模式,对于课程设计题目精心安排,给学生留出发挥想象力和创造力的空间,提高了学生运用知识分析问题和解决问题的能力。培养学生的创新能力和创造性思维。(3)实践中,培养学生充分考虑数据结构特性、响应速度、处理时间、存储空间和单位时间的处理量技术参数,鼓励学生自己去尝试各种设计方案,找出最有效的解决办法。着重培养学生专业能力、分析设计能力和合作能力。
参考文献:
[1]张洪奎,等.国家级实验教学示范中心建设的探索与实践[J].高等理科教育,2009,83(1):22-26.
[2]方恺晴,等.信息技术实验室教学示范中心的建设与改革[J].实验室研究与探索,2009,28(4):93-95,100.