方昱春,陳迅雷,張景嶠
(上海大學(xué) 計(jì)算機(jī)工程與科學(xué)學(xué)院,上海 200444)
實(shí)踐教學(xué)的核心組成部分之一是教學(xué)實(shí)驗(yàn)。通過(guò)實(shí)踐教學(xué)實(shí)驗(yàn),學(xué)生驗(yàn)證、設(shè)計(jì)和實(shí)現(xiàn)課堂講授的知識(shí)點(diǎn),從而加深對(duì)要點(diǎn)、難點(diǎn)的領(lǐng)悟和理解深度,增強(qiáng)自學(xué)能力和動(dòng)手能力,提高綜合學(xué)習(xí)水平。
實(shí)踐教學(xué)實(shí)驗(yàn)根據(jù)實(shí)驗(yàn)性質(zhì)可以分為驗(yàn)證性實(shí)驗(yàn)、設(shè)計(jì)性實(shí)驗(yàn)和綜合性實(shí)驗(yàn)3類。驗(yàn)證性實(shí)驗(yàn)通過(guò)提供詳細(xì)的實(shí)驗(yàn)步驟、具體的實(shí)驗(yàn)方案和完整的實(shí)驗(yàn)數(shù)據(jù),幫助學(xué)生掌握入門的程序設(shè)計(jì)方法,熟悉開發(fā)環(huán)境和開發(fā)平臺(tái);設(shè)計(jì)性實(shí)驗(yàn)要求學(xué)生運(yùn)用課堂上講授的一個(gè)或幾個(gè)知識(shí)點(diǎn)實(shí)現(xiàn)獨(dú)立功能,并且編制代碼調(diào)試程序求解問(wèn)題;綜合性實(shí)驗(yàn)要求學(xué)生綜合運(yùn)用課堂上學(xué)習(xí)的多個(gè)知識(shí)點(diǎn),完成功能全面獨(dú)立的小型實(shí)用系統(tǒng)。在編程實(shí)踐類課程中,綜合性作業(yè)幾乎等同于設(shè)計(jì)一個(gè)小型軟件系統(tǒng)。從考查學(xué)生學(xué)習(xí)狀況的角度而言,綜合性實(shí)驗(yàn)是考評(píng)學(xué)生對(duì)單門課程知識(shí)點(diǎn)掌握狀況最有效的辦法之一;從鍛煉學(xué)生動(dòng)手能力的角度而言,綜合性實(shí)驗(yàn)充滿了挑戰(zhàn)性,學(xué)生躍躍欲試。在上述3類實(shí)驗(yàn)中,綜合性實(shí)驗(yàn)的難度也是最高的:首先,眾多待實(shí)現(xiàn)功能使得學(xué)生無(wú)從下手;其次,課程講授的知識(shí)點(diǎn)有時(shí)序性,等待所有知識(shí)點(diǎn)講授完畢再進(jìn)行綜合設(shè)計(jì)則會(huì)出現(xiàn)開發(fā)時(shí)間不充足的情況。
為了解決上述困難,方法之一是把學(xué)生結(jié)成若干小組,把綜合實(shí)驗(yàn)分解成模塊,分配給每個(gè)學(xué)生獨(dú)立完成,然后通過(guò)合作集成完整的系統(tǒng)。這種方法適用于每個(gè)獨(dú)立功能都包含課程要點(diǎn)的情況,如開發(fā)數(shù)據(jù)庫(kù)系統(tǒng)時(shí),多個(gè)功能的各個(gè)模塊都可能需要運(yùn)用基本的數(shù)據(jù)庫(kù)處理算法。如果各個(gè)獨(dú)立功能僅僅側(cè)重單門課程的某個(gè)方面,那么采用這種方法可能會(huì)導(dǎo)致部分學(xué)生專注于完成自己分配到的功能組件的實(shí)現(xiàn),而忽略其他方面的實(shí)踐,最終影響其對(duì)單門課程的全面掌握。
分而治之實(shí)踐教學(xué)實(shí)驗(yàn)設(shè)置通過(guò)有機(jī)分解綜合性實(shí)驗(yàn),把部分功能模塊根據(jù)其特性編制成小型的驗(yàn)證性實(shí)驗(yàn)或者設(shè)計(jì)性實(shí)驗(yàn),配合所傳授的各個(gè)知識(shí)點(diǎn),布置給學(xué)生,在小實(shí)驗(yàn)積累的基礎(chǔ)上,使學(xué)生具備獨(dú)立完成綜合性大實(shí)驗(yàn)的能力。
分而治之的實(shí)踐教學(xué)實(shí)驗(yàn)編制方法如圖1所示。根據(jù)圖1,我們可以觀察到,分而治之的實(shí)踐教學(xué)實(shí)驗(yàn)設(shè)置的核心是對(duì)綜合性實(shí)驗(yàn)進(jìn)行分解。根據(jù)分解后獨(dú)立功能的性質(zhì),知識(shí)性、基礎(chǔ)性的模塊可以通過(guò)驗(yàn)證性實(shí)驗(yàn)引導(dǎo)學(xué)生進(jìn)行實(shí)踐;技術(shù)性、功能性的模塊以設(shè)計(jì)性實(shí)驗(yàn)的方式要求學(xué)生實(shí)現(xiàn);驗(yàn)證性實(shí)驗(yàn)和技術(shù)性實(shí)驗(yàn)則根據(jù)教學(xué)進(jìn)度布置給學(xué)生。在主干環(huán)節(jié)掌握的基礎(chǔ)上,就可以讓學(xué)生著手進(jìn)行綜合性實(shí)驗(yàn),余留的模塊則可以隨著后期課程的開展逐步進(jìn)行完善。除了基本模塊,對(duì)于一些可以提升綜合實(shí)驗(yàn)水平的技術(shù)和要點(diǎn),采用在課堂上提示要點(diǎn)的方式,鼓勵(lì)學(xué)有余力的學(xué)生通過(guò)自學(xué)去實(shí)現(xiàn)和掌握。通過(guò)對(duì)綜合性作業(yè)的有機(jī)分解,幫助學(xué)生跟隨授課進(jìn)程掌握和實(shí)踐知識(shí)要點(diǎn),并通過(guò)這一過(guò)程為獨(dú)立進(jìn)行綜合性實(shí)驗(yàn)作準(zhǔn)備,發(fā)揮創(chuàng)造力,最終完成綜合性實(shí)驗(yàn)作業(yè)。

圖1 分而治之的實(shí)踐教學(xué)實(shí)驗(yàn)設(shè)置示意圖
Windows編程課主要講授基于API (application programming interface,應(yīng)用編程接口)的程序開發(fā)技術(shù)和思想[1],屬于基礎(chǔ)程序設(shè)計(jì)課程之一。目前,雖然API編程方法在實(shí)際應(yīng)用中的使用范圍較窄,但是在程序設(shè)計(jì)語(yǔ)言的發(fā)展歷程中,API編程猶如一塊基石,其包含的主要元素是后續(xù)面向?qū)ο缶幊痰绕渌幊谭椒ǖ闹饕M成部分或封裝對(duì)象。計(jì)算機(jī)專業(yè)學(xué)生學(xué)習(xí)API編程的目的不僅僅在于鍛煉編程能力,更重要的一點(diǎn)在于通過(guò)學(xué)習(xí)使用API函數(shù)和數(shù)據(jù)結(jié)構(gòu)控制操作系統(tǒng)消息發(fā)送接收和調(diào)用系統(tǒng)功能,可以幫助學(xué)生深入理解Windows操作系統(tǒng)內(nèi)部的運(yùn)行機(jī)制,領(lǐng)悟圖形用戶界面的Windows程序設(shè)計(jì)核心思想[2-3],因此在開設(shè)這門課程時(shí),要求學(xué)生能夠全面掌握課程的核心要點(diǎn)。
Windows編程包含消息驅(qū)動(dòng)原理、圖形用戶界面設(shè)計(jì)、輸入輸出設(shè)備、資源使用、多任務(wù)和數(shù)據(jù)共享、網(wǎng)絡(luò)通信、動(dòng)態(tài)鏈接庫(kù)使用等眾多內(nèi)容。從本科學(xué)生接受能力和課時(shí)限制出發(fā),Windows編程課的授課內(nèi)容一般包括Windows框架程序、消息驅(qū)動(dòng)程序結(jié)構(gòu)、圖形設(shè)備接口(graphic device interface, GDI)對(duì)象和方法、輸入設(shè)備使用方法和消息處理、資源和資源腳本文件、多任務(wù)和多線程、DLL的使用和編程等,這些基本的API編程方法可以觸類旁通、舉一反三地運(yùn)用到其他Windows編程技術(shù)的學(xué)習(xí)中。
在Windows編程課中,可以要求學(xué)生通過(guò)設(shè)計(jì)一個(gè)運(yùn)行效果流暢的平面游戲程序作為綜合作業(yè)。具體設(shè)計(jì)要求包括使用圖形用戶界面、游戲中對(duì)象移動(dòng)無(wú)閃爍、人機(jī)交互自然友好、具有計(jì)分定時(shí)等完整的游戲功能。這樣一個(gè)綜合作業(yè)覆蓋了Windows編程課中主要授課內(nèi)容的多個(gè)要點(diǎn):①圖形用戶界面包含Windows框架程序和資源中多個(gè)要素的實(shí)現(xiàn),如菜單、圖標(biāo)、光標(biāo)、加速鍵、對(duì)話框和控件;②游戲?qū)ο蟮囊苿?dòng)需要掌握GDI對(duì)象和計(jì)時(shí)器使用的要點(diǎn);③人機(jī)交互自然友好需要實(shí)踐消息驅(qū)動(dòng)機(jī)制、鍵盤響應(yīng)、鼠標(biāo)響應(yīng)等。
學(xué)生接到任務(wù)之初往往感覺無(wú)從下手,因?yàn)檫@個(gè)作業(yè)和其他語(yǔ)言類的基礎(chǔ)編程課實(shí)踐作業(yè)相比,復(fù)雜度增加許多,而且Windows程序基本組件的實(shí)現(xiàn)方法需要在若干課時(shí)后才能接觸。
把這樣一個(gè)綜合實(shí)驗(yàn)布置給一個(gè)小組的學(xué)生,并且把各個(gè)功能模塊分解后分配給各個(gè)學(xué)生,通過(guò)合作完成綜合作業(yè),不能使每個(gè)學(xué)生都親自實(shí)踐各個(gè)要點(diǎn)的編程實(shí)現(xiàn)方法,也不能達(dá)到Windows編程課要求學(xué)生全面掌握核心要點(diǎn)的教學(xué)目的。因此,我們?cè)诮虒W(xué)實(shí)踐中采用了分而治之的實(shí)踐教學(xué)實(shí)驗(yàn)編制方法。
根據(jù)圖1的分而治之的實(shí)踐教學(xué)實(shí)驗(yàn)設(shè)置示意圖,可以分解第4節(jié)中的Windows編程實(shí)踐教學(xué)作業(yè)——設(shè)計(jì)一個(gè)運(yùn)行效果流暢的平面游戲程序,如圖2所示。根據(jù)Windows程序基本功能的類型,把平面游戲設(shè)計(jì)分解成9個(gè)基本模塊,按照授課時(shí)序排列為:Windows框架、游戲?qū)ο箫@示、閃爍消除處理、鍵盤消息響應(yīng)、鼠標(biāo)消息響應(yīng)、計(jì)時(shí)計(jì)分功能、游戲?qū)ο罂刂坪唾Y源使用,另外游戲?qū)ο筮\(yùn)動(dòng)模塊屬于算法設(shè)計(jì)范疇。根據(jù)各個(gè)功能模塊的難度和特點(diǎn),設(shè)計(jì)“Hello world!”“字符移動(dòng)程序”“位圖透明顯示”“動(dòng)態(tài)直線繪制”“鼠標(biāo)點(diǎn)擊游戲”“菜單對(duì)話框”6個(gè)涵蓋綜合實(shí)驗(yàn)主要技術(shù)點(diǎn)的驗(yàn)證性實(shí)驗(yàn)和設(shè)計(jì)性實(shí)驗(yàn)。

圖2 Windows編程實(shí)驗(yàn)的分而治之設(shè)置示意圖
首先,以Windows框架功能和鍵盤消息響應(yīng)合成“Hello world!”驗(yàn)證性實(shí)驗(yàn),作為學(xué)生入門的程序。設(shè)置目的出于兩個(gè)方面的考慮:①Windows框架程序是所有API程序的基石,其中包含大量的API函數(shù)和復(fù)雜的結(jié)構(gòu)體類型變量,因此設(shè)計(jì)驗(yàn)證性實(shí)驗(yàn)是最有助于學(xué)生學(xué)習(xí)和掌握的;②雖然鍵盤消息響應(yīng)的相關(guān)處理是學(xué)期中期才講授的內(nèi)容,但是通過(guò)給學(xué)生提供驗(yàn)證性實(shí)踐,可以幫助學(xué)生領(lǐng)悟消息驅(qū)動(dòng)機(jī)制下編程的特點(diǎn)和鍵盤消息處理的入門知識(shí)。教學(xué)中,教師可以采用兩個(gè)步驟使這個(gè)入門程序在實(shí)際教學(xué)中起到額外地提高學(xué)生學(xué)習(xí)積極性的效果:①用API編程方法實(shí)現(xiàn)“Hello world!”,然后引導(dǎo)學(xué)生把該程序源碼和基礎(chǔ)語(yǔ)言編程課同一程序的源碼量作比較,學(xué)生的第一反應(yīng)是“如此簡(jiǎn)單的功能為何需要如此冗長(zhǎng)的代碼來(lái)實(shí)現(xiàn)”;②指導(dǎo)學(xué)生在這個(gè)入門程序中加入5行鍵盤消息響應(yīng)代碼,實(shí)現(xiàn)隨機(jī)改變字符串顯示顏色的功能,使學(xué)生明白在框架的基礎(chǔ)上,API編程在Windows操作系統(tǒng)的支持下可以輕松實(shí)現(xiàn)復(fù)雜的顯示效果。通過(guò)這個(gè)驗(yàn)證性程序,學(xué)生可以直觀地了解API編程通過(guò)響應(yīng)來(lái)處理消息的基本方法和思想。
在學(xué)生API編程入門的基礎(chǔ)上,教師可以設(shè)置“字符移動(dòng)程序”設(shè)計(jì)性實(shí)驗(yàn),加強(qiáng)學(xué)生對(duì)Windows框架功能和鍵盤消息響應(yīng)兩個(gè)模塊的掌握;同時(shí),基于“分而治之”思想把游戲中角色對(duì)象的活動(dòng)劇情分解為“游戲?qū)ο箫@示”和“游戲?qū)ο筮\(yùn)動(dòng)”兩個(gè)功能,并且把游戲?qū)ο筮\(yùn)動(dòng)算法簡(jiǎn)化為字符移動(dòng)算法讓學(xué)生實(shí)踐。一方面,就算法機(jī)理而言,游戲?qū)ο蟮囊苿?dòng)和字符移動(dòng)是等價(jià)的,都需要通過(guò)選擇結(jié)構(gòu)控制對(duì)象的移動(dòng)方向,并且判斷對(duì)象的移動(dòng)是否碰觸邊界;另一方面,游戲?qū)ο箫@示屬于GDI編程的內(nèi)容,GDI編程技術(shù)作為Windows編程課的最主要內(nèi)容之一,需要配以較多的課時(shí)講解,因此,可以把游戲?qū)ο筮\(yùn)動(dòng)算法獨(dú)立成小設(shè)計(jì)實(shí)驗(yàn)引導(dǎo)學(xué)生先完成部分內(nèi)容,等完成GDI編程課堂講解后,再引導(dǎo)學(xué)生通過(guò)透明位圖技術(shù)實(shí)現(xiàn)游戲?qū)ο箫@示功能。學(xué)生把這兩個(gè)小設(shè)計(jì)實(shí)驗(yàn)中的算法結(jié)合起來(lái),就能實(shí)現(xiàn)平面游戲里的角色移動(dòng)功能。
在Windows編程中,客戶區(qū)顯示內(nèi)容的動(dòng)畫效果需要處理刷新顯示時(shí)的閃爍問(wèn)題。閃爍處理主要通過(guò)內(nèi)存(虛擬)設(shè)備描述表技術(shù)和InvalidateRect()函數(shù)參數(shù)的合理設(shè)置來(lái)完成;另外,還需要兼顧通過(guò)鼠標(biāo)或鍵盤控制產(chǎn)生游戲中對(duì)象的運(yùn)動(dòng)。在教學(xué)實(shí)踐中,這兩部分內(nèi)容可以通過(guò)“動(dòng)態(tài)直線繪制”小實(shí)驗(yàn)開展實(shí)踐,按照教學(xué)進(jìn)度,學(xué)生此時(shí)已經(jīng)完成了GDI編程和鼠標(biāo)鍵盤消息響應(yīng)的相關(guān)學(xué)習(xí)內(nèi)容,通過(guò)消息響應(yīng)和無(wú)閃爍顯示技術(shù)的結(jié)合,以一種簡(jiǎn)化的方式掌握游戲運(yùn)動(dòng)對(duì)象在輸入設(shè)備控制下刷新顯示無(wú)閃爍技術(shù)。
教師可設(shè)計(jì)獨(dú)立的“鼠標(biāo)點(diǎn)擊游戲”,幫助學(xué)生強(qiáng)化多種鼠標(biāo)消息的協(xié)調(diào)使用,強(qiáng)調(diào)使用計(jì)時(shí)計(jì)分和控制不同游戲?qū)ο蟪霈F(xiàn)的技巧。如果學(xué)生能在這個(gè)小游戲中添加游戲?qū)ο蠼巧顒?dòng)的劇情,就表明其已經(jīng)可以完成一個(gè)功能完整的游戲,因此,課程進(jìn)度過(guò)半時(shí)可以給學(xué)生布置一個(gè)綜合作業(yè):以“鼠標(biāo)點(diǎn)擊游戲”作為最終平面游戲的基礎(chǔ)框架,集成前期的游戲運(yùn)動(dòng)控制、游戲?qū)ο箫@示和閃爍消除處理模塊,像搭積木一樣設(shè)計(jì)實(shí)現(xiàn)一個(gè)平面游戲。
“菜單對(duì)話框”設(shè)計(jì)小實(shí)驗(yàn)是在“鼠標(biāo)點(diǎn)擊游戲”基礎(chǔ)上添加菜單、加速鍵、對(duì)話框、控件、光標(biāo)、圖標(biāo)等資源,這些元素不僅使最終的平面游戲具有Windows程序標(biāo)準(zhǔn)的界面和人機(jī)交互接口,還幫助學(xué)生學(xué)習(xí)Windows程序使用資源的原理和資源腳本文件的構(gòu)成。
分而治之的實(shí)踐教學(xué)實(shí)驗(yàn)設(shè)置方法旨在通過(guò)循序漸進(jìn)的方式幫助學(xué)生掌握知識(shí)要點(diǎn),為設(shè)計(jì)完成綜合實(shí)驗(yàn)打好基礎(chǔ)。教師通過(guò)對(duì)綜合實(shí)驗(yàn)進(jìn)行合理有效的分解,幫助學(xué)生掌握單個(gè)功能的實(shí)現(xiàn)方法,并且在此基礎(chǔ)上合成多個(gè)功能模塊、獨(dú)立設(shè)計(jì)和完成綜合實(shí)驗(yàn)。小實(shí)驗(yàn)是綜合實(shí)驗(yàn)的準(zhǔn)備,待小實(shí)驗(yàn)都逐一完成,綜合實(shí)驗(yàn)的完成也就水到渠成。教學(xué)實(shí)踐表明:分而治之的實(shí)踐教學(xué)實(shí)驗(yàn)設(shè)置可以幫助學(xué)生樹立學(xué)習(xí)信心和增強(qiáng)積極性;學(xué)生通過(guò)小實(shí)驗(yàn)不斷積累直至完成一個(gè)綜合實(shí)驗(yàn)的過(guò)程,也自然而然地實(shí)現(xiàn)了使學(xué)生掌握API編程思想方法的授課目標(biāo)。
[1]方昱春, 陳訊雷, 張景嶠. Windows編程課實(shí)踐教學(xué)探討[J]. 計(jì)算機(jī)教育, 2010(18): 153-155.
[2]杜曉晨, 馮海林, 徐愛俊. Windows程序設(shè)計(jì)的輔助實(shí)驗(yàn)平臺(tái)建設(shè)[J]. 中國(guó)信息技術(shù)教育, 2014(1): 109-111.
[3]程文志. 基于研究式學(xué)習(xí)的Windows編程教學(xué)實(shí)踐研究[J]. 湖南科技學(xué)院學(xué)報(bào), 2016(5): 98-99.