黎孟雄, 李 楊, 黎知秋(.江蘇師范大學(xué)連云港校區(qū) 數(shù)學(xué)與信息工程學(xué)院,江蘇 連云港 006;.連云港市教育管理信息中心,江蘇 連云港 006;.微軟亞洲研究院,北京 00080)
“算法設(shè)計(jì)與分析”是計(jì)算機(jī)學(xué)科各專(zhuān)業(yè)非常重要的核心基礎(chǔ)課,要求學(xué)生通過(guò)對(duì)經(jīng)典算法的設(shè)計(jì)思路、分析方法和實(shí)現(xiàn)技術(shù)進(jìn)行學(xué)習(xí)研究,旨在培養(yǎng)學(xué)生運(yùn)用時(shí)空復(fù)雜度思維來(lái)設(shè)計(jì)和應(yīng)用算法以切實(shí)提高解決實(shí)際問(wèn)題的能力,為開(kāi)發(fā)高效的軟件系統(tǒng)奠定良好的基礎(chǔ)。這些經(jīng)典算法包括:窮舉、遞歸、分治、動(dòng)態(tài)規(guī)劃、貪心、分支限界、回溯和隨機(jī)等算法。不過(guò),由于這些算法本身具有理論性強(qiáng)、內(nèi)容抽象等特點(diǎn),盡管“算法設(shè)計(jì)與分析”是一門(mén)理論和實(shí)踐結(jié)合緊密、強(qiáng)調(diào)知識(shí)和能力并重的課程,但學(xué)生在學(xué)習(xí)的過(guò)程當(dāng)中卻普遍感覺(jué)枯燥乏味、興趣低下,不僅課內(nèi)教學(xué)師生互動(dòng)不足、教學(xué)不彰,學(xué)生課后復(fù)習(xí)的主觀能動(dòng)性同樣是不盡人意[1-4]。主要原因就是大部分高校因?yàn)榭偨虒W(xué)時(shí)數(shù)和實(shí)驗(yàn)條件的限制只考慮理論教學(xué)課時(shí)的安排,實(shí)驗(yàn)課時(shí)安排較少甚至根本就沒(méi)有安排,嚴(yán)重影響了學(xué)生對(duì)算法原理、設(shè)計(jì)思想的理解和消化,影響了學(xué)生的動(dòng)手實(shí)踐能力和技術(shù)創(chuàng)新能力的培養(yǎng)[5-8]。
因此,要有效提高該門(mén)課程的教學(xué)質(zhì)量,除了需要在課堂內(nèi)精心組織理論課的教學(xué),還需要特別重視實(shí)驗(yàn)課的教學(xué),在上機(jī)實(shí)驗(yàn)環(huán)節(jié)上使算法學(xué)習(xí)和實(shí)驗(yàn)設(shè)計(jì)盡可能趣味化、具體化、生活化,即通過(guò)生動(dòng)有趣的應(yīng)用案例嵌入算法實(shí)驗(yàn)教學(xué),達(dá)到促進(jìn)理論知識(shí)的轉(zhuǎn)化和掌握算法的精髓,感受算法之美,激發(fā)學(xué)生的學(xué)習(xí)興趣和潛能。所以,一方面為應(yīng)對(duì)傳統(tǒng)實(shí)驗(yàn)室受教學(xué)資源、師資力量和實(shí)驗(yàn)時(shí)間等條件的制約,另一方面給學(xué)生提供一個(gè)更加便捷、易用的算法實(shí)驗(yàn)環(huán)境,本文設(shè)計(jì)了基于微型C語(yǔ)言編譯器(Tiny C Compiler,TCC)的經(jīng)典算法互動(dòng)實(shí)驗(yàn)平臺(tái)。該實(shí)驗(yàn)平臺(tái)算法知識(shí)資源豐富,內(nèi)嵌的TCC編譯軟件體積小,為純綠色版,整個(gè)系統(tǒng)毋需安裝配置,方便學(xué)生隨身攜帶使用。
TCC是一款功能強(qiáng)大的超輕量級(jí)開(kāi)源C語(yǔ)言編譯器,完全支持標(biāo)準(zhǔn)ANSI C語(yǔ)言源程序及其所有的Windows函數(shù)和C語(yǔ)言運(yùn)行庫(kù)函數(shù),甚至所有的DLL、LIB都可以被它用來(lái)作為擴(kuò)展函數(shù)使用[9]。同時(shí)TCC也是一個(gè)頗具特色的C語(yǔ)言解釋器,可以在省略編譯和鏈接的情況下直接運(yùn)行C語(yǔ)言源程序,就如同運(yùn)行任何一種腳本語(yǔ)言如Perl、Python、Ruby、Shell一樣方便,但解釋執(zhí)行的效率卻比腳本語(yǔ)言高得多,這樣不僅可以顯著地加快程序開(kāi)發(fā)速度和專(zhuān)注于功能實(shí)現(xiàn),還可以把TCC嵌入到用戶(hù)的應(yīng)用程序中當(dāng)作一個(gè)動(dòng)態(tài)代碼生成器。
TCC除了具有高效的程序解釋執(zhí)行功能,還有以下幾個(gè)優(yōu)點(diǎn):
(1) 體積非常小巧。一個(gè)完整的包括C語(yǔ)言的預(yù)處理器、編譯器、匯編器和鏈接器在內(nèi)的TCC可執(zhí)行程序只有80 K byte大小,可以說(shuō)是世界上體積最小的編譯器。因此,TCC幾乎可以被使用在任何場(chǎng)合來(lái)運(yùn)行C語(yǔ)言程序,包括對(duì)存儲(chǔ)空間要求極為嚴(yán)苛的嵌入式系統(tǒng)等環(huán)境。
(2) 編譯速度極快。與Turb C、Pelles C、Cygwin、Mingw32、DJGPP等其他C語(yǔ)言編譯器不同,TCC采用了單趟編譯器(one-pass compiler)的“語(yǔ)法制導(dǎo)翻譯”方式來(lái)貫穿整個(gè)編譯器的實(shí)現(xiàn),由語(yǔ)法分析來(lái)驅(qū)動(dòng)預(yù)處理與詞法分析,同時(shí)也由語(yǔ)法分析來(lái)驅(qū)動(dòng)語(yǔ)義分析與目標(biāo)代碼生成。編譯過(guò)程中不構(gòu)造代碼的任何“中間表示”(intermediate representation,IR),連AST也不需要生成,所以編譯速度極為迅速。
(3) 兼容性強(qiáng)。任何C語(yǔ)言動(dòng)態(tài)庫(kù)都可以被直接引用,還支持C語(yǔ)言和匯編語(yǔ)言混合編程。
(4) 安全性高。TCC自帶內(nèi)存邊界檢查器,可以防止代碼引用無(wú)效或非法的內(nèi)存地址,減少了很多潛在的安全漏洞,極大地提高了程序的安全性和健壯性。
基于TCC經(jīng)典算法互動(dòng)實(shí)驗(yàn)平臺(tái)的設(shè)計(jì)目的主要是以更具拓展性的經(jīng)典算法學(xué)習(xí)和設(shè)計(jì)為實(shí)驗(yàn)主題的教學(xué)輔助系統(tǒng),同時(shí)在知識(shí)咨詢(xún)、代碼編寫(xiě)、算法演示動(dòng)畫(huà)等方面也具備較強(qiáng)的人機(jī)互動(dòng)功能。實(shí)驗(yàn)平臺(tái)的總體結(jié)構(gòu)主要包括4個(gè)核心功能部分:算法主題學(xué)習(xí)、算法實(shí)驗(yàn)練習(xí)、人機(jī)智能互動(dòng)和實(shí)驗(yàn)過(guò)程管理等模塊。實(shí)驗(yàn)平臺(tái)的功能體系結(jié)構(gòu)如圖1所示。
圖1 經(jīng)典算法互動(dòng)實(shí)驗(yàn)平臺(tái)體系結(jié)構(gòu)
(1) 算法主題學(xué)習(xí)模塊。實(shí)驗(yàn)平臺(tái)內(nèi)嵌的SQLite數(shù)據(jù)庫(kù)儲(chǔ)存了豐富的算法資源,除了涵蓋傳統(tǒng)的窮舉、遞歸、分治、貪心、回溯、隨機(jī)、分支限界和動(dòng)態(tài)規(guī)劃等所有經(jīng)典算法,還增加了卷積神經(jīng)網(wǎng)絡(luò)、深度學(xué)習(xí)、樸素貝葉斯、模糊聚類(lèi)、隱馬爾科夫、遺傳算法、快速傅里葉變換之類(lèi)能應(yīng)用在人工智能、大數(shù)據(jù)分析等前沿技術(shù)方面的熱門(mén)算法。對(duì)于每個(gè)算法知識(shí)的講解,均包括提出問(wèn)題、解決策略、算法設(shè)計(jì)、編碼實(shí)現(xiàn)、分析評(píng)估和應(yīng)用案例等幾個(gè)部分。在內(nèi)容上比“算法設(shè)計(jì)與分析”課程的相關(guān)教材更加細(xì)致深入,補(bǔ)充了教材中沒(méi)有涉及或者闡述得不夠詳細(xì)的知識(shí)點(diǎn),是課堂教學(xué)的重要拓展和延續(xù),從而構(gòu)建了一個(gè)比較完整的算法知識(shí)學(xué)習(xí)體系。另外,學(xué)習(xí)模塊還使用了大量有針對(duì)性的算法演示動(dòng)畫(huà),力圖讓抽象復(fù)雜的算法執(zhí)行過(guò)程盡可能具體化、形象化。
(2) 算法實(shí)驗(yàn)練習(xí)模塊。算法的編程實(shí)踐練習(xí)是算法學(xué)習(xí)過(guò)程中最重要的一環(huán),也是實(shí)驗(yàn)平臺(tái)最核心的模塊。平臺(tái)里的實(shí)驗(yàn)題目選材新穎有趣又實(shí)用性強(qiáng),寓理論于實(shí)踐中啟迪思維、開(kāi)闊眼界。比如窮舉算法的實(shí)驗(yàn)練習(xí)題有“百錢(qián)買(mǎi)百雞問(wèn)題”“誰(shuí)在說(shuō)謊”“雞兔同籠”“QQ密碼找回”等;遞歸算法的實(shí)驗(yàn)練習(xí)題有“兔子繁殖問(wèn)題”“漢諾塔游戲”“小猴吃桃”“公交路線查詢(xún)”等;貪心算法的實(shí)驗(yàn)練習(xí)題有“貨船裝箱調(diào)度”“物流網(wǎng)絡(luò)優(yōu)化”“多機(jī)作業(yè)調(diào)度”“系統(tǒng)故障排查”等。為了提高上機(jī)實(shí)驗(yàn)效率、減輕代碼編寫(xiě)工作量,學(xué)生只需要編寫(xiě)算法程序的關(guān)鍵部分即可。由于TCC能夠動(dòng)態(tài)調(diào)用C語(yǔ)言腳本,所以學(xué)生編寫(xiě)的代碼能夠完美地嵌入到已經(jīng)預(yù)先編好的其余代碼中運(yùn)行。當(dāng)然,學(xué)生提交程序代碼之后實(shí)驗(yàn)平臺(tái)會(huì)自動(dòng)驗(yàn)證以判斷算法是否正確。通過(guò)完成這些實(shí)驗(yàn)練習(xí),可以幫助學(xué)生理解和拓寬算法在求解問(wèn)題中的靈活應(yīng)用,并提高編寫(xiě)程序解決實(shí)際問(wèn)題的能力。
(3) 人機(jī)智能互動(dòng)模塊。在算法設(shè)計(jì)的上機(jī)實(shí)驗(yàn)過(guò)程中有很多學(xué)生總會(huì)或多或少地面臨一些問(wèn)題和困難,如果不及時(shí)加以解決,哪怕是一個(gè)小的語(yǔ)法錯(cuò)誤,也會(huì)嚴(yán)重影響整個(gè)實(shí)驗(yàn)的進(jìn)度。因此實(shí)驗(yàn)平臺(tái)嵌入了智能導(dǎo)學(xué)機(jī)器人來(lái)模擬指導(dǎo)老師進(jìn)行答疑解惑。通過(guò)和導(dǎo)學(xué)機(jī)器人的互動(dòng),學(xué)生不僅可以獲得相關(guān)范例算法的偽代碼流程以及程序?qū)崿F(xiàn)的常見(jiàn)方法和技巧,更重要的是還可以對(duì)正在編寫(xiě)的程序代碼進(jìn)行語(yǔ)法檢查和診斷,如果程序編寫(xiě)有錯(cuò)則可精確定位到錯(cuò)誤位置并得到詳細(xì)的錯(cuò)誤提示信息和對(duì)應(yīng)的輔導(dǎo)意見(jiàn)。
(4) 實(shí)驗(yàn)過(guò)程管理模塊。為了督促學(xué)生從被動(dòng)學(xué)習(xí)轉(zhuǎn)為主動(dòng)學(xué)習(xí),學(xué)生登錄實(shí)驗(yàn)平臺(tái)后的所有操作過(guò)程都會(huì)被記錄在本地SQLite數(shù)據(jù)庫(kù),當(dāng)系統(tǒng)聯(lián)網(wǎng)后這些記錄信息會(huì)自動(dòng)發(fā)送給任課教師,將在最終的實(shí)驗(yàn)成績(jī)中有所體現(xiàn)。學(xué)生的操作過(guò)程包括算法主題的有效學(xué)習(xí)時(shí)長(zhǎng)、完成的實(shí)驗(yàn)題數(shù)量、實(shí)驗(yàn)進(jìn)度、實(shí)驗(yàn)結(jié)果、實(shí)驗(yàn)報(bào)告、人機(jī)互動(dòng)等所有和實(shí)驗(yàn)相關(guān)的行為狀態(tài)。為了防止學(xué)生實(shí)驗(yàn)過(guò)程中的掛機(jī)行為,實(shí)驗(yàn)平臺(tái)在啟動(dòng)伊始就隨之在后臺(tái)進(jìn)行非法進(jìn)程監(jiān)控和網(wǎng)頁(yè)內(nèi)容監(jiān)管[10],一旦發(fā)現(xiàn)學(xué)生有玩游戲、看影視等行為就會(huì)立即彈窗警告。
經(jīng)典算法互動(dòng)實(shí)驗(yàn)平臺(tái)基于Microsoft .NET Framework,采用Visual C#開(kāi)發(fā),后臺(tái)數(shù)據(jù)存儲(chǔ)使用嵌入式關(guān)系型數(shù)據(jù)庫(kù)SQLite,驅(qū)動(dòng)引擎只有System.Data.SQLite.dll一個(gè)文件,小巧實(shí)用。為了數(shù)據(jù)庫(kù)內(nèi)資料的安全,系統(tǒng)設(shè)計(jì)了多級(jí)用戶(hù)權(quán)限,有如:系統(tǒng)管理員、教師、注冊(cè)學(xué)生和普通游客等。
實(shí)驗(yàn)平臺(tái)的用戶(hù)界面元素主要由算法知識(shí)資源呈現(xiàn)和學(xué)生實(shí)驗(yàn)練習(xí)兩個(gè)核心單元構(gòu)建而成。算法實(shí)驗(yàn)練習(xí)模塊是整個(gè)系統(tǒng)的設(shè)計(jì)重點(diǎn),每一個(gè)實(shí)驗(yàn)都是把固定的算法邏輯放在主程序中,而將學(xué)生編寫(xiě)的代碼部分寫(xiě)入TCC腳本文件。這樣,把經(jīng)常需要修改的邏輯部分用TCC來(lái)實(shí)現(xiàn),則在學(xué)生驗(yàn)證算法程序時(shí)就不需要頻繁編譯。另外,調(diào)用TCC腳本最方便的地方就是可以直接把指針當(dāng)參數(shù)和返回值在腳本和宿主程序之間互相傳遞。因此,實(shí)驗(yàn)平臺(tái)構(gòu)建的關(guān)鍵在于TCC編譯器的調(diào)用,方法如下:
ProcessStarInfo AlgorithmTcc = new ProcessStarInfo("D: cc cc.exe",s); //設(shè)置路徑
AlgorithmTcc.Arguments = "-run " + strShowSname; //運(yùn)行時(shí)的參數(shù)
AlgorithmTcc.RedirectStandardOutput = true; //調(diào)用程序獲取輸出信息
AlgorithmTcc.RedirectStandardInput = true; //接受來(lái)自調(diào)用程序的輸入信息
AlgorithmTcc.RedirectStandardError = true; //接受錯(cuò)誤提示信息
AlgorithmTcc.UseShellExecute = false; //不使用系統(tǒng)默認(rèn)程序啟動(dòng),重定向輸入流、輸出流和錯(cuò)誤流
AlgorithmTcc.CreateNoWindow = true; //不顯示程序窗口
Process proTcc = Process.Start(AlgorithmTcc); //調(diào)用運(yùn)行TCC編譯器
string strOutput = proTcc.StandardOutput.ReadToEnd() + proTcc.StandardError.ReadToEnd();
Tcc_Compiler.Text = strOutput; //把輸出信息顯示在文本框
AlgorithmTcc.WaitForExit();
AlgorithmTcc.Close(); //退出TCC
學(xué)生在編寫(xiě)算法程序時(shí),如果感覺(jué)邏輯復(fù)雜、代碼行過(guò)多,可以懸浮代碼窗口,調(diào)用代碼編輯器Sublime Text,它支持語(yǔ)法高亮、代碼補(bǔ)全、代碼折疊、行號(hào)顯示以及全屏免打擾模式等。
基于TCC的經(jīng)典算法互動(dòng)實(shí)驗(yàn)平臺(tái)的用戶(hù)主界面如圖2所示。
實(shí)驗(yàn)平臺(tái)的人機(jī)互動(dòng)主要體現(xiàn)在知識(shí)咨詢(xún)和代碼編寫(xiě)錯(cuò)誤的智能提示兩方面。
學(xué)生在進(jìn)行算法編程實(shí)驗(yàn)時(shí)如果遇到困難,可以向智能導(dǎo)學(xué)機(jī)器人求助咨詢(xún),機(jī)器人首先從編程技巧知識(shí)庫(kù)和算法FAQ知識(shí)庫(kù)中檢索反饋,如果沒(méi)有答案則啟動(dòng)垂直搜索引擎從Internet上檢索,模糊聚類(lèi)后進(jìn)行Top-N排序推薦最佳答案。
在代碼編寫(xiě)方面的人機(jī)互動(dòng)對(duì)實(shí)驗(yàn)的順利進(jìn)行顯得更為重要。C語(yǔ)言的靈活性雖然帶來(lái)了程序效率的提升,但其代碼編寫(xiě)的隨意性也使得程序出錯(cuò)概率較高。在用其他語(yǔ)言編程時(shí)可以輕易發(fā)現(xiàn)的錯(cuò)誤,由于C語(yǔ)言編譯器不進(jìn)行強(qiáng)制類(lèi)型檢查、語(yǔ)法檢查也不嚴(yán)格而無(wú)法檢查到,帶來(lái)了代碼編寫(xiě)的諸多隱患。
C語(yǔ)言的代碼檢查軟件主要有Coverity、Fortify、Flawfinder、PC-lint、Rats和Splint等[11]。前面兩種都偏重量級(jí),需要提交源代碼到服務(wù)器審查,不便于隨身攜帶、隨時(shí)使用;Flawfinder和PC-lint的詞法掃描和語(yǔ)法分析速度極快,都內(nèi)嵌了一些漏洞數(shù)據(jù)庫(kù),如緩沖區(qū)溢出、格式化串漏洞等,但誤報(bào)率很高;Rats則掃描規(guī)則比較粗糙;Splint是一款功能強(qiáng)大而又小巧方便的開(kāi)源靜態(tài)代碼檢測(cè)工具,會(huì)進(jìn)行多種常規(guī)編程規(guī)范檢查,包括標(biāo)點(diǎn)符號(hào)、流程結(jié)構(gòu)錯(cuò)誤、數(shù)組下標(biāo)越界、數(shù)據(jù)類(lèi)型不匹配、使用未定義變量、冗余代碼、忽略返回值、無(wú)限循環(huán)、內(nèi)存泄漏以及其它編程陷阱和格式缺陷等[12]。
圖2 算法實(shí)驗(yàn)平臺(tái)的用戶(hù)主界面
所以,實(shí)驗(yàn)平臺(tái)使用Splint作為學(xué)生代碼檢測(cè)的內(nèi)嵌工具,以期幫助他們節(jié)省程序測(cè)試時(shí)間、提高算法代碼質(zhì)量、規(guī)范編程風(fēng)格和行為。
splint需通過(guò)cmd命令行打開(kāi)運(yùn)行,其語(yǔ)法形式如下: splint [+/-options] *.c。options為各種參數(shù)設(shè)置,使用+/-開(kāi)啟或關(guān)閉對(duì)應(yīng)參數(shù),例如:splint-showcol test.c,即在檢測(cè)test.c源程序時(shí),警告消息中不顯示列數(shù),splint +varuse test.c,即在檢測(cè)test.c源程序時(shí),在警告消息中顯示未使用變量提示。當(dāng)然也可以使用splintrc配置文件來(lái)設(shè)置各種參數(shù),splint在安裝之后,splintrc文件中已經(jīng)對(duì)大部分常規(guī)參數(shù)作了默認(rèn)設(shè)定。splint命令行中指定的參數(shù)設(shè)置會(huì)覆蓋splintrc文件中的同名參數(shù)默認(rèn)設(shè)定。
為了方便與學(xué)生進(jìn)行人機(jī)互動(dòng),實(shí)驗(yàn)平臺(tái)在學(xué)生提交算法程序時(shí)內(nèi)部調(diào)用splint命令異步執(zhí)行,然后通過(guò)導(dǎo)學(xué)機(jī)器人讀取splint運(yùn)行后的警告信息列表予以彈窗提示,如圖3所示。
圖3 算法實(shí)驗(yàn)平臺(tái)的人機(jī)智能互動(dòng)
算法演示動(dòng)畫(huà)的目的就是把抽象的算法知識(shí)具體化、形象化,以便學(xué)生更容易理解和掌握。算法在軟件中還體現(xiàn)為算法代碼,所以算法演示動(dòng)畫(huà)的另外一個(gè)目的就是需要實(shí)現(xiàn)程序可視化[13],比如通過(guò)顯示循環(huán)語(yǔ)句結(jié)構(gòu)的執(zhí)行流程來(lái)表現(xiàn)循環(huán)的邊界條件,或者通過(guò)輸出控件監(jiān)視變量值的變化情況來(lái)動(dòng)態(tài)觀察一些關(guān)鍵參數(shù)對(duì)算法的影響。并且同步高亮顯示當(dāng)前運(yùn)行的代碼行。
傳統(tǒng)的算法演示動(dòng)畫(huà)一般都采用OpenGL、GDI+、HTML5和Flash等技術(shù)制作,動(dòng)畫(huà)效果的表現(xiàn)力都非常好。不過(guò),基于矢量圖形和流技術(shù)的Flash動(dòng)畫(huà)以其體積容量更小、交互性更強(qiáng)、實(shí)現(xiàn)速度更快等特點(diǎn)而成為實(shí)驗(yàn)平臺(tái)制作算法演示動(dòng)畫(huà)的首選。ActionScript是Flash內(nèi)置的動(dòng)作腳本語(yǔ)言,也是一種完全的面向?qū)ο蟮木幊陶Z(yǔ)言,功能強(qiáng)大、類(lèi)庫(kù)豐富,通過(guò)與外部應(yīng)用程序的通信能為算法演示動(dòng)畫(huà)添加特殊或復(fù)雜的人機(jī)互動(dòng)功能[14]。
Flash算法演示動(dòng)畫(huà)通過(guò)ActionScript腳本語(yǔ)言的ExternalInterface類(lèi)與C#程序進(jìn)行互動(dòng)通信[15]。ExternalInterface.call方法用來(lái)從ActionScript調(diào)用C#程序的函數(shù)。為了將值返回 ActionScript,C#可以調(diào)用ActiveX對(duì)象的SetReturnValue方法,將結(jié)果作為該方法的參數(shù)進(jìn)行傳遞。而從C#程序調(diào)用ActionScript函數(shù)時(shí),首先用ExternalInterface.addCallback方法注冊(cè),然后再使用CallFunction方法調(diào)用該函數(shù)。
Flash算法演示動(dòng)畫(huà)與C#程序通信的方法如下:
(1) C#調(diào)用Flash定義的函數(shù)
Flash端代碼:
ExternalInterface.addCallback("FormCallback",FormCallback);
function FormCallback(msg:String):void{} //接收C#調(diào)用函數(shù)
C#端代碼:
commandStr = "〈invoke name='FormCallback' returntype='xml'〉〈arguments〉〈string〉參數(shù)字符串〈/string〉〈/arguments〉〈/invoke〉";
Desktop.CallFunction(commandStr); //其中Desktop為Flash控件的名稱(chēng)。
(2) Flash調(diào)用C#定義的函數(shù)
Flash端代碼:
ExternalInterface.addCallback("FormCallback",FormCallback);
function FormCallback(msg:String):void //接收C#調(diào)用函數(shù)
{ ExternalInterface.call("Messagebox",msg)}; //發(fā)送命令和參數(shù)給Form
C#端代碼:
private void flashCall(object sender)
{ //解析命令字符串取得參數(shù)值
XmlDocument xml = new XmlDocument();
xml.LoadXml(e.request);
string FunctionName = xml.FirstChild.Attributes[0].Value;
XmlNode node = xml.getElementsByTagName_r("arguments").Item(0);
string msg=node.ChildNodes[0].InnerText;
MessageBox.show(msg);}
基于TCC的經(jīng)典算法互動(dòng)實(shí)驗(yàn)平臺(tái)的設(shè)計(jì)開(kāi)發(fā),改善了“算法設(shè)計(jì)與分析”課程的實(shí)驗(yàn)教學(xué)環(huán)境和效果,使學(xué)生能輕松、直觀地學(xué)習(xí)和掌握各種經(jīng)典算法知識(shí),也能非常方便地獨(dú)立完成各類(lèi)算法實(shí)驗(yàn)。學(xué)習(xí)資源庫(kù)里的絕大部分應(yīng)用案例和實(shí)驗(yàn)練習(xí)題都與生活息息相關(guān),淋漓盡致地展現(xiàn)了算法解決問(wèn)題的本質(zhì),讓學(xué)生愛(ài)上算法,并樂(lè)在其中。該實(shí)驗(yàn)平臺(tái)人機(jī)互動(dòng)功能強(qiáng),既適合任課教師組織課內(nèi)教學(xué)和實(shí)驗(yàn),也方便學(xué)生課后自學(xué)和訓(xùn)練。不過(guò),實(shí)驗(yàn)平臺(tái)在對(duì)學(xué)生的算法程序進(jìn)行錯(cuò)誤檢查時(shí)的還未能做到中文提示,會(huì)給部分英語(yǔ)水平較弱的學(xué)生帶來(lái)一些困擾,所以,未來(lái)實(shí)驗(yàn)平臺(tái)的研究將在人機(jī)互動(dòng)方面加以?xún)?yōu)化和完善,做到更具人性化。
參考文獻(xiàn)(References):
[1] 王 丹,付利華,杜金蓮.算法分析與設(shè)計(jì)課程中的“三化一體”教學(xué)方法[J].計(jì)算機(jī)教育,2016(7):120-121,125.
[2] 向金海,任繼平,余文君.“算法設(shè)計(jì)與分析”課程教學(xué)與實(shí)踐方法探討[J].計(jì)算機(jī)教育,2012(6):87-89.
[3] 趙曉麗.應(yīng)用型本科院校《算法設(shè)計(jì)與分析》課程實(shí)踐教學(xué)改革研究[J].長(zhǎng)治學(xué)院學(xué)報(bào),2016,33(2):72-74.
[4] 李曉鴻,駱嘉偉,季 潔.“數(shù)據(jù)結(jié)構(gòu)與算法分析”研究型實(shí)踐教學(xué)的探索[J].實(shí)驗(yàn)室研究與探索,2012,31(1):121-125.
[5] 陳湘驥,徐東風(fēng),方鳳美.算法類(lèi)程序設(shè)計(jì)課程多層次實(shí)踐教學(xué)體系的構(gòu)建[J].實(shí)驗(yàn)室研究與探索,2012,31(8):319-322.
[6] 劉 波.“算法設(shè)計(jì)與分析”教學(xué)探討[J].高等理科教育,2007(04):78-80.
[7] 王曉明,黃襄念.本科算法設(shè)計(jì)與分析課程教學(xué)存在的問(wèn)題及改進(jìn)措施[J].高等教育研究,2012,29(2):43-46.
[8] 何克晶,張星明,鄭運(yùn)平.算法設(shè)計(jì)與分析課程全方位實(shí)踐教學(xué)改革探索[J].計(jì)算機(jī)教育,2017(2):45-49.
[9] Tiny C Compiler Reference Documentation[EB/OL].[2017-01-28].http://bellard.org/tcc/tcc-doc.html
[10] 黎孟雄,郭鵬飛.軟件實(shí)驗(yàn)室智能管理系統(tǒng)的研究與實(shí)現(xiàn)[J].實(shí)驗(yàn)技術(shù)與管理,2013,30(6):62-64.
[11] 羅琴靈,蔣朝惠.多策略軟件代碼缺陷檢測(cè)方法研究[J].貴州大學(xué)學(xué)報(bào)(自然科學(xué)版),2015,32(3):113-118.
[12] Splint Manual[EB/OL].[2017-03-09].http://www.splint.org/manual/manual.html
[13] 李曉鴻,劉 叢,駱嘉偉.基于學(xué)習(xí)者視角的算法可視化系統(tǒng)研究綜述[J].計(jì)算機(jī)科學(xué),2015(s2):431-437.
[14] 李海英.ActionScript在動(dòng)態(tài)交互式C語(yǔ)言算法仿真動(dòng)畫(huà)中的研究[J].中國(guó)教育信息化,2012(19):79-81.
[15] ExternalInterface類(lèi)[EB/OL].[2017-02-17].http://help.adobe.com/zh_CN/as3/dev/index.html