肖正興 徐人鳳 趙志亮
摘要:“數(shù)據(jù)結(jié)構(gòu)”是軟件專業(yè)課程中難教、難學(xué)的一門課程,本文針對(duì)高職學(xué)生特點(diǎn),設(shè)計(jì)實(shí)現(xiàn)了用于輔助教學(xué)的虛擬課堂,重點(diǎn)探討了Authorware動(dòng)畫的實(shí)現(xiàn)、Agent的加入和Java中的多線程技術(shù)。
關(guān)鍵詞:數(shù)據(jù)結(jié)構(gòu);虛擬課堂;Agent;多線程
中圖分類號(hào):G642文獻(xiàn)標(biāo)識(shí)碼:B
1引言
“數(shù)據(jù)結(jié)構(gòu)”課程是計(jì)算機(jī)學(xué)科非常重要的專業(yè)理論課程。這在ACM多次提出的計(jì)算機(jī)課程建議報(bào)告書中得到了充分體現(xiàn)。通過(guò)本課程的學(xué)習(xí),使學(xué)生掌握如何把現(xiàn)實(shí)世界的客觀問(wèn)題變換為在計(jì)算機(jī)內(nèi)的表示形式;學(xué)會(huì)組織數(shù)據(jù)、選擇算法、養(yǎng)成良好的程序設(shè)計(jì)風(fēng)格;提高邏輯思維和抽象思維的能力,為以后有關(guān)的計(jì)算機(jī)課程的學(xué)習(xí)和從事軟件開發(fā)奠定堅(jiān)實(shí)的基礎(chǔ)。
不同層次的院校,根據(jù)要求不同,在“數(shù)據(jù)結(jié)構(gòu)”課程教學(xué)的側(cè)重點(diǎn)上有所分別,針對(duì)高職學(xué)生,主要是培養(yǎng)學(xué)生算法的應(yīng)用能力,所以在教學(xué)內(nèi)容選擇上,應(yīng)以“理論夠用,廣而不深”為原則;教學(xué)方法的選擇上,注重培養(yǎng)學(xué)生對(duì)理論成果的應(yīng)用能力;教學(xué)手段上盡可能生動(dòng)形象,幫助學(xué)生理解掌握概念理論。
為了達(dá)到上述要求,僅僅通過(guò)課堂上的傳統(tǒng)方式講解數(shù)據(jù)結(jié)構(gòu),教學(xué)上存在難度,學(xué)生也容易失去興趣。多媒體課件是計(jì)算機(jī)多媒體技術(shù)在教育領(lǐng)域中應(yīng)用的典型范例,本文針對(duì)高職學(xué)生的特點(diǎn),嘗試使用多媒體技術(shù)構(gòu)建一個(gè)學(xué)生能夠自主學(xué)習(xí)的虛擬課堂,幫助學(xué)習(xí)、理解和鞏固這些算法。
2系統(tǒng)設(shè)計(jì)
2.1虛擬課堂設(shè)計(jì)思想
虛擬課堂主要由自主學(xué)習(xí)環(huán)境和算法交互環(huán)境兩部分組成,其中自主學(xué)習(xí)環(huán)境主要是讓學(xué)生進(jìn)行算法的自學(xué)習(xí),以講解和演示為主;算法交互環(huán)境提供學(xué)生動(dòng)態(tài)產(chǎn)生數(shù)據(jù),學(xué)習(xí)和驗(yàn)證算法,交互性要求高,所以采用Java語(yǔ)言實(shí)現(xiàn)。如圖1所示。
2.1.1自主學(xué)習(xí)環(huán)境
該環(huán)境對(duì)用戶的交互性要求不高,所以針對(duì)這部分內(nèi)容,系統(tǒng)使用Authorware軟件進(jìn)行制作,在算法的教學(xué)過(guò)程中,采用“實(shí)例引入→動(dòng)畫演示→實(shí)戰(zhàn)練兵”的教學(xué)模式,由淺入深,并由特殊到一般的方式輔助學(xué)生學(xué)習(xí)算法本質(zhì),并利用Microsoft Agent技術(shù)構(gòu)建的Merlin老師,在教學(xué)過(guò)程中指導(dǎo)學(xué)生進(jìn)行算法的學(xué)習(xí)。每個(gè)算法的教學(xué)按照上述模式進(jìn)行自主學(xué)習(xí)。如圖2所示。
“實(shí)例引入”模塊主要通過(guò)一個(gè)實(shí)例演示算法的操作過(guò)程;并在演示過(guò)程中,講解算法的主要思想;“算法思想”通過(guò)對(duì)“實(shí)例引入”的學(xué)習(xí),通過(guò)歸納、總結(jié)的方式表達(dá)出該算法的思想;“動(dòng)畫演示”模塊通過(guò)動(dòng)畫技術(shù)和程序可視化相結(jié)合技術(shù),將宏觀的運(yùn)行和微觀的算法執(zhí)行相對(duì)照,理解算法程序的代碼;“實(shí)戰(zhàn)練兵”模塊通過(guò)互動(dòng)的方式測(cè)試前面階段學(xué)習(xí)的基本算法知識(shí);“交互環(huán)境”模塊主要是算法的運(yùn)行的可視化環(huán)境,在該環(huán)境下,學(xué)生能夠利用該工具互動(dòng)加強(qiáng)算法的理解,并能檢測(cè)自己對(duì)算法的掌握程度。
在以上模塊中“課程導(dǎo)入”、“實(shí)例引入”、“算法思想”、“動(dòng)畫演示”、“實(shí)戰(zhàn)練兵”幾個(gè)模塊都是采用遞進(jìn)的方式組織教學(xué)內(nèi)容,以講授為主,主要以聲音、動(dòng)畫等形式展現(xiàn)教學(xué)內(nèi)容,同學(xué)可以按照上面的組織過(guò)程進(jìn)行學(xué)習(xí),也可以自己根據(jù)自己的進(jìn)度,選擇相應(yīng)的模塊進(jìn)行學(xué)習(xí)。
2.1.2算法交互環(huán)境
在該環(huán)境中,采用程序可視化和動(dòng)畫動(dòng)態(tài)演示技術(shù)相結(jié)合的手段來(lái)演示算法的運(yùn)行,對(duì)于算法本質(zhì)的理解有積極作用,輔助教師進(jìn)行課堂的算法教學(xué),并提供測(cè)試環(huán)境,并能根據(jù)測(cè)試的數(shù)據(jù),產(chǎn)生正確演示效果。
(1) 二叉樹前、中、后序遍歷演示界面
在上面環(huán)境中,遍歷演示主要由三塊組成,畫板區(qū)、代碼顯示區(qū)和演示提示區(qū)。其中畫板區(qū)顯示遍歷的動(dòng)態(tài)效果,代碼顯示區(qū)顯示代碼的同步執(zhí)行情況,演示提示區(qū)顯示遍歷過(guò)程中關(guān)鍵性的提示信息。用戶可以隨機(jī)建立一個(gè)二叉樹,并能調(diào)節(jié)演示的速度,如圖3所示。
(2) 二叉樹前、中、后序遍歷演測(cè)試界面
通過(guò)點(diǎn)擊1號(hào)按鈕開始進(jìn)行測(cè)試,點(diǎn)擊初始數(shù)據(jù)按鈕,能夠在手動(dòng)建樹區(qū)域進(jìn)行二叉樹的建立,在答案區(qū)域,選擇前、中或后序遍歷中的一種,然后在編輯框內(nèi)輸入響應(yīng)遍歷的結(jié)果,結(jié)點(diǎn)與結(jié)點(diǎn)間用英文狀態(tài)下的逗號(hào)隔開,單擊檢驗(yàn)數(shù)據(jù)按鈕,檢驗(yàn)輸入的答案是否正確,并給予相應(yīng)的提示,單擊正確數(shù)據(jù)按鈕,程序進(jìn)入演示狀態(tài)。
2.2系統(tǒng)功能和特點(diǎn)
2.2.1交互性強(qiáng)的人機(jī)交互界面
系統(tǒng)的特點(diǎn)是:較強(qiáng)的交互能力、動(dòng)態(tài)的算法演示、形象的圖形設(shè)計(jì)、充分應(yīng)用動(dòng)畫和色彩體現(xiàn)算法的細(xì)節(jié)、運(yùn)用Microsoft Agent充當(dāng)課件的虛擬教師,貫徹教學(xué)策略,增加學(xué)習(xí)的興趣,突出教學(xué)內(nèi)容的重點(diǎn)。
2.2.2程序可視化和動(dòng)畫動(dòng)態(tài)演示技術(shù)相結(jié)合
使教師脫離黑板和粉筆,采用程序可視化和動(dòng)畫動(dòng)態(tài)演示技術(shù)相結(jié)合的手段來(lái)演示算法的執(zhí)行過(guò)程,對(duì)于算法本質(zhì)的理解有積極作用,輔助教師進(jìn)行課堂的算法教學(xué),并能為學(xué)生自主學(xué)習(xí)算法提供良好的支撐環(huán)境,從而實(shí)現(xiàn)用形象的圖形界面為學(xué)生搭起通向掌握抽象思維方法的橋梁。
2.2.3多樣的測(cè)試環(huán)境
按照內(nèi)容,分別提供有“實(shí)戰(zhàn)練兵”模塊,對(duì)數(shù)據(jù)結(jié)構(gòu)中的已知算法進(jìn)行測(cè)試;“交互環(huán)境”中,提供有測(cè)試功能,通過(guò)測(cè)試檢驗(yàn)學(xué)生對(duì)算法思想的理解,并能在測(cè)試的過(guò)程中用利用程序可視化與動(dòng)畫動(dòng)態(tài)演示技術(shù)結(jié)合,顯示當(dāng)前測(cè)試過(guò)程中的執(zhí)行過(guò)程,進(jìn)一步鞏固學(xué)生對(duì)算法的理解。
3系統(tǒng)實(shí)現(xiàn)關(guān)鍵技術(shù)
3.1Authorware中動(dòng)畫的實(shí)現(xiàn)
在Authorware中,組合運(yùn)用【顯示】圖標(biāo)、【等待】圖標(biāo)、【擦除】圖標(biāo)和【判定】圖標(biāo),可以設(shè)計(jì)出多種動(dòng)畫效果。下面以課件“冒泡排序→動(dòng)畫演示”部分為例,簡(jiǎn)單介紹Authorware中的動(dòng)畫設(shè)計(jì)與實(shí)現(xiàn)。圖4、圖5形象地展示了程序執(zhí)行過(guò)程。
動(dòng)畫設(shè)計(jì):屏幕右側(cè)模擬演示程序單步執(zhí)行過(guò)程(圖5),紅色線框表示當(dāng)前正在執(zhí)行的語(yǔ)句。當(dāng)遇到判斷語(yǔ)句時(shí),屏幕右側(cè)出現(xiàn)紅色箭頭提示,指示當(dāng)前正在進(jìn)行比較的數(shù)據(jù);比較結(jié)束,如果需要交換,則使用動(dòng)畫展示兩個(gè)數(shù)的位置發(fā)生交換。動(dòng)畫程序部分流程如圖6所示。
3.2Authorware中Agent的添加
為了提高程序易用性、增強(qiáng)軟件界面效果,使軟件具備人性化的交互功能,該軟件在課件中引入了“微軟助手(Microsoft Agent)”——魔法師默林(Merlin)。Microsoft Agent是一種基于微軟視窗平臺(tái)的可編程的即時(shí)交互性動(dòng)畫角色,在Authorware中添加Agent的過(guò)程如下:
3.2.1檢測(cè)課件目標(biāo)機(jī)器上是否安裝了Agent控件
在流程線上添加【計(jì)算】設(shè)計(jì)圖標(biāo),并在其中輸入如下代碼:
--定義變量IDAgent記錄agent控件的ClassID
IDAgent:="{D45FD31B-5C6E-11D1-9EC1-00C04FD7081F}"
--根據(jù)控件的ClassID檢測(cè)是否已經(jīng)安裝Agent控件,如果未安裝,則運(yùn)行msagent.exe進(jìn)行安裝
if ActiveXControlQuery(IDAgent)=0 then
JumpOutReturn("msagent.exe")
end if
3.2.2導(dǎo)入Agent
在Authorware中執(zhí)行【Insert】→【Control】→ 【ActiveX】菜單命令,在【Select ActiveX Control】窗口中選擇Microsoft Agent Control 2.0 控件,將Agent控件插入到程序流程之中。該控件具有大量的屬性和方法,通常需要使用控件的“CallString”方法才能進(jìn)行訪問(wèn)。
3.2.3Merlin初始化
在流程線上添加【計(jì)算】設(shè)計(jì)圖標(biāo),把它命名為“Merlin初始化”,在代碼窗口中輸入如下代碼:
-- 啟用Agent控件與Microsoft Agent Server的連接
SetSpriteProperty(@"char1", #Connected, 1)
-- 加載角色
agentchar1:="merlin"
agentfile1:=FileLocation^"\chars\merlin.acs"
String:="Characters.Load('"^agentchar1^"','"^agentfile1^"')"
CallSprite(@"char1", #CallString, String)
-- 定位角色
String:="Characters.Character('"^agentchar1^"').MoveTo('"^WindowLeft+60^"','"^WindowTop+80^"')"
CallSprite(@"char1", #CallString, String)
-- 顯示角色
String:="Characters('"^agentchar1^"').Show"
CallSprite(@"char1", #CallString, String)
-- 移動(dòng)角色
String:="Characters.Character('"^agentchar1^"').MoveTo('"^WindowLeft+60^"','"^WindowTop+300^"')"
CallSprite(@"char1", #CallString, String)
-- 禁止錯(cuò)誤提示信息
SetSpriteProperty(@"char1", #RaiseRequestErrors, 0)
3.2.4Agent語(yǔ)音輸出控制
大部分Agent角色都可以利用基于SAPI4.0的TTS (Text To Speech)引擎產(chǎn)生語(yǔ)音輸出(事先需下載安裝SAPI及兼容的TTS引擎)。
Agent角色控件的Speak方法可以通過(guò)兩種方式產(chǎn)生語(yǔ)音輸出:利用文本或者播放事先錄制的聲音文件。由于沒(méi)有找到適用的漢語(yǔ)發(fā)音的TTS引擎,我們只好借助事先錄制好的wav文件進(jìn)行語(yǔ)音輸出。
實(shí)現(xiàn)過(guò)程如下:
在流程線上添加【計(jì)算】設(shè)計(jì)圖標(biāo),把它命名為“說(shuō)開場(chǎng)白”,在代碼窗口中輸入如下代碼:
String:="Characters.Character('"^agentchar1^"').Play('"^"wave"^"')"
CallSprite(@"char1", #CallString, String)
-- 調(diào)用Speak方法,播放事先錄制好的“main1.wav”文件
String:="Characters.Character('"^agentchar1^"').Speak('"^"歡迎進(jìn)入奇妙的算法世界!"^"',"^"'main1.wav'"^")"
CallSprite(@"char1", #CallString, String)
3.2.5程序主流程圖(圖7)
3.3Java中多線程技術(shù)
Java中多線程機(jī)制,多個(gè)線程不僅可以單獨(dú)工作,而且可以相互協(xié)作,共同完成一個(gè)任務(wù),因此多個(gè)線程之間的通信成為多線程共同協(xié)作的關(guān)鍵。
Java多線程的主要分成三種通信方式:管道類進(jìn)行通信、標(biāo)志變量進(jìn)行通信、wait(),notify()通信。在上面三種通信方式中,管道類實(shí)現(xiàn)的通信使用起來(lái)非常方便,但他并不是Java中的最基本的通信方式,而是在第二、三種通信機(jī)制上實(shí)現(xiàn)的,而第二種通信方式由于要不斷地循環(huán)測(cè)試標(biāo)志變量的值、效率低下。第三種方式由于采用了“等待——喚醒”策略,提高了程序運(yùn)行的效率。
比較上述三種通信方式,在實(shí)現(xiàn)過(guò)程中,多線程之間的通信一般采用第三種通信方式,使得在演示過(guò)程中,不僅沒(méi)有影響用戶界面的響應(yīng),而且保證了多線程運(yùn)行時(shí)效率。
實(shí)現(xiàn)過(guò)程中使用三個(gè)線程:選邊線程、畫邊線程和提示信息線程。圖8為此三線程之間的交互過(guò)程:其中選邊線程為主動(dòng)線程,畫邊線程和提示信息線程受控于選邊線程,選邊線程選出的邊為共享邊,選邊線程選出邊后,喚醒畫邊線程和提示信息線程,當(dāng)兩個(gè)線程一次運(yùn)行完后,進(jìn)入睡眠狀態(tài),同時(shí)喚醒選邊線程繼續(xù)選邊,這個(gè)過(guò)程一
直往復(fù),直到選完所有的邊。如圖8所示。
4展望
“數(shù)據(jù)結(jié)構(gòu)”虛擬課堂可以在很大程度上幫助教師進(jìn)行抽象算法教學(xué),同時(shí)幫助學(xué)生進(jìn)行課后自學(xué)提供輔助工具。該課題是一個(gè)跨學(xué)科的項(xiàng)目,涉及到教育學(xué)、心理學(xué)、人工智能以及計(jì)算機(jī)技術(shù)等多個(gè)學(xué)科,所以要實(shí)現(xiàn)一個(gè)有效的系統(tǒng)確實(shí)存在一定的難度。隨著各個(gè)學(xué)科的逐漸成熟,相信不遠(yuǎn)的將來(lái),虛擬課堂在教學(xué)過(guò)程中將發(fā)揮更大的作用。
參考文獻(xiàn):
[1] 何克抗,鄭永柏,謝幼如. 教學(xué)系統(tǒng)設(shè)計(jì)[M]. 北京師范大學(xué)出版社,2004.
[2] Duane A. Bailey. Data Structures in Java for the Principled Programmer[M]. WCB/McGraw-Hill,1995.
[3] 袁海東. 深入Authorware 7.0 編程[M]. 北京:電子工業(yè)出版社,2004.
Design and Implementation of “Data Structure” s Virtual Classroom
XIAO Zheng-xing, Xu Ren-feng, ZHAO Zhi-liang
(Shenzhen Polytechnic, Shenzhen 518055, China)
Abstract: “Data Structure” is a course which is hard to teach and learn in software courses, this paper designs and implements a Virtual Classroom to aid instruction according to specialties of students from vocational education and discusses the implementation of Authorware animation、the technology of Agent and multi-threads of java.
Keyword: data structure; virtual classroom; Agent; multi-thread