緒論:寫作既是個人情感的抒發,也是對學術真理的探索,歡迎閱讀由發表云整理的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.