肖正興 徐人鳳 趙志亮
摘要:“數據結構”是軟件專業課程中難教、難學的一門課程,本文針對高職學生特點,設計實現了用于輔助教學的虛擬課堂,重點探討了Authorware動畫的實現、Agent的加入和Java中的多線程技術。
關鍵詞:數據結構;虛擬課堂;Agent;多線程
中圖分類號:G642文獻標識碼:B
1引言
“數據結構”課程是計算機學科非常重要的專業理論課程。這在ACM多次提出的計算機課程建議報告書中得到了充分體現。通過本課程的學習,使學生掌握如何把現實世界的客觀問題變換為在計算機內的表示形式;學會組織數據、選擇算法、養成良好的程序設計風格;提高邏輯思維和抽象思維的能力,為以后有關的計算機課程的學習和從事軟件開發奠定堅實的基礎。
不同層次的院校,根據要求不同,在“數據結構”課程教學的側重點上有所分別,針對高職學生,主要是培養學生算法的應用能力,所以在教學內容選擇上,應以“理論夠用,廣而不深”為原則;教學方法的選擇上,注重培養學生對理論成果的應用能力;教學手段上盡可能生動形象,幫助學生理解掌握概念理論。
為了達到上述要求,僅僅通過課堂上的傳統方式講解數據結構,教學上存在難度,學生也容易失去興趣。多媒體課件是計算機多媒體技術在教育領域中應用的典型范例,本文針對高職學生的特點,嘗試使用多媒體技術構建一個學生能夠自主學習的虛擬課堂,幫助學習、理解和鞏固這些算法。
2系統設計
2.1虛擬課堂設計思想
虛擬課堂主要由自主學習環境和算法交互環境兩部分組成,其中自主學習環境主要是讓學生進行算法的自學習,以講解和演示為主;算法交互環境提供學生動態產生數據,學習和驗證算法,交互性要求高,所以采用Java語言實現。如圖1所示。

2.1.1自主學習環境
該環境對用戶的交互性要求不高,所以針對這部分內容,系統使用Authorware軟件進行制作,在算法的教學過程中,采用“實例引入→動畫演示→實戰練兵”的教學模式,由淺入深,并由特殊到一般的方式輔助學生學習算法本質,并利用Microsoft Agent技術構建的Merlin老師,在教學過程中指導學生進行算法的學習。每個算法的教學按照上述模式進行自主學習。如圖2所示。
“實例引入”模塊主要通過一個實例演示算法的操作過程;并在演示過程中,講解算法的主要思想;“算法思想”通過對“實例引入”的學習,通過歸納、總結的方式表達出該算法的思想;“動畫演示”模塊通過動畫技術和程序可視化相結合技術,將宏觀的運行和微觀的算法執行相對照,理解算法程序的代碼;“實戰練兵”模塊通過互動的方式測試前面階段學習的基本算法知識;“交互環境”模塊主要是算法的運行的可視化環境,在該環境下,學生能夠利用該工具互動加強算法的理解,并能檢測自己對算法的掌握程度。

在以上模塊中“課程導入”、“實例引入”、“算法思想”、“動畫演示”、“實戰練兵”幾個模塊都是采用遞進的方式組織教學內容,以講授為主,主要以聲音、動畫等形式展現教學內容,同學可以按照上面的組織過程進行學習,也可以自己根據自己的進度,選擇相應的模塊進行學習。
2.1.2算法交互環境
在該環境中,采用程序可視化和動畫動態演示技術相結合的手段來演示算法的運行,對于算法本質的理解有積極作用,輔助教師進行課堂的算法教學,并提供測試環境,并能根據測試的數據,產生正確演示效果。
(1) 二叉樹前、中、后序遍歷演示界面
在上面環境中,遍歷演示主要由三塊組成,畫板區、代碼顯示區和演示提示區。其中畫板區顯示遍歷的動態效果,代碼顯示區顯示代碼的同步執行情況,演示提示區顯示遍歷過程中關鍵性的提示信息。用戶可以隨機建立一個二叉樹,并能調節演示的速度,如圖3所示。

(2) 二叉樹前、中、后序遍歷演測試界面
通過點擊1號按鈕開始進行測試,點擊初始數據按鈕,能夠在手動建樹區域進行二叉樹的建立,在答案區域,選擇前、中或后序遍歷中的一種,然后在編輯框內輸入響應遍歷的結果,結點與結點間用英文狀態下的逗號隔開,單擊檢驗數據按鈕,檢驗輸入的答案是否正確,并給予相應的提示,單擊正確數據按鈕,程序進入演示狀態。
2.2系統功能和特點
2.2.1交互性強的人機交互界面
系統的特點是:較強的交互能力、動態的算法演示、形象的圖形設計、充分應用動畫和色彩體現算法的細節、運用Microsoft Agent充當課件的虛擬教師,貫徹教學策略,增加學習的興趣,突出教學內容的重點。
2.2.2程序可視化和動畫動態演示技術相結合
使教師脫離黑板和粉筆,采用程序可視化和動畫動態演示技術相結合的手段來演示算法的執行過程,對于算法本質的理解有積極作用,輔助教師進行課堂的算法教學,并能為學生自主學習算法提供良好的支撐環境,從而實現用形象的圖形界面為學生搭起通向掌握抽象思維方法的橋梁。
2.2.3多樣的測試環境
按照內容,分別提供有“實戰練兵”模塊,對數據結構中的已知算法進行測試;“交互環境”中,提供有測試功能,通過測試檢驗學生對算法思想的理解,并能在測試的過程中用利用程序可視化與動畫動態演示技術結合,顯示當前測試過程中的執行過程,進一步鞏固學生對算法的理解。
3系統實現關鍵技術
3.1Authorware中動畫的實現
在Authorware中,組合運用【顯示】圖標、【等待】圖標、【擦除】圖標和【判定】圖標,可以設計出多種動畫效果。下面以課件“冒泡排序→動畫演示”部分為例,簡單介紹Authorware中的動畫設計與實現。圖4、圖5形象地展示了程序執行過程。
動畫設計:屏幕右側模擬演示程序單步執行過程(圖5),紅色線框表示當前正在執行的語句。當遇到判斷語句時,屏幕右側出現紅色箭頭提示,指示當前正在進行比較的數據;比較結束,如果需要交換,則使用動畫展示兩個數的位置發生交換。動畫程序部分流程如圖6所示。


3.2Authorware中Agent的添加
為了提高程序易用性、增強軟件界面效果,使軟件具備人性化的交互功能,該軟件在課件中引入了“微軟助手(Microsoft Agent)”——魔法師默林(Merlin)。Microsoft Agent是一種基于微軟視窗平臺的可編程的即時交互性動畫角色,在Authorware中添加Agent的過程如下:
3.2.1檢測課件目標機器上是否安裝了Agent控件
在流程線上添加【計算】設計圖標,并在其中輸入如下代碼:
--定義變量IDAgent記錄agent控件的ClassID
IDAgent:="{D45FD31B-5C6E-11D1-9EC1-00C04FD7081F}"
--根據控件的ClassID檢測是否已經安裝Agent控件,如果未安裝,則運行msagent.exe進行安裝
if ActiveXControlQuery(IDAgent)=0 then
JumpOutReturn("msagent.exe")
end if
3.2.2導入Agent
在Authorware中執行【Insert】→【Control】→ 【ActiveX】菜單命令,在【Select ActiveX Control】窗口中選擇Microsoft Agent Control 2.0 控件,將Agent控件插入到程序流程之中。該控件具有大量的屬性和方法,通常需要使用控件的“CallString”方法才能進行訪問。
3.2.3Merlin初始化
在流程線上添加【計算】設計圖標,把它命名為“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)
-- 移動角色
String:="Characters.Character('"^agentchar1^"').MoveTo('"^WindowLeft+60^"','"^WindowTop+300^"')"
CallSprite(@"char1", #CallString, String)
-- 禁止錯誤提示信息
SetSpriteProperty(@"char1", #RaiseRequestErrors, 0)
3.2.4Agent語音輸出控制
大部分Agent角色都可以利用基于SAPI4.0的TTS (Text To Speech)引擎產生語音輸出(事先需下載安裝SAPI及兼容的TTS引擎)。
Agent角色控件的Speak方法可以通過兩種方式產生語音輸出:利用文本或者播放事先錄制的聲音文件。由于沒有找到適用的漢語發音的TTS引擎,我們只好借助事先錄制好的wav文件進行語音輸出。
實現過程如下:
在流程線上添加【計算】設計圖標,把它命名為“說開場白”,在代碼窗口中輸入如下代碼:
String:="Characters.Character('"^agentchar1^"').Play('"^"wave"^"')"
CallSprite(@"char1", #CallString, String)
-- 調用Speak方法,播放事先錄制好的“main1.wav”文件
String:="Characters.Character('"^agentchar1^"').Speak('"^"歡迎進入奇妙的算法世界!"^"',"^"'main1.wav'"^")"
CallSprite(@"char1", #CallString, String)
3.2.5程序主流程圖(圖7)

3.3Java中多線程技術
Java中多線程機制,多個線程不僅可以單獨工作,而且可以相互協作,共同完成一個任務,因此多個線程之間的通信成為多線程共同協作的關鍵。
Java多線程的主要分成三種通信方式:管道類進行通信、標志變量進行通信、wait(),notify()通信。在上面三種通信方式中,管道類實現的通信使用起來非常方便,但他并不是Java中的最基本的通信方式,而是在第二、三種通信機制上實現的,而第二種通信方式由于要不斷地循環測試標志變量的值、效率低下。第三種方式由于采用了“等待——喚醒”策略,提高了程序運行的效率。
比較上述三種通信方式,在實現過程中,多線程之間的通信一般采用第三種通信方式,使得在演示過程中,不僅沒有影響用戶界面的響應,而且保證了多線程運行時效率。
實現過程中使用三個線程:選邊線程、畫邊線程和提示信息線程。圖8為此三線程之間的交互過程:其中選邊線程為主動線程,畫邊線程和提示信息線程受控于選邊線程,選邊線程選出的邊為共享邊,選邊線程選出邊后,喚醒畫邊線程和提示信息線程,當兩個線程一次運行完后,進入睡眠狀態,同時喚醒選邊線程繼續選邊,這個過程一
直往復,直到選完所有的邊。如圖8所示。

4展望
“數據結構”虛擬課堂可以在很大程度上幫助教師進行抽象算法教學,同時幫助學生進行課后自學提供輔助工具。該課題是一個跨學科的項目,涉及到教育學、心理學、人工智能以及計算機技術等多個學科,所以要實現一個有效的系統確實存在一定的難度。隨著各個學科的逐漸成熟,相信不遠的將來,虛擬課堂在教學過程中將發揮更大的作用。
參考文獻:
[1] 何克抗,鄭永柏,謝幼如. 教學系統設計[M]. 北京師范大學出版社,2004.
[2] Duane A. Bailey. Data Structures in Java for the Principled Programmer[M]. WCB/McGraw-Hill,1995.
[3] 袁海東. 深入Authorware 7.0 編程[M]. 北京:電子工業出版社,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