時(shí)間:2023-04-08 11:26:22
序論:好文章的創(chuàng)作是一個(gè)不斷探索和完善的過程,我們?yōu)槟扑]十篇程序設(shè)計(jì)論文范例,希望它們能助您一臂之力,提升您的閱讀品質(zhì),帶來更深刻的閱讀感受。
二、教法學(xué)法
1、教法:本節(jié)課的教學(xué),貫徹了啟發(fā)式教學(xué)原則。通過游戲引入新課,由教師引導(dǎo)學(xué)生進(jìn)行觀察思考和歸納總結(jié),同時(shí)充分發(fā)揮多媒體的功能,通過課件演示、具體實(shí)例的分析,使抽象的事物形象化,盡可能的通俗易懂,再配以恰當(dāng)?shù)恼n堂提問與練習(xí),讓學(xué)生分析、探究,更進(jìn)一步的加深理解。因此本節(jié)課采用的教學(xué)方法有:游戲、引導(dǎo)、演示、問答、練習(xí)等。2、學(xué)法:為了充分發(fā)揮學(xué)生的主觀能動作用,在上述教學(xué)方法的指導(dǎo)下,引導(dǎo)學(xué)生運(yùn)用“觀察”、“討論”、“練習(xí)”、“展示”等方法,徹底掌握if語句的使用,能夠自己分析問題,認(rèn)真思考,耐心實(shí)踐。讓學(xué)生不但要學(xué)會知識,更要會學(xué)知識,會用知識。
三、教學(xué)過程
1、新課引入:采用提問的方式,復(fù)習(xí)已學(xué)習(xí)過的知識,如選擇結(jié)構(gòu)的概念。并通過創(chuàng)設(shè)情境,引入新課內(nèi)容。先編寫一個(gè)程序引導(dǎo)學(xué)生參與游戲,游戲內(nèi)容是隨機(jī)抽取一個(gè)學(xué)生的學(xué)號作為當(dāng)天的幸運(yùn)星,程序會根據(jù)輸入號碼的大小,給出不同的提示。在學(xué)生被激發(fā)出興趣后立刻提出問題:為什么程序會根據(jù)輸入數(shù)據(jù)的大小,顯示出不同的提示信息?由此引入了新課:If語句。在這一環(huán)節(jié)中,主要應(yīng)用了游戲法、問答法等教學(xué)方法。不但引入了新課,更激發(fā)了學(xué)生的學(xué)習(xí)興趣。
2、新課講解:課程第一部分就是本節(jié)課的重點(diǎn),if語句的語法格式。為了突出重點(diǎn),加深學(xué)生的印象,講解前,首先用舉例法,通過表格顯示幾個(gè)常用的自然語言中進(jìn)行分支選擇的表達(dá)方法,如:如果明天是晴天,那么出去郊游,否則延期出行。然后引導(dǎo)學(xué)生對比幾個(gè)不同的示例仔細(xì)觀察,查找出語句中的共同點(diǎn)和不同點(diǎn),并通過課件中的動畫引導(dǎo)他們進(jìn)行思考分析,逐步歸納出這種句型的表達(dá)方式:如果條件成立,那么執(zhí)行動作1,否則執(zhí)行動作2。由此實(shí)現(xiàn)了由特定的自然語言表述,到通用的自然語言格式的過渡。再通過提問的方式引導(dǎo)學(xué)生說出if、then、else等單詞,用英文替換中文表述,結(jié)合VB命令格式中的符號約定,讓學(xué)生自己寫出VB中if語句的基本表示方式,if條件表達(dá)式then語句序列1else語句序列2,實(shí)現(xiàn)自然語言到vb語言的過渡。但這個(gè)格式并不完整,可再次讓學(xué)生思考,哪些項(xiàng)是必需的哪些是可以省略的。這里還是用表格對比法,讓學(xué)生看到,在自然語言中表述分支選擇時(shí),比較口語化的時(shí)候,有些語句是可以省略的。對應(yīng)到VB中,也是一樣,這樣就得出了最終的if語句語法格式,If<條件表達(dá)式>Then[<語句序列1>][Else<語句序列2>]。隨后,再對一些要注意的地方進(jìn)行講解說明。到此,本節(jié)課的重點(diǎn)部分也講述完畢,在這個(gè)過程中,主要采用了舉例、比較、類推、提問、講授、動畫等教學(xué)方法,整個(gè)過程采用了“自然語言表述實(shí)例自然語言通用句型VB語法格式”的教學(xué)順序,層層深入,符合特殊到一般、具體到抽象,由淺入深,由易到難的認(rèn)知規(guī)律,由此實(shí)現(xiàn)了重點(diǎn)的突出。If語句的用法是本節(jié)課的難點(diǎn),這里主要利用流程圖作為突破點(diǎn)的。首先,給學(xué)生講解如何根據(jù)語法格式繪制它的流程圖,通過PPT動畫,將語法構(gòu)造與流程圖一一對應(yīng)起來,使程序的執(zhí)行過程更加直觀,讓學(xué)生對程序代碼與流程圖的關(guān)系的理解更直白,更透徹。然后,通過舉例法,讓學(xué)生了解,如何將實(shí)際問題進(jìn)行分解,轉(zhuǎn)換為相應(yīng)的流程圖,再根據(jù)前面所學(xué),將流程圖轉(zhuǎn)換為具體代碼。課程進(jìn)行到這里,部分學(xué)生的注意力可能已經(jīng)開始分散,此時(shí)可進(jìn)行游戲的第一步解密,不但再次激發(fā)起學(xué)生的興趣,也進(jìn)一步幫學(xué)生理解如何分解問題,由問題到流程圖,再由流程圖到程序代碼。在難點(diǎn)的講解中,主要采用了動畫、對比、舉例等教學(xué)方法,通過由語法流程圖,構(gòu)建了語法與流程圖之間的對應(yīng)關(guān)系,再根據(jù)實(shí)際問題繪制流程圖,反推代碼,實(shí)現(xiàn)難點(diǎn)的突破。
3、課堂練習(xí):為了檢驗(yàn)學(xué)生對這部分知識點(diǎn)的掌握情況,通過布置習(xí)題,讓學(xué)生思考解答,針對學(xué)生的完成情況做出點(diǎn)評,糾正學(xué)生易犯的錯(cuò)誤,達(dá)到鞏固新知的目的。在這一環(huán)節(jié)中,主要采用練習(xí)法和糾錯(cuò)法等教學(xué)方法。
4、課后小結(jié):與學(xué)生一起回顧本節(jié)所學(xué)內(nèi)容,加深記憶和理解,完成知識的建構(gòu)。并告訴學(xué)生,將在第二學(xué)時(shí)繼續(xù)對游戲解密,完成整個(gè)程序的設(shè)計(jì),讓他們抱著期待的心情迎接下一節(jié)課。
2多態(tài)性抽象類與陰陽理論
面向?qū)ο蟪绦蛟O(shè)計(jì)的多態(tài)性中出現(xiàn)的抽象類,因其定義的某些函數(shù)(陽)是純虛函數(shù),沒有具體的代碼,實(shí)現(xiàn)不了常規(guī)的操作(缺失“陽”的功能),這種抽象類(含有“陰”卻無功能性的“陽”)不能夠生成對象,正符合“孤陰不生”之道。在抽象類中,接口類是一種典型的沒有數(shù)據(jù)(陰)的抽象類,它只含有純虛函數(shù)(無功能性的“陽”),從上面分析可知,該類型也是不能夠?qū)嵗瘜ο蟮?,正所謂“獨(dú)陽不長”。《易經(jīng)》中有“天地氤氳,萬物化醇,男女構(gòu)精,萬物化生”,在古籍《雪心賦》中更有“孤陰不生,獨(dú)陽不長”的名句[6]。句中的“天地”、“男女”更抽象一步可理解為“陰陽”,兩句都強(qiáng)調(diào)“陰陽”在萬物的構(gòu)成中相互依存的對立統(tǒng)一性。
1通信協(xié)議的制定
協(xié)議是用來管理通信的法規(guī),是網(wǎng)絡(luò)系統(tǒng)功能實(shí)現(xiàn)的基礎(chǔ)。由于DSP可以實(shí)現(xiàn)對網(wǎng)卡的直接操作,對應(yīng)于OSI網(wǎng)絡(luò)模型,網(wǎng)卡包含了物理層和數(shù)據(jù)鏈路層的全部內(nèi)容,因此,規(guī)定了數(shù)據(jù)鏈路層上數(shù)據(jù)幀封裝格式,就可以為基于DSP的局域網(wǎng)絡(luò)中任意站點(diǎn)之間的通信提供具體規(guī)范。因?yàn)橐蕴W(wǎng)是當(dāng)今最受歡迎的局域網(wǎng)之一,在以太網(wǎng)中,網(wǎng)卡用于實(shí)現(xiàn)802.3規(guī)程,其典型代表是Novell公司的NE2000和3COM公司的3C503等網(wǎng)卡,所以研究工作中的具體試驗(yàn)平臺是以DSP為核心構(gòu)成的以太局域網(wǎng),主要用于語音的實(shí)時(shí)通信,所使用的網(wǎng)卡為Novell公司的NE2000網(wǎng)卡。NE2000網(wǎng)卡的基本組成請見參考文獻(xiàn)[2],其核心器件是網(wǎng)絡(luò)接口控制器(NIC)DP8390。該器件有三部分功能:第一是IEEE802.3MAC(媒體訪問控制)子層協(xié)議邏輯,實(shí)現(xiàn)數(shù)據(jù)幀的封裝和解封,CSMA/CA(帶碰撞檢測功能的載波偵聽多址接入)協(xié)議以及CRC校驗(yàn)等功能;第二是寄存器堆,用戶對NE2000網(wǎng)卡通信過程的控制主要通過對這些寄存器堆中各種命令寄存器編程實(shí)現(xiàn);第三是對網(wǎng)卡上緩沖RAM的讀寫控制邏輯。DP8390發(fā)送和接收采用標(biāo)準(zhǔn)的IEEE802.3幀格式。IEEE802.3參考了以太網(wǎng)的協(xié)議和技術(shù)規(guī)范,但對數(shù)據(jù)包的基本結(jié)構(gòu)進(jìn)行了修改,主要是類型字段變成了長度字段。所以,以DSP為核心的局域網(wǎng)內(nèi)通信數(shù)據(jù)包基本格式如圖1所示。
DSP讀出數(shù)據(jù)包和打包從目的地址開始。目的地址用來指明一個(gè)數(shù)據(jù)幀在網(wǎng)絡(luò)中被傳送的目的節(jié)點(diǎn)地址。NE2000支持3種目的地址:單地址、組地址及廣播地址。單地址表示只有1個(gè)節(jié)點(diǎn)可以接收該幀信息;組地址表示最多可以有64個(gè)字節(jié)接收同一幀信息;而廣播地址則表示它可以被同一網(wǎng)絡(luò)中的所有節(jié)接收。源地址是發(fā)送幀節(jié)點(diǎn)的物理地址,它只能是單地址。目的地址和源地址指網(wǎng)卡的硬件地址,又稱物理地址。
在源地址之后的2個(gè)字節(jié)表示該幀的數(shù)據(jù)長度,只表示數(shù)據(jù)部分的長度,由用戶自己填入。數(shù)據(jù)字段由46~1500字節(jié)組成。大于1500字節(jié)的數(shù)據(jù)應(yīng)分為多個(gè)幀來發(fā)送;小于46字節(jié)時(shí),必須填充至46字節(jié)。原因有兩個(gè):一是保證從目的地址字段到幀校驗(yàn)字段長度為64字節(jié)的最短幀長,以便區(qū)分信道中的有效幀和無用信息;二是為了防止一個(gè)站發(fā)送短幀時(shí),在第一個(gè)比特尚未到達(dá)總線的最遠(yuǎn)端時(shí)就完成幀發(fā)送,因而在可能發(fā)生碰撞時(shí)檢測不到?jīng)_突信號。NE2000對接收到的從目的地址字段后小于64字節(jié)的幀均認(rèn)為是“碎片”,并予以刪除。在數(shù)據(jù)字段,根據(jù)系統(tǒng)的具體功能要求,用戶可以預(yù)留出若干個(gè)字節(jié)以規(guī)定相應(yīng)的協(xié)議,以便通信雙方依據(jù)這些字節(jié)中包含的信息實(shí)現(xiàn)不同的功能。
2基于DSP的網(wǎng)絡(luò)通信程序設(shè)計(jì)
如果基于網(wǎng)絡(luò)操作系統(tǒng),用戶可以利用一些軟件對網(wǎng)絡(luò)操作系統(tǒng)的支持,很容易地編寫出優(yōu)秀的網(wǎng)絡(luò)通信程序,但這些程序必須依附于網(wǎng)絡(luò)操作系統(tǒng)。而在DSP環(huán)境下,必須深入了解網(wǎng)絡(luò)接口控制器(NIC)的工作原理[2],通過對網(wǎng)絡(luò)直接編程,實(shí)現(xiàn)局域網(wǎng)內(nèi)任意站點(diǎn)之間的通信而完全拋開網(wǎng)絡(luò)操作系統(tǒng)。
DSP對網(wǎng)卡的通信過程控制就是DSP對DP8390中各種寄存器進(jìn)行編程控制,完成數(shù)據(jù)分組的正確發(fā)送和接收。DP8390的所有內(nèi)部寄存器都是8位,映像到4個(gè)頁面。每個(gè)頁面有16個(gè)可供讀寫的寄存器地址(RA=00H~0fH)。頁面的選擇由命令寄存器CA控制。第0頁寄存器用于收發(fā)過程,第1頁寄存器主要用于DP8390的初始化,第2頁寄存器則用于環(huán)路診斷。DSP對寄存器的操作是將寄存器作為DSP的端口設(shè)備,其實(shí)際物理端口地址(PPA)為網(wǎng)卡基本I/O端口地址(BIOA)與寄存器地址(RA)之和(即PPA=BIOA+RA)。應(yīng)注意的是,PPA與寄存器間并不存在一一對應(yīng)關(guān)系,對PPA的讀操作與寫操作并不一定是對同一寄存器進(jìn)行的,這種情況在第0頁尤其明顯。用戶數(shù)據(jù)分組在DSP和網(wǎng)卡交互是通過網(wǎng)卡的數(shù)據(jù)端口實(shí)現(xiàn)的,既可以用DMA方式也可以用PIO方式讀入數(shù)據(jù)分組或?qū)?shù)據(jù)分組送至網(wǎng)卡RAM緩沖區(qū)。在本系統(tǒng)中,DSP采用DMA方式對網(wǎng)卡進(jìn)行數(shù)據(jù)讀寫。網(wǎng)卡的數(shù)據(jù)端口地址(NDPA)為網(wǎng)卡基本I/O地址(BIOA)加偏移地址10H(即NDPA=BIOA+10H)。
網(wǎng)卡通信過程控制可分為網(wǎng)卡初始化、接收控制和發(fā)送控制。下面分別予以討論。
2.1網(wǎng)卡初始化
網(wǎng)卡初始化的主要任務(wù)是設(shè)置所需的寄存器狀態(tài),確定發(fā)送和接收條件,并對網(wǎng)卡緩沖區(qū)RAM進(jìn)行劃分,建立接收和發(fā)送緩沖環(huán)。具體過程請參閱參考文獻(xiàn)[2]。需要說明的是,每一塊網(wǎng)卡被賦予一個(gè)物理地址,以便通信站點(diǎn)的標(biāo)識。這個(gè)物理地址存在網(wǎng)卡的PROM(存儲地址為0000~0005H)六個(gè)單元中,在網(wǎng)卡初始化時(shí),通過遠(yuǎn)程DMA讀入DSP內(nèi)存中,并送入網(wǎng)卡物理地址寄存器。在一步的意義在于:一方面,如果能正確讀出網(wǎng)卡的物理地址,則說明網(wǎng)卡硬件基本沒有問題,網(wǎng)卡的上電復(fù)位和DSP對網(wǎng)卡的初始化順利通過;另一方面,這個(gè)物理地址可以用于DSP網(wǎng)絡(luò)系統(tǒng)中的點(diǎn)名、包的過濾丟棄等服務(wù),也就是說,在鏈路層根據(jù)數(shù)據(jù)幀攜帶的源地址和目的地址確定數(shù)據(jù)報(bào)從哪里來,是否接收或丟棄。網(wǎng)卡初始化時(shí)另一個(gè)重要的工作就是接收緩沖環(huán)的設(shè)置,為了有效利用緩沖區(qū),NIC將接收緩沖區(qū)RAM構(gòu)成環(huán)形緩沖結(jié)構(gòu),如圖2所示。
接收緩沖區(qū)RAM分成多個(gè)256字節(jié)的緩沖區(qū),N個(gè)(N最大為256)這樣的緩沖區(qū)通過指針控制鏈接成一條邏輯上的緩沖環(huán)。緩沖環(huán)的開始頁面地址存入PSTART寄存器,環(huán)頁面結(jié)束地址存入PSTOP寄存器。PSTART和PSTOP確定了接收緩沖環(huán)的大小和邊界。為便于緩沖環(huán)讀寫操作,還需要2個(gè)指針:當(dāng)前頁面指針CURR和邊界指針BNRY。CURR確定下一包放在何處,起著緩沖環(huán)寫頁面指針作用;BNRY指向未經(jīng)DSP取走處理最早到達(dá)的數(shù)據(jù)包起始頁面,新接收的數(shù)據(jù)包不可將其覆蓋,起著緩沖環(huán)讀頁面指針的作用。也就是說,CURR可以告訴用戶網(wǎng)卡接收的數(shù)據(jù)分組當(dāng)前放到了什么位置,而BNRY則用于確定DSP讀緩沖環(huán)到了什么地方。由于接收緩沖區(qū)為環(huán)形結(jié)構(gòu),BNRY和CURR相等時(shí),環(huán)緩沖區(qū)可能滿也可能空。為了使NIC能辨別這兩種狀態(tài),規(guī)定當(dāng)BNRY等于CURR時(shí),才認(rèn)為環(huán)緩沖區(qū)滿;當(dāng)緩沖區(qū)空時(shí),CURR比BNRY指針值大1。因此,初始化時(shí)設(shè)置:BNRY=PSTART,CURR=PSTART+1。這時(shí)讀寫指針不一致,為了保證正確的讀寫操作,引入一軟件指針NEXTPK指示下一包起始頁面。顯然,初始化時(shí)NEXTPK=CURR。這時(shí),緩沖環(huán)的讀指針對NEXTPK,而BNRY只是存儲分組緩沖區(qū)的起始頁面邊界指示,其值為NEXTPK-1。
2.2接收控制過程
DSP完成對DP8390的初始化后,網(wǎng)卡就處于接收狀態(tài),一旦收到分組,就自動執(zhí)行本地DMA,將NIC中FIFO數(shù)據(jù)送入接收緩沖環(huán),然后向主機(jī)申請“數(shù)據(jù)分組接收到”中斷請求。DSP如果響應(yīng)中斷,則啟動網(wǎng)卡遠(yuǎn)程DMA讀,將網(wǎng)卡緩沖區(qū)中的數(shù)據(jù)分組讀入學(xué)生機(jī)存儲區(qū),然后對接收緩沖環(huán)CURR、NEXTPK、BNRY指針內(nèi)容進(jìn)行修改,以便網(wǎng)卡能從網(wǎng)上正確接收后續(xù)分組。DSP響應(yīng)網(wǎng)卡接收中斷后,接收控制過程如下:
①設(shè)置遠(yuǎn)程DMA的起始地址;RSAR0=00H,RSAR1=Nextpk。
②設(shè)置遠(yuǎn)程DMA操作的字節(jié)數(shù),這個(gè)長度在46~1500字節(jié)范圍內(nèi)根據(jù)具體要求自己確定。
③0AH送命令寄存器CR,啟動遠(yuǎn)程DMA讀。
④從網(wǎng)卡數(shù)據(jù)端口依序讀入數(shù)據(jù)分組,注意,最先讀入的4字節(jié)非數(shù)據(jù)分組內(nèi)容,第1字節(jié)為接收狀態(tài),第2字節(jié)為下一包頁地址指針,3與4字節(jié)為接收字節(jié)數(shù)。第2字節(jié)內(nèi)容應(yīng)該送入Nextpk,其它字節(jié)根據(jù)用戶要求處理。
⑤修改邊界指針BNRY=Nextpk-1。
⑥清除遠(yuǎn)程DMA字節(jié)數(shù)寄存器RBCR0和RBCR1。
2.3發(fā)送控制過程
DSP先執(zhí)行遠(yuǎn)程DMA寫操作,將內(nèi)存中的數(shù)據(jù)分組傳至網(wǎng)卡發(fā)送緩沖區(qū),然后啟動發(fā)送命令進(jìn)行數(shù)據(jù)分組發(fā)送。發(fā)送控制過程如下:
①設(shè)置遠(yuǎn)程DMA的起始地址為網(wǎng)卡發(fā)送緩沖區(qū)起始地址;
②設(shè)置遠(yuǎn)程DMA操作的字節(jié)數(shù);
③12H送命令寄存器CR,啟動遠(yuǎn)程DMA寫;
④依序送出數(shù)據(jù)分組至網(wǎng)卡發(fā)送緩沖區(qū);
⑤清除遠(yuǎn)程DMA字節(jié)數(shù)寄存器;
⑥設(shè)置發(fā)送字節(jié)數(shù)寄存器TBCR0和TBCR1;
⑦12H送命令寄存器CR,啟動數(shù)據(jù)分組發(fā)送。
3發(fā)送方發(fā)送頻率的控制
發(fā)送方發(fā)送頻率的正確控制主要保護(hù)兩點(diǎn):一是有一個(gè)最小發(fā)送時(shí)間間隔,否則會因?yàn)榻邮辗讲荒芗皶r(shí)接收而導(dǎo)致系統(tǒng)癱瘓;二是發(fā)送頻率能夠足具體的功能實(shí)現(xiàn)要求。譬如在語音的實(shí)時(shí)通信中,發(fā)送頻率就取決于聲卡的采樣頻率。在8kHz采樣頻率時(shí),聲卡每秒鐘采樣8000字節(jié),采用1024字節(jié)需用時(shí)128ms,如果通信協(xié)議規(guī)定發(fā)送1次傳送1024字節(jié)有效數(shù)據(jù),則必須每128ms發(fā)送一次才能保證緩沖區(qū)有新數(shù)據(jù)待發(fā)送,也才能保證接收方有新數(shù)據(jù)播放。128ms是一個(gè)理論計(jì)算數(shù)值,在實(shí)際的操作中采樣速度和發(fā)送頻率之間總是不能完全匹配,而存放數(shù)據(jù)的緩沖區(qū)大小是有限的,如果沒有良好的控制技巧來實(shí)現(xiàn)正確發(fā)送,就會造成聲音抖動和延時(shí)。解決的辦法是雙緩沖技術(shù)和雙指針控制,并且根據(jù)采樣速度和發(fā)送頻率之間的匹配情況送入不同的發(fā)送通信進(jìn)行處理后發(fā)送。正確發(fā)送的含義有兩方面,一是每次發(fā)送的都是新數(shù)據(jù),二是能滿足接收方總在播放新數(shù)據(jù)的需求。
4接收方防止數(shù)據(jù)包的丟失
(二)“多層次遞進(jìn)式”項(xiàng)目設(shè)計(jì)實(shí)驗(yàn)項(xiàng)目設(shè)計(jì)采用多層次、遞進(jìn)式方式。以學(xué)生為本,從簡單到復(fù)雜、從單一到綜合、從驗(yàn)證型到創(chuàng)新型,循序漸進(jìn)地把教學(xué)內(nèi)容和能力培養(yǎng)體現(xiàn)在項(xiàng)目中。將課程實(shí)驗(yàn)分為基礎(chǔ)驗(yàn)證型、綜合設(shè)計(jì)型和實(shí)踐創(chuàng)新型三個(gè)層次,根據(jù)知識模塊設(shè)計(jì)相應(yīng)項(xiàng)目引導(dǎo)課程的教和學(xué),并有側(cè)重點(diǎn)地體現(xiàn)CDIO能力的培養(yǎng),項(xiàng)目列表及對應(yīng)CDIO能力培養(yǎng)如表1所示。凝練優(yōu)秀的教學(xué)型工程項(xiàng)目是基于CDIO項(xiàng)目學(xué)習(xí)模式成功的關(guān)鍵之一。因此表1中所列項(xiàng)目都是經(jīng)過教學(xué)實(shí)踐反復(fù)修改完善的。實(shí)踐創(chuàng)新型實(shí)驗(yàn)與軟件工程、數(shù)據(jù)庫課程相結(jié)合,采用一個(gè)完整的項(xiàng)目做載體貫穿始終。這樣設(shè)計(jì)實(shí)驗(yàn),首先可以將知識和課程有機(jī)結(jié)合,有助于學(xué)生明確它們在解決復(fù)雜工程問題中的關(guān)聯(lián)和作用;然后減少了課程之間銜接的重復(fù)、冗余;也減少了學(xué)生重復(fù)完成項(xiàng)目的工作量。在實(shí)踐創(chuàng)新型項(xiàng)目的凝練過程中,充分考慮學(xué)生熟悉并感興趣的項(xiàng)目,一類是校內(nèi)項(xiàng)目,如網(wǎng)上選課系統(tǒng),校園二手商品交易網(wǎng)站等,這樣不僅能解決教師的實(shí)際需求,也能滿足學(xué)生通過實(shí)際項(xiàng)目開發(fā)Web開發(fā)技能的培養(yǎng);另一類是自主選擇項(xiàng)目,可以提高學(xué)生項(xiàng)目的開發(fā)熱情和興趣。
(三)基于CDIO的教學(xué)實(shí)施在具體教學(xué)過程中,按照知識模塊為教學(xué)單位進(jìn)行。32學(xué)時(shí)的理論授課和作業(yè)結(jié)合,并輔以小測試加強(qiáng)理論知識的鞏固。每個(gè)模塊的理論授課完畢完成對應(yīng)的實(shí)驗(yàn)項(xiàng)目,共20學(xué)時(shí),加入反思及答辯環(huán)節(jié),最后進(jìn)行期末考試。理論教學(xué)采用多種教學(xué)方式。對緒論性內(nèi)容、面向?qū)ο蟪绦蛟O(shè)計(jì)等有一定難度的理論知識,依然采用講授教學(xué)方式;對Windows應(yīng)用開發(fā),采用啟發(fā)式案例教學(xué)法,以Windows系統(tǒng)自帶記事本為例,逐漸講解各種控件的應(yīng)用及開發(fā)流程;對Web技術(shù)開發(fā),綜合案例教學(xué)和任務(wù)驅(qū)動教學(xué),對已經(jīng)完成的“工程訓(xùn)練中心選課系統(tǒng)”的項(xiàng)目進(jìn)行精練,作為授課案例,詳細(xì)講解需求分析過程,然后引導(dǎo)學(xué)生概要設(shè)計(jì)、詳細(xì)設(shè)計(jì),并以具體模塊為例進(jìn)行程序編碼及調(diào)試運(yùn)行。整個(gè)授課環(huán)節(jié),板書和多媒體相結(jié)合,現(xiàn)場程序編寫及調(diào)試,不僅幫助學(xué)生直觀理解概念、原理和方法,也可以提高學(xué)生的興趣,形成以教師為主導(dǎo),學(xué)生為主體的教學(xué)模式。實(shí)驗(yàn)教學(xué)不同層次實(shí)驗(yàn)區(qū)別實(shí)施。對驗(yàn)證型實(shí)驗(yàn)和綜合設(shè)計(jì)型實(shí)驗(yàn),每人單獨(dú)完成,旨在通過實(shí)驗(yàn)使學(xué)生深入掌握基本知識、原理、編程的基本技巧,實(shí)驗(yàn)過程中老師及時(shí)解決學(xué)生所遇問題并掌握進(jìn)展情況,每次實(shí)驗(yàn)課的最后半個(gè)小時(shí),驗(yàn)收部分學(xué)生的實(shí)驗(yàn)以督促學(xué)生學(xué)習(xí);并展示往屆有代表性的實(shí)驗(yàn)報(bào)告和程序,規(guī)范學(xué)生實(shí)驗(yàn)報(bào)告的撰寫,激勵學(xué)生互相學(xué)習(xí),共同進(jìn)步。對實(shí)踐創(chuàng)新型實(shí)驗(yàn),學(xué)生4~6人為單位形成開發(fā)小組,一人任組長,進(jìn)行角色劃分。團(tuán)隊(duì)按照軟件工程的開發(fā)步驟,進(jìn)行需求分析、概要設(shè)計(jì)及詳細(xì)設(shè)計(jì)和測試,撰寫各個(gè)階段的開發(fā)文檔,要求團(tuán)隊(duì)共同參與項(xiàng)目答辯。各層次實(shí)驗(yàn)的考核都設(shè)有答辯和反思環(huán)節(jié)。反思不僅可以啟發(fā)學(xué)生積極進(jìn)行批判性思考來深化課程學(xué)習(xí)目標(biāo),而且也有助于學(xué)生進(jìn)行深層次的學(xué)與問,引導(dǎo)學(xué)生主動學(xué)習(xí)的興趣。
2溫濕度模糊控制器設(shè)計(jì)
2.1輸入與輸出變量的模糊化
根據(jù)溫室大棚的實(shí)際狀況,以溫濕度偏差及其偏差變化率為輸入變量,各輸入變量的模糊化信息如表1所示。結(jié)合研究對象實(shí)際情況,既考慮控制規(guī)則的靈活性又兼顧簡單易行。表1中,4個(gè)輸入變量模糊集均取為A,A為{NB,NS,ZE,PS,PB};模糊論域均取為B,B為{-4,-3,-2,-1,0,1,2,3,4}。模糊控制器的輸出控制變量為前窗、天窗、后窗、遮陽簾、通風(fēng)機(jī)、加濕器和加熱器。這7個(gè)變量均為開關(guān)量,只有開和關(guān)(0/1)兩種狀態(tài),分別用符號u1、u2、u3、u4、u5、u6、u7表示這7個(gè)變量。
2.2隸屬函數(shù)的確定
由于三角形隸屬度函數(shù)在輸入值變化時(shí)比正態(tài)分布或高斯型具有更高的靈活性[6],因此本研究中溫濕度偏差與偏差變化率均選取三角形隸屬度函數(shù)。圖4為各輸入變量的隸屬度函數(shù),選擇的模糊集寬度為4。因?yàn)閷挾冗^小會造成部分區(qū)間空缺,可能找不到相應(yīng)的控制規(guī)則,收斂性不好;寬度過大會造成控制規(guī)則的重疊部分過多,相互間影響加大并且響應(yīng)速度也變慢[7]。根據(jù)隸屬度函數(shù)對輸入變量量化為9個(gè)等級,其相應(yīng)的隸屬度賦值如表2所示。
2.3模糊控制規(guī)則的制定
模糊控制規(guī)則的形成實(shí)質(zhì)上是把操作者的經(jīng)驗(yàn)或?qū)<业闹R和經(jīng)驗(yàn)進(jìn)行凝練得到的若干條模糊控制規(guī)則[8]。經(jīng)對實(shí)際溫室控制系統(tǒng)的研究,發(fā)現(xiàn)溫濕度間存在一定的耦合性,即當(dāng)通過某一執(zhí)行機(jī)構(gòu)改變溫度(濕度)時(shí)濕度(溫度)也會發(fā)生變化,因此在制定模糊控制規(guī)則時(shí)就要滲透解耦的思想?;诖耍瑢?種執(zhí)行機(jī)構(gòu)的開關(guān)狀態(tài)做如下考慮:u1、u2和u3每打開一個(gè)設(shè)備降溫和降濕效果增強(qiáng)一點(diǎn),但速度較慢;u5開通后其降溫和降濕速度明顯比u1、u2、u3快;u4降溫作用明顯,對濕度基本無影響;u6主要起加濕作用,降溫為次要作用;u7主要為增溫作用,降濕為次要作用。研究中制定了溫度與濕度之間、溫度變化率與濕度變化率之間的兩個(gè)模糊控制規(guī)則表,在此僅列出溫度與濕度之間的模糊控制規(guī)則,如表3所示。表3中,U為u1到u7這7個(gè)變量的開關(guān)狀態(tài),開用“1”表示,關(guān)用“0”表示。
2.4反模糊化
模糊控制器輸出的是模糊語言不同取值的一種組合,由于被控對象只接受一個(gè)精確的控制量,因此需要從組合中判決出一個(gè)精確的控制量,這也就是反模糊化的過程[9]。常用的判決方法有重心法、最大隸屬度法和中位數(shù)法等,本研究采用重心法計(jì)算模糊控制輸出的精確控制量。其具體表達(dá)式為u'=∑nj=1ωjμ(ωj)/∑nj=1μ(ωj)(1)其中,n為模糊變量個(gè)數(shù),ωj為模糊變量,μ(ωj)是對應(yīng)模糊變量的隸屬度。本系統(tǒng)反模糊化的具體過程:首先溫濕度誤差或其誤差變化率經(jīng)量化后得到相應(yīng)的量化等級,根據(jù)量化等級查詢各個(gè)執(zhí)行機(jī)構(gòu)在控制規(guī)則表中對應(yīng)的控制規(guī)則并使其激活。然后,由式(1)計(jì)算各個(gè)執(zhí)行機(jī)構(gòu)的輸出值,計(jì)算結(jié)果等于0.5時(shí),執(zhí)行機(jī)構(gòu)保持原來狀態(tài);計(jì)算結(jié)果大于0.5時(shí),執(zhí)行機(jī)構(gòu)開;計(jì)算結(jié)果小于0.5時(shí),執(zhí)行機(jī)構(gòu)關(guān)?;谶@種思想,可建立各執(zhí)行機(jī)構(gòu)的模糊控制查詢表,放在內(nèi)存中,編寫相應(yīng)的PLC程序即可實(shí)現(xiàn)模糊控制器對執(zhí)行機(jī)構(gòu)的實(shí)時(shí)控制。
3溫濕度模糊控制PLC程序設(shè)計(jì)
溫濕度模糊控制PLC程序包括輸入量的采樣與模糊化程序、量化等級程序、模糊控制查詢程序、執(zhí)行機(jī)構(gòu)控制程序和預(yù)警程序等[10],在此僅介紹有關(guān)輸入采樣、誤差的計(jì)算和模糊控制查詢的部分程序。本研究是在STEP7編程環(huán)境下完成的模糊控制程序。
3.1輸入量采樣和ET/EH計(jì)算程序
研究中應(yīng)用的溫濕度傳感器的變送單元分別取0~50℃、0~100%RH,線性對應(yīng)電流均為4~20mA,因此在編寫PLC程序前需把溫濕度的值與PLC中的數(shù)字量關(guān)系建立起來。具體過程如下:以溫度為例,用I表示電流值,T表示溫度值,X表示實(shí)時(shí)溫度轉(zhuǎn)換為PLC中的數(shù)字量值。由于0~50℃與4~20mA對應(yīng),4~20mA又與PLC中的數(shù)字量為6400~32000對應(yīng),因此可得曲線方程如式(2)與式(3)所示。根據(jù)式(4)即可計(jì)算0~50℃對應(yīng)PLC內(nèi)部的數(shù)字量值。如22℃對應(yīng)數(shù)字量值為17664。同理,可求得濕度值與PLC中數(shù)字量的對應(yīng)關(guān)系如式(5)所示。其中,H表示濕度。下面以溫度為22℃和濕度為70%RH的情況編寫相應(yīng)的PLC程序,70%RH對應(yīng)的數(shù)字量為24320。
3.2模糊控制查詢程序
由反模糊化得到的模糊控制查詢表實(shí)質(zhì)上是一個(gè)9×9的二維數(shù)組,存在以VW200開始的81個(gè)字單元中。在此把數(shù)組的首地址指針設(shè)定為VD48,根據(jù)(VW20×9+WV18)×2即可計(jì)算偏移值,在查詢表中定位并把相應(yīng)值賦予WV28。
4系統(tǒng)實(shí)際運(yùn)行測試
控制系統(tǒng)投入運(yùn)行后,任選某一天對控制效果進(jìn)行實(shí)際測試。測試時(shí)的起始溫度和濕度分別為32℃和52%RH,控制設(shè)定值分別為22℃和70%RH。對溫濕度采樣時(shí)間間隔均為5min,根據(jù)采集數(shù)據(jù)繪制的曲線如圖5所示。由圖5可知30min左右時(shí)溫濕度值均達(dá)到設(shè)定值,再經(jīng)10min左右溫濕值即達(dá)到預(yù)設(shè)的穩(wěn)定狀態(tài)值,達(dá)到了較滿意的控制效果。控制系統(tǒng)達(dá)到穩(wěn)態(tài)的時(shí)間可通過增減有關(guān)設(shè)備進(jìn)行調(diào)節(jié)。
(1)程序應(yīng)最大限度的調(diào)用前期設(shè)計(jì)數(shù)據(jù),減少人工輸入,程序需通過制作數(shù)據(jù)接口,從前期設(shè)計(jì)軟件中有選擇性的調(diào)入全橋總信息及每個(gè)墩臺的墩臺號、墩臺里程、基礎(chǔ)類型、初始樁長、基頂基底標(biāo)高、基礎(chǔ)尺寸、樁基布置等信息,減少設(shè)計(jì)者重復(fù)輸入,同時(shí)降低操作錯(cuò)誤率。(2)樁基展開布置時(shí)要求對每根樁的數(shù)據(jù)進(jìn)行操作,現(xiàn)有的每個(gè)橋墩樁基數(shù)據(jù)中樁基數(shù)據(jù)需通過一定轉(zhuǎn)換,以圖形形式清晰明了的展現(xiàn)出來,同時(shí)還能夠提供一定格式的數(shù)據(jù)供其他程序進(jìn)行計(jì)算等。(3)設(shè)計(jì)者對全橋每個(gè)橋墩基礎(chǔ)數(shù)據(jù)修改編輯后,程序需將數(shù)據(jù)存儲起來,以備進(jìn)行下一步操作和下次查詢。但由于全橋信息量較大,需研究有效的數(shù)據(jù)存儲形式,以便設(shè)計(jì)者能快速調(diào)用和修改。
1.2數(shù)據(jù)在不同的坐標(biāo)系進(jìn)行坐標(biāo)轉(zhuǎn)換
(1)在程序默認(rèn)樁坐標(biāo)、地質(zhì)提供的樁坐標(biāo)以及橋梁樁基計(jì)算程序樁坐標(biāo)3者之間進(jìn)行轉(zhuǎn)換,提供給設(shè)計(jì)者便捷的修改方式,滿足各種不同的坐標(biāo)系統(tǒng)之間進(jìn)行靈活的的轉(zhuǎn)換。(2)地質(zhì)展開剖面圖的不確定性決定了基礎(chǔ)展開形式的多樣性,樁與樁之間的相互位置關(guān)系變化多樣,程序應(yīng)能適用各種不同的情況,快速計(jì)算各樁位之間的相互位置關(guān)系。
1.3程序的繪圖及讀圖功能
(1)根據(jù)地質(zhì)剖面圖的展開路徑繪制基礎(chǔ)展開布置圖時(shí),程序通過讀取地質(zhì)剖面圖中的信息,校核地質(zhì)剖面圖的比例,定位每個(gè)鉆孔的位置,根據(jù)每根樁與各鉆孔之間的位置關(guān)系來繪制基礎(chǔ)展開布置圖。展開圖能按照一定的縱橫向比例繪制,每個(gè)樁位標(biāo)明相應(yīng)的編號等。程序應(yīng)根據(jù)地質(zhì)剖面圖的形式,靈活采用單點(diǎn)定位和多點(diǎn)定位,同一樁基靈活拆分,提供多樣的繪圖方式。(2)程序需對地質(zhì)柱狀圖逐孔進(jìn)行識別提取各地層信息后,根據(jù)專業(yè)要求將地層詳細(xì)的描述轉(zhuǎn)換到地質(zhì)剖面圖中,完善各地層的地質(zhì)描述。根據(jù)縱橫向比例將地層名稱、承載力值等描述添加到地質(zhì)剖面圖中。(3)程序應(yīng)有完善的圖面清理及圖面排版布局功能,以及樁長反讀及校核功能便于進(jìn)行后續(xù)計(jì)算等。
1.4橋梁基礎(chǔ)的數(shù)量計(jì)算及匯總功能
(1)程序應(yīng)根據(jù)全橋工程數(shù)量計(jì)算模板衍生出單墩數(shù)量計(jì)算模板進(jìn)行展開后的樁基計(jì)算,以統(tǒng)一數(shù)量計(jì)算格式,提高程序自動轉(zhuǎn)換、批量處理效率。(2)根據(jù)每根樁的鉆孔資料進(jìn)行各鉆孔土層進(jìn)行分析,歸類匯總各土層的數(shù)量,盡可能精確計(jì)算單墩的基礎(chǔ)數(shù)量。(3)程序應(yīng)將全橋各橋墩的單墩基礎(chǔ)數(shù)量進(jìn)行匯總,生成全橋總數(shù)量。
2關(guān)鍵技術(shù)
2.1數(shù)據(jù)接口及轉(zhuǎn)換
(1)基礎(chǔ)的設(shè)計(jì)需要前期數(shù)據(jù)的調(diào)出量大,種類雜,數(shù)據(jù)調(diào)入調(diào)出時(shí)盡量減少對象中數(shù)據(jù)轉(zhuǎn)換,采用數(shù)組進(jìn)行內(nèi)部運(yùn)算完成后,再將運(yùn)算結(jié)果與表格進(jìn)行對接,將對表格對象的操作次數(shù)降低到最少,提高運(yùn)行速度。(2)設(shè)定3套坐標(biāo)系統(tǒng)進(jìn)行靈活的轉(zhuǎn)換,將數(shù)據(jù)圖形化,直觀化,如圖1所示。樁基礎(chǔ)設(shè)計(jì)中,地質(zhì)樁號又能根據(jù)實(shí)際鉆孔路徑任意編排,樁間距能迅速計(jì)算導(dǎo)出,對部分?jǐn)?shù)據(jù)進(jìn)行監(jiān)控,當(dāng)數(shù)據(jù)修改時(shí),能迅速響應(yīng),調(diào)出數(shù)據(jù),展示圖形,操作相當(dāng)方便,顯示也很直觀明了。程序計(jì)算完成后,能自動進(jìn)行存儲,數(shù)據(jù)更新及時(shí),靈活方便。任意路徑展開樁基的計(jì)算,如圖2所示。對于樁基礎(chǔ),程序處理流程如圖3所示。
2.2樁基坐標(biāo)轉(zhuǎn)換的實(shí)現(xiàn)
前期的數(shù)據(jù)收集后,通過校核補(bǔ)齊后轉(zhuǎn)換成程序默認(rèn)的坐標(biāo)系統(tǒng),樁號順序按照從上到下和從左到右的順序編排的開來,這樣編排符合一般的標(biāo)號習(xí)慣。橋梁設(shè)計(jì)軟件中樁排列一般是按x坐標(biāo)從小到大,然后y坐標(biāo)從小到大的順序排列的,這種排列方式便于程序計(jì)算。地質(zhì)專業(yè)進(jìn)行地質(zhì)鉆孔時(shí),形成相應(yīng)鉆孔順序和坐標(biāo)系統(tǒng)。于是程序內(nèi)部需要建立3套坐標(biāo)系統(tǒng)的相互關(guān)系網(wǎng),以便能快速在各坐標(biāo)系統(tǒng)之間進(jìn)行轉(zhuǎn)換,快速與外部數(shù)據(jù)進(jìn)行導(dǎo)入導(dǎo)出操作。程序內(nèi)部各坐標(biāo)之間的轉(zhuǎn)換關(guān)系如圖4所示。繪制展布圖時(shí),承臺、樁及地層信息等在CAD圖中的縱橫向定位是比較棘手的問題??v向定位主要有每根樁的樁頂高程、樁長、樁底高程、地層描述信息等,橫向定位主要是樁與鉆孔之間關(guān)系、樁與樁之間的關(guān)系定位等??v向定位關(guān)鍵是確定定位標(biāo)尺后計(jì)算高程標(biāo)定縱向元素,橫向定位的關(guān)鍵是定位鉆孔按繪圖比例計(jì)算距離在定位樁位。樁基縱向定位的基本的流程如圖5所示。
2.3添加地質(zhì)鉆孔信息
地層信息由地質(zhì)鉆孔柱狀圖提取后展示到地質(zhì)剖面圖中前,需要對地質(zhì)柱狀圖進(jìn)行分析過濾提取各地層信息,再在地質(zhì)剖面圖中定位到鉆孔編號后根據(jù)地層上下界面高程縱向定位到各地層中去。添加地質(zhì)鉆孔信息后如圖7所示。2.5單墩樁基及全橋樁基工程數(shù)量的計(jì)算計(jì)算單墩樁基工程數(shù)量時(shí),程序通過全橋工程數(shù)量表衍生出單墩工程數(shù)量表,保持基礎(chǔ)工程數(shù)量計(jì)算相關(guān)工作表中各項(xiàng)目的完整,利用其固定性而又適應(yīng)其靈活性,繼承全橋工程數(shù)量表的計(jì)算方法和特點(diǎn)。設(shè)計(jì)者對單墩工程數(shù)量計(jì)算完成后,程序?qū)⒏鞫諗?shù)量匯總起來,再經(jīng)過設(shè)計(jì)者復(fù)核,程序再將其與全橋工程數(shù)量整合在一起。其間的計(jì)算步驟均允許設(shè)計(jì)者參與修改,同時(shí)程序進(jìn)行邏輯性校核等。匯總各墩數(shù)據(jù)到全橋工程數(shù)量表中的流程圖如圖8所示。
Abstract:VisualBasicprogrammingasapublicnon-professionalcomputer-basedlessons,theoryandpracticestrong,andteachingdifficult.Thearticleonhowtoimprovethequalityofteachingandtrainingstudentsinanintegratedapplicationdevelopmentcapabilitiesandexplorereformsweremade.
Keywords:VB;programming;reform;practice
1引言
VisualBasic(下面簡稱VB)程序設(shè)計(jì)是我校非計(jì)算機(jī)專業(yè)學(xué)生的必修課,然而VB語言枯燥、難以理解,學(xué)生缺乏相應(yīng)的知識背景,導(dǎo)致學(xué)生對這門課有恐懼心理,缺乏興趣。這就要求我們教師在教學(xué)中分析、摸索出一些較為行之有效的教學(xué)方法,才有可能培養(yǎng)學(xué)生程序設(shè)計(jì)能力,掌握一門技能,激發(fā)學(xué)生對程序設(shè)計(jì)的興趣。筆者在近幾年的教學(xué)實(shí)踐中進(jìn)行了如下改革探索,取得了良好的教學(xué)效果。
2教學(xué)改革與實(shí)施
2.1對課本原有知識進(jìn)行整合,激發(fā)學(xué)生的學(xué)習(xí)興趣
大部分的教材總是先講VB語言的基本語法,然后再講VB中對象的使用。但在講授時(shí)不宜將兩者分開,要把VB面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,事件驅(qū)動的編程機(jī)制貫穿于整個(gè)教學(xué)過程中。VB中的對象主要用于構(gòu)建界面,而具體程序功能的實(shí)現(xiàn)則要編寫代碼行,因此任何一個(gè)完整的應(yīng)用程序都不可能只用對象或只用語法。這兩塊內(nèi)容可進(jìn)行穿插講解。這樣就避免了讓學(xué)生在毫無知識背景的情況下去理解抽象難懂的概念,挫傷他們編程的積極性。在教學(xué)過程中,我始終堅(jiān)持以學(xué)生已有的知識程度為基礎(chǔ),打破原有的以課本知識的邏輯結(jié)構(gòu)為順序組織課堂教學(xué)的模式,先不講基本概念,改用從簡單的實(shí)例人手,通過讓學(xué)生觀看、模仿,在實(shí)際操作中去探究和領(lǐng)悟這些概念,并適時(shí)地加以歸納總結(jié),讓學(xué)生在輕松愉快的氣氛中接受新知識。比如,在講到循環(huán)結(jié)構(gòu)中DO——LOOP語句和FOR——NEXT語句的用法時(shí),我用DO——LOOP語句的4種形式和FOR——NEXT語句實(shí)現(xiàn)求解N!的過程,讓學(xué)生去觀察、領(lǐng)悟它們的異同。
2.2教學(xué)方法多樣化
筆者在教學(xué)實(shí)踐中,除了采用傳統(tǒng)的教學(xué)方法如:提問法、小組討論法外,主要采用以下教學(xué)方法:
1)錯(cuò)例分析法
學(xué)生對變量、類型、運(yùn)算符、表達(dá)式這些基本概念和語言規(guī)則的掌握需要一個(gè)過程,對算法和數(shù)據(jù)結(jié)構(gòu)的知識需要不斷積累。學(xué)習(xí)過程中,能聽懂老師授課的內(nèi)容,但自己編制的程序往往錯(cuò)誤百出。課堂上,我經(jīng)常將容易出錯(cuò)的概念以反例形式展示給學(xué)生,讓他們找錯(cuò)誤,通過運(yùn)行。比如錯(cuò)誤使用邏輯運(yùn)算符。
假設(shè)a、b和c是三個(gè)變量。如果已知a<c,要判斷b的值是否在a與c之間,可以使用以下表達(dá)式:a<bAndb<c
不能寫成:a<b<c。
很多學(xué)生會錯(cuò)誤延用數(shù)學(xué)上的概念,寫成后一種形式。
例OptionExplicit
PrivateSubCommand1_Click()
DimaAsInteger,bAsInteger,cAsInteger
a=-3:b=-2:c=-1
Printa<bAndb<c’顯示True
Printa<b<c’顯示False
EndSub
為什么a<b<c會得False?因?yàn)?,VB在計(jì)算這個(gè)表達(dá)式時(shí),先計(jì)算“a<b”部分,得True;再計(jì)算“True<c”,并將True轉(zhuǎn)換為一1,-1<-1?最終得False。
通過諸如此類的反例教學(xué),使學(xué)生豁然開朗,印象深刻。
2)零散實(shí)例和核心實(shí)例結(jié)合
零散實(shí)例教學(xué)法,對每個(gè)知識點(diǎn)的運(yùn)用和理解是非常行之有效的,但對前后知識的貫穿缺乏說服力。筆者在教學(xué)改革實(shí)踐中體會到,除經(jīng)典的零散實(shí)例外,將一個(gè)規(guī)模較大的、典型的、有實(shí)用價(jià)值的、學(xué)生感興趣的核心實(shí)例貫穿于教學(xué)全過程,對提高學(xué)生的編程能力非常幫助。所謂核心實(shí)例是指,實(shí)例從小到大、隨章節(jié)的展開而逐步成長,呈現(xiàn)為逐步進(jìn)化的多個(gè)版本。比如引入一個(gè)貫串全書的問題:設(shè)計(jì)一個(gè)“圖書管理系統(tǒng)”。首先,用最基本的概念和最簡單的結(jié)構(gòu),給出該系統(tǒng)的第一個(gè)(也是最簡單的)版本,以后的每一次課,都對該系統(tǒng)提出新的功能和結(jié)構(gòu)上的要求,并用本次課介紹的新概念和新方法對它進(jìn)行功能上的擴(kuò)充和結(jié)構(gòu)上的改進(jìn)。每次得到該系統(tǒng)的一個(gè)增強(qiáng)的新版本。為達(dá)到設(shè)計(jì)目標(biāo),學(xué)生隨著教學(xué)的進(jìn)程,可以積極投入到對實(shí)例系統(tǒng)的調(diào)試、改進(jìn)的實(shí)踐中,逐漸掌握了所學(xué)的基本知識,同時(shí)也提高了編程能力。
2.3重視實(shí)踐教學(xué),培養(yǎng)學(xué)生綜合應(yīng)用程序開發(fā)能力
VB是一門實(shí)踐性很強(qiáng)的課程,如果只紙上談兵,不上機(jī)練習(xí),是不可能真正掌握VB程序開發(fā)的。實(shí)踐教學(xué)主要注意抓住以下幾點(diǎn):
(1)模仿階段,對課堂核心實(shí)例系統(tǒng)的調(diào)試、改進(jìn)。核心實(shí)例的每次增強(qiáng)版是全面反映教學(xué)內(nèi)容的,學(xué)生通過模仿、知識再現(xiàn)達(dá)到在實(shí)踐中領(lǐng)悟知識,開拓編程思路。
(2)分層次階段,在教學(xué)過程實(shí)施的開始,和核心實(shí)例同步,我就給出了幾個(gè)類似核心實(shí)例的課程設(shè)計(jì)內(nèi)容,供學(xué)生選擇。對核心實(shí)例的調(diào)試比較成功的,可以同步實(shí)施自己所學(xué)的課程設(shè)計(jì)內(nèi)容,達(dá)到培養(yǎng)學(xué)生分析問題和解決問題的能力。對掌握核心實(shí)例有困難的學(xué)生,針對教學(xué)內(nèi)容重新布置實(shí)驗(yàn),強(qiáng)化知識鞏固。課程設(shè)計(jì)內(nèi)容課后上機(jī)完成。
要掌握上面兩個(gè)階段的具體情況,教師應(yīng)親自指導(dǎo),與學(xué)生一起上機(jī)實(shí)驗(yàn),隨時(shí)監(jiān)控學(xué)生實(shí)驗(yàn)過程。對學(xué)生提出的問題及時(shí)予以指導(dǎo),而發(fā)現(xiàn)學(xué)生常犯的共性錯(cuò)誤,可在理論課上進(jìn)行點(diǎn)評。
2.4培養(yǎng)學(xué)生使用標(biāo)準(zhǔn)編碼,養(yǎng)成良好編程習(xí)慣
在程序設(shè)計(jì)過程中,使用標(biāo)準(zhǔn)編碼可以避免一些不必要的錯(cuò)誤。筆者在授課過程當(dāng)中使用標(biāo)準(zhǔn)編碼的實(shí)例,在講解實(shí)例過程中對學(xué)生進(jìn)行適當(dāng)?shù)匾龑?dǎo),讓學(xué)生養(yǎng)成一個(gè)良好的編程習(xí)慣。
程序書寫規(guī)范是非常重要問題,不僅書寫格式應(yīng)該結(jié)構(gòu)層次分明,而且程序里面應(yīng)添加起碼的注釋。不按照標(biāo)準(zhǔn)書寫程序會增加別人查看程序的難度,同時(shí)也不利于自己以后上機(jī)調(diào)試修改。強(qiáng)調(diào)學(xué)生避免使用VisualBasic中的隱式操作,養(yǎng)成顯式編碼的習(xí)慣。比如永遠(yuǎn)使用OptionExplicit,嚴(yán)格執(zhí)行變量先定義后使用的原則。避免使用缺省屬性,明確指出是在引用對象還是在引用對象屬性。
3結(jié)束語
一門課程的教學(xué)是一個(gè)復(fù)雜的系統(tǒng)工程,筆者將以上一些改革和探索用在課堂教學(xué)和實(shí)踐教學(xué)中,取得了一些效果,但教學(xué)有法,教無定法,只要教學(xué)得法。在教學(xué)實(shí)踐中,合理運(yùn)用多種教學(xué)方法,靈活地、創(chuàng)造性地掌握教學(xué)過程,激發(fā)學(xué)生的興趣,培養(yǎng)學(xué)生的創(chuàng)造性思維和綜合應(yīng)用程序開發(fā)能力。
參考文獻(xiàn)
1.1《VB程序設(shè)計(jì)》課程中項(xiàng)目的設(shè)計(jì)
1.1.1章節(jié)項(xiàng)目
在整個(gè)教學(xué)過程當(dāng)中,采用了“大項(xiàng)目、小案例、任務(wù)驅(qū)動不斷”的教學(xué)模式,設(shè)計(jì)并選取與生活相聯(lián)系的合理的能夠調(diào)動學(xué)生學(xué)習(xí)積極性的項(xiàng)目。針對課程教學(xué)的最終目的,設(shè)計(jì)了一個(gè)比較完整的圖書館管理系統(tǒng)綜合項(xiàng)目,但是這門課程知識點(diǎn)較多,要想完成這個(gè)綜合項(xiàng)目,學(xué)生首先必須熟悉VB開發(fā)環(huán)境、掌握VB程序設(shè)計(jì)的基本概念和基礎(chǔ)知識、各章節(jié)的知識點(diǎn)內(nèi)容。為了配合整個(gè)課程最后綜合項(xiàng)目的完成,在具體的教學(xué)中按照教學(xué)內(nèi)容由易到難,針對教學(xué)中的重點(diǎn)和難點(diǎn)安排了13個(gè)章節(jié)項(xiàng)目,幫助學(xué)生更好地學(xué)習(xí)教材各章節(jié)中的知識點(diǎn)。項(xiàng)目一:由現(xiàn)實(shí)生活中的漢諾塔游戲、交換兩個(gè)杯子中飲料的問題,引入一個(gè)利用VB程序解決兩幅圖片對換位置的具體案例,使學(xué)生熟悉VB集成開發(fā)環(huán)境以及各種窗口的使用、掌握常用控件對象的建立以及布局、利用VB開發(fā)簡單應(yīng)用程序的步驟、并初步引入程序設(shè)計(jì)思想,引導(dǎo)學(xué)生思考兩數(shù)互換的問題,使學(xué)生通過觀察、思考、總結(jié)得出兩數(shù)互換的問題和兩幅圖片互換位置是一類問題。項(xiàng)目二:編寫一程序,在屏幕上顯示“歡迎來到VB世界!”,并輸入自己的名字。使學(xué)生熟悉VB編程四部曲———界面設(shè)計(jì)、相關(guān)對象的屬性設(shè)置、相關(guān)對象的代碼編寫、調(diào)試運(yùn)行,尤其注意程序的調(diào)試過程。項(xiàng)目三:設(shè)計(jì)一個(gè)華氏溫度與攝氏溫度之間轉(zhuǎn)換的程序。通過這個(gè)項(xiàng)目熟悉VB的數(shù)據(jù)類型及其運(yùn)算,掌握VB的常用標(biāo)準(zhǔn)函數(shù)、變量以及常量的使用等語法知識點(diǎn)。項(xiàng)目四:利用輸入函數(shù)輸入一元二次方程的系數(shù)a、b、c,編寫程序計(jì)算一元二次方程的兩個(gè)實(shí)根或虛根,用輸出語句輸出結(jié)果。熟悉常用的輸入輸出控件、掌握Print方法、Inputbox()函數(shù)、Msgbox()函數(shù)和Msgbox過程的使用方法。項(xiàng)目五:設(shè)計(jì)一個(gè)賬號和密碼的輸入檢驗(yàn)程序。規(guī)范整理英文文章,即對輸入的任意大小寫的英文文章進(jìn)行整理,規(guī)則是:所有句子開頭應(yīng)為大寫字目(句子是以符號“?”、“.”、“!”作為結(jié)束符的),其他都是小寫字母。使學(xué)生熟練掌握程序三大結(jié)構(gòu)中的選擇和循環(huán)結(jié)構(gòu)。項(xiàng)目六:對一個(gè)班級的學(xué)生成績進(jìn)行輸入統(tǒng)計(jì),找出所有成績中的最高分和最低分、全班成績的平均分等。使學(xué)生掌握數(shù)組的使用。項(xiàng)目七:編寫一個(gè)函數(shù),在已知的字符串中找出最長的單詞。假定已知字符串中只含有字符和空格,空格用來分隔不同的單詞。通過該項(xiàng)目的學(xué)習(xí)使學(xué)生掌握過程程序的設(shè)計(jì)、實(shí)參、形參等基本概念。項(xiàng)目八:常用控件的使用。設(shè)計(jì)一個(gè)類似Win-dows記事本的應(yīng)用程序,并完善其各項(xiàng)功能。通過該項(xiàng)目使學(xué)生掌握菜單、對話框和多重窗體程序設(shè)計(jì)。項(xiàng)目九:導(dǎo)入手機(jī)號碼文件,編寫一個(gè)手機(jī)選號程序,比如說選出手機(jī)尾號后四位相同的手機(jī)號碼等。要求學(xué)生通過學(xué)習(xí),掌握文件的相關(guān)操作,利用文件能夠建立簡單的應(yīng)用程序。項(xiàng)目十:建立本班同學(xué)信息庫,具體包括:學(xué)號、姓名、性別、出生日期、寢室電話、手機(jī)號碼,并用數(shù)據(jù)控件及綁定控件實(shí)現(xiàn)對同學(xué)信息的瀏覽,并實(shí)現(xiàn)按姓名查詢相關(guān)人員的基本信息。通過該項(xiàng)目掌握VB數(shù)據(jù)庫的相關(guān)技術(shù)。項(xiàng)目十一:設(shè)計(jì)多文檔應(yīng)用程序,熟悉VB高級界面的設(shè)計(jì)。項(xiàng)目十二:用MMControl控件設(shè)計(jì)一個(gè)錄音機(jī),用API函數(shù)設(shè)計(jì)一個(gè)用戶化的CD播放器。通過學(xué)習(xí),使學(xué)生掌握VB多媒體程序設(shè)計(jì)。
1.1.2階段項(xiàng)目
為了使整個(gè)學(xué)期的教學(xué)內(nèi)容具有連貫性,糅合各章節(jié)零散的知識點(diǎn),使教學(xué)實(shí)踐具有可操作性,將整個(gè)學(xué)期的教學(xué)實(shí)踐分成了三個(gè)階段,每個(gè)階段選用一個(gè)打破章節(jié)限制的階段項(xiàng)目,使學(xué)生對所學(xué)知識內(nèi)容有一個(gè)階段性較完整的認(rèn)識。這三個(gè)階段依次是實(shí)踐的開始階段、實(shí)踐的展開階段、實(shí)踐的結(jié)束階段,分別對應(yīng)階段項(xiàng)目一、階段項(xiàng)目二和階段項(xiàng)目三。每個(gè)階段中抓住關(guān)鍵教學(xué)環(huán)節(jié),按照“大項(xiàng)目、小案例、任務(wù)驅(qū)動不斷”的具體教學(xué)流程組織教學(xué)。階段項(xiàng)目一:選用簡單的項(xiàng)目,如蝴蝶飛舞、字幕滾動的項(xiàng)目。由于是初次接觸計(jì)算機(jī)編程語言,所以對于非計(jì)算機(jī)專業(yè)的學(xué)生來說,這門課程的入門學(xué)習(xí)很關(guān)鍵,如果按照常規(guī)授課方法,依據(jù)書本上的章節(jié)內(nèi)容安排依次講授VB語言發(fā)展史、VB語言特點(diǎn)以及編程環(huán)境等內(nèi)容的話,學(xué)生很難接受,往往是聽得稀里糊涂,不知道學(xué)習(xí)VB究竟有什么實(shí)際作用,從而會產(chǎn)生畏難情緒,最終導(dǎo)致學(xué)生對VB知識學(xué)習(xí)失去興趣和信心。為消除初學(xué)者的畏難情緒,第一階段主要以激發(fā)學(xué)生的學(xué)習(xí)興趣為主,讓學(xué)生對VB有一個(gè)直觀的認(rèn)識,同時(shí)讓學(xué)生在輕松的氣氛中了解VB的編程環(huán)境和編程步驟,以及VB面向?qū)ο?、事件?qū)動的編程機(jī)制。萬事開頭難,一旦學(xué)生對VB產(chǎn)生了興趣,就有利于后續(xù)知識的學(xué)習(xí)。階段項(xiàng)目二:難度稍微加大,選用計(jì)算器項(xiàng)目。通過本項(xiàng)目,一方面讓學(xué)生理解控件數(shù)組的含義和設(shè)計(jì)使用方法,以及簡單下拉菜單、常用數(shù)學(xué)函數(shù)的使用、過程函數(shù)的編寫等,進(jìn)一步加強(qiáng)學(xué)生對概念的理解。另一方面讓學(xué)生注意可視化界面的設(shè)計(jì),因?yàn)橛押妹烙^的人機(jī)交互界面,給人賞心悅目感覺的同時(shí)是軟件的門面。階段項(xiàng)目三:選用綜合項(xiàng)目———學(xué)生信息管理系統(tǒng)。通過這個(gè)項(xiàng)目讓學(xué)生真正了解掌握軟件的開發(fā)過程。雖然這個(gè)項(xiàng)目比較難,但是有了前面知識的鋪墊,會變得容易接受理解,也是對前面所學(xué)知識點(diǎn)的一次鞏固和進(jìn)一步更深入的理解,更是對前面知識的綜合應(yīng)用,讓學(xué)生由淺入深、由易到難,逐步領(lǐng)會掌握編程的基本思想、基本方法和開發(fā)一個(gè)軟件的完整步驟。三個(gè)階段通過運(yùn)用“大項(xiàng)目、小案例”,每個(gè)階段讓學(xué)生帶著具體任務(wù)去學(xué)習(xí),把枯燥的理論知識與生動形象的教學(xué)方式相結(jié)合,以清晰簡明的表達(dá)方式深入淺出地向?qū)W生傳授VB程序設(shè)計(jì)語言課程的知識,使學(xué)生在完成具體任務(wù)的實(shí)踐過程中不斷加深對面向?qū)ο蟪绦蛟O(shè)計(jì)思想和知識的理解。
1.2《VB程序設(shè)計(jì)》課程中的案例選取
有了已經(jīng)準(zhǔn)備好的各模塊的項(xiàng)目,并展示給學(xué)生,學(xué)生有了興趣后,就會想這些項(xiàng)目是怎么完成的,任務(wù)就落到各個(gè)模塊項(xiàng)目里面具體的案例上了。由于VB程序設(shè)計(jì)授課內(nèi)容多,授課時(shí)間緊張,按各知識模塊劃分選取項(xiàng)目后,在每個(gè)項(xiàng)目里面,按項(xiàng)目選取具體案例或是進(jìn)行設(shè)計(jì)各項(xiàng)目的各功能模塊,各功能模塊實(shí)際就是一個(gè)個(gè)案例。在教學(xué)過程中應(yīng)循序漸進(jìn),可以在原有案例的基礎(chǔ)上逐步改變或增加一些條件,將應(yīng)用進(jìn)行引申,啟發(fā)學(xué)生思維,讓學(xué)生對知識點(diǎn)的理解更透徹,掌握各知識點(diǎn)之間的聯(lián)系,提高學(xué)生發(fā)現(xiàn)問題、解決問題的能力,并在教學(xué)中兼顧學(xué)生生活經(jīng)驗(yàn)與知識趣味性,達(dá)到事半功倍的教學(xué)效果。
1.3任務(wù)設(shè)計(jì)
圍繞每一知識模塊的教學(xué)內(nèi)容、教學(xué)知識點(diǎn),設(shè)計(jì)相關(guān)的項(xiàng)目,并在各個(gè)項(xiàng)目中采用了系列案例以及完成各功能模塊的案例,為了讓學(xué)生更加熟練、更好地掌握教學(xué)內(nèi)容,在各知識模塊的學(xué)習(xí)中設(shè)置學(xué)習(xí)情景,給學(xué)生留有感興趣的任務(wù),讓學(xué)生去完成。同時(shí)根據(jù)各知識模塊提出了單元任務(wù),單元任務(wù)設(shè)置兩個(gè)層次———基本任務(wù)和提高任務(wù)。由于學(xué)生自身水平有差異,對于基礎(chǔ)好、學(xué)有余力的學(xué)生,要求他們不但要完成基本任務(wù),還要完成提高任務(wù);對于大多數(shù)學(xué)生,只要求他們完成基本任務(wù)。由于時(shí)間的限制,可以讓學(xué)生在課余時(shí)間分析任務(wù),在上機(jī)實(shí)踐課以及課余時(shí)間去完成任務(wù),最后做任務(wù)的總結(jié)。有了興趣和任務(wù)的驅(qū)使,學(xué)生為了完成任務(wù),就會利用各種方式和手段積極主動地去解決問題,他們會通過查閱相關(guān)書本、瀏覽網(wǎng)絡(luò)資源、同學(xué)之間互相協(xié)作等方式解決問題,充分調(diào)動了學(xué)生的主觀能動性,在完成任務(wù)的過程中學(xué)生分析問題、解決問題、實(shí)際開發(fā)應(yīng)用程序的能力得到了鍛煉,為學(xué)生知識的創(chuàng)新奠定良好的基礎(chǔ),同時(shí)知識面也更廣、更大了。學(xué)生不會再覺得教學(xué)只是教師一個(gè)人的“獨(dú)角戲”,而是教師和學(xué)生的“二人轉(zhuǎn)”。在相互的配合以及友好和諧的師生關(guān)系中,教學(xué)順利完成的同時(shí)學(xué)生個(gè)人的知識庫也得到了構(gòu)建。
要擁有一臺Pentium90以上、16MBRAM、520MB以上硬盤容量的PC機(jī)以及一臺43cm以上的大屏幕監(jiān)視器和一塊OpenGL三維圖形加速卡組成的系統(tǒng),就能與圖形工作站相媲美,但價(jià)格卻便宜數(shù)十倍。
本文作者一直從事計(jì)算機(jī)圖形應(yīng)用開發(fā)工作。原來是在SGI工作站上利用OpenGL開發(fā)圖形程序,后來又首先在國內(nèi)第一塊三維圖形加速卡AGC-3D上基于WindowsNT的VisualC++2.0環(huán)境下繼續(xù)進(jìn)行開發(fā)。在開發(fā)過程中,同一OpenGL程序幾乎不用修改就能在兩個(gè)平臺間來回移植,效果甚好。
一、OpenGL特點(diǎn)及功能
OpenGL是一個(gè)開放的三維圖形軟件包,它獨(dú)立于窗口系統(tǒng)和操作系統(tǒng),能十分方便地在各平臺間移植。
OpenGL具有七大功能。
(1)建模OpenGL圖形庫除了提供基本的點(diǎn)、線、多邊形的繪制函數(shù)外,還提供了復(fù)雜的三維物體(如球、錐、多面體、茶壺等)以及復(fù)雜曲線和曲面(如Bezier、Nurbs等曲線或曲面)繪制函數(shù)。
(2)變換OpenGL圖形庫的變換包括基本變換和投影變換?;咀儞Q有平移、旋轉(zhuǎn)、變比和鏡像四種變換,投影變換有平行投影(又稱正射投影)和透視投影兩種變換。
(3)顏色模式設(shè)置OpenGL顏色模式有兩種,即RGBA模式和顏色索引(ColorIndex)。
(4)光照和材質(zhì)設(shè)置OpenGL光有輻射光(EmittedLight)、環(huán)境光(AmbientLight)、漫反射光(DiffuseLight)和鏡面光(SpecularLight)。材質(zhì)是用光反射率來表示。場景(Scene)中物體最終反映到人眼的顏色是光的紅綠藍(lán)分量與材質(zhì)紅綠藍(lán)分量的反射率相乘后形成的顏色。
(5)紋理映射(TexureMapping)利用OpenGL紋理映射功能可以十分逼真地表達(dá)物體表面細(xì)節(jié)。
(6)位圖顯示和圖像增強(qiáng)圖像功能除了基本的拷貝和像素讀寫外,還提供了融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊圖像效果處理。
(7)雙緩存(DoubleBuffering)動畫雙緩存即前臺緩存和后臺緩存,簡而言之,后臺緩存計(jì)算場景、生成畫面,前臺緩存顯示后臺緩存已畫好的畫面。
此外,利用OpenGL還能實(shí)現(xiàn)深度暗示(DepthCue)、運(yùn)動模糊(MotionBlur)等特殊效果。
二、OpenGLforWindowsNT圖形庫
OpenGL圖形庫一共有100多個(gè)函數(shù)。其中核心函數(shù)有115個(gè),它們是最基本的函數(shù),其前綴是gl;OpenGL實(shí)用庫(OpenGLutilitylibrary,GLU)的函數(shù)功能更高一些,如繪制復(fù)雜的曲線曲面、高級坐標(biāo)變換、多邊形分割等,共有43個(gè),前綴為glu;OpenGL輔助庫(OpenGLauxiliarylibrary,GLAUX)的函數(shù)是一些特殊的函數(shù),包括簡單的窗口管理、輸入事件處理、某些復(fù)雜三維物體繪制等函數(shù),共有31個(gè),前綴為aux。
此外,還有六個(gè)WGL函數(shù)非常重要,專用于OpenGL和WindowsNT窗口系統(tǒng)的連接,其前綴為wgl,主要用于創(chuàng)建和選擇圖形操作描述表(renderingcontexts)以及在窗口內(nèi)任一位置顯示字符位圖。這些功能是WindowsNT對OpenGL的唯一補(bǔ)充,見表1所示。
表1管理圖形操作描述表的WGL函數(shù)
另外,還有五個(gè)Win32函數(shù)用來處理像素格式(pixelformats)和雙緩存。由于它們是對Win32系統(tǒng)的擴(kuò)展,因此不能應(yīng)用在其他OpenGL平臺上,見表2所示。
表2管理像素格式Win32函數(shù)
三、OpenGLforWindowsNT程序設(shè)計(jì)
OpenGLforWindowsNT的程序設(shè)計(jì)與OpenGLforUNIX的程序設(shè)計(jì)有一點(diǎn)小區(qū)別,關(guān)鍵就在于如何將OpenGL與不同操作系統(tǒng)下的窗口系統(tǒng)連接起來。如果調(diào)用OpenGL輔助庫窗口管理函數(shù),則不用考慮這些問題。下面將主要介紹在WindowsNT下OpenGL的程序設(shè)計(jì)關(guān)鍵。
1.圖形操作描述表
在WindowsNT下窗口程序必須首先處理設(shè)備描述表(DeviceContexts,DC),DC包含許多如何在窗口上顯示圖形的信息,即指定畫筆和刷子的顏色,設(shè)置繪圖模式、調(diào)色板、映射模式以及其他圖形屬性。同樣,OpenGLforWindowsNT的程序也必須使用DC,這與其他Windows程序類似。但是,OpenGLforWindowsNT必須處理特殊的DC圖形操作描述表,這是DC中專為OpenGL使用的一種。一個(gè)OpenGL應(yīng)用圖形操作描述表內(nèi)有OpenGL與WindowsNT窗口系統(tǒng)相關(guān)的各種信息。一個(gè)OpenGL應(yīng)用首先必須創(chuàng)建一個(gè)圖形操作描述表,然后再啟動它,最后在所定義的窗口內(nèi)按常規(guī)方式調(diào)用OpenGL函數(shù)繪制圖形。
一個(gè)圖形操作描述表不同于其他DC,它們調(diào)用每個(gè)GDI函數(shù)都需要一個(gè)句柄,而圖形操作描述表方式下只需一個(gè)句柄就可任意調(diào)用OpenGL函數(shù)。也就是說,只要當(dāng)前啟用了某個(gè)圖形操作描述表,那么在未刪除圖形操作描述表之前可以調(diào)用任何OpenGL函數(shù),進(jìn)行各種操作。
2.像素格式
在創(chuàng)建一個(gè)圖形操作描述表之前,首先必須設(shè)置像素格式。像素格式含有設(shè)備繪圖界面的屬性,這些屬性包括繪圖界面是用RGBA模式還是顏色表模式,像系緩存是用單緩存還是雙緩存,以及顏色位數(shù)、深度緩存和模板緩存所用的位數(shù),還有其他一些屬性信息。
(1)像素格式結(jié)構(gòu)
每個(gè)OpenGL顯示設(shè)備都支持一種指定的像素格式號。一般用一個(gè)名為PIXELFORMATDESCRIPTOR的結(jié)構(gòu)來表示某個(gè)特殊的像素格式,這個(gè)結(jié)構(gòu)包含26個(gè)屬性信息。Win32定義的PIXELFORMATDESCRIPTOR如下所示:
typedefstructtagPIXELFORMATDESCRIPTOR
{
WORDnSize;
WORDnVersion;
DWORDdwFlags;
BYTEiPixelType;
BYTEcColorBits;
BYTEcRedBits;
BYTEcRedShift;
BYTEcGreenBits;
BYTEcGreenShift;
BYTEcBlueBits;
BYTEcBlueShift;
BYTEcAlphaBits;
BYTEcAlphaShift;
BYTEcAccumBits;
BYTEcAccumRedBits;
BYTEcAccumGreenBits;
BYTEcAccumBlueBits;
BYTEcAccumAlphaBits;
BYTEcDepthBits;
BYTEcStencilBits;
BYTEcAuxBuffers;
BYTEilayerType;
BYTEbReserved;
DWORDdwLayerMask;
DWORDdwVisibleMask;
DWORDdwDamageMask;
PIXELFORMATDESCRIPTOR,
*PPIXELFORMATDESCRIPTOR,
FAR*LPPIXELFORMATDESCRIPTOR;
(2)初始化PIXELFORMATDESCRIPTOR結(jié)構(gòu)
PIXELFORMATDESCRIPTOR中每個(gè)變量值的具體含義和設(shè)置可以參
考有關(guān)資料,下面舉出一個(gè)PIXELFORMATDESCRIPTOR初始化例子來簡要
說明相關(guān)變量的意義。定義PIXELFORMATDESCRIPTOR結(jié)構(gòu)的pfd如下:
PIXELFORMATDESCRIPTORpfd=
{
sizeof(PIXELFORMATDESCRIPTOR),//結(jié)構(gòu)尺寸
l,//結(jié)構(gòu)版本
PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,//特性標(biāo)志
PFD-TYPE-RGBA,//RGBA模式
24,//24位顏色
0,0,0,0,0,0,//不涉及這些屬性
0,0,0,0,0,0,0,//沒有alpha緩存和累積緩存
32,//32位深度緩存
0,0,//沒有模板緩存和輔助緩存
PFD-MAIN-PLANE,//主層類型
0,//保留結(jié)構(gòu)數(shù)
0,0,0,//不支持結(jié)構(gòu)數(shù)
};
在這個(gè)結(jié)構(gòu)里,前兩個(gè)變量的含義十分明顯。第三個(gè)變量dwFlags的值是PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,表明應(yīng)用程序使用OpenGL函數(shù)來繪制窗口,第四個(gè)表明當(dāng)前采用RGBA顏色模式,第五個(gè)采用24位真彩色,即1.67千萬種顏色,如果是256色系統(tǒng)則自動實(shí)現(xiàn)顏色抖動;因?yàn)闆]有使用alpha緩存和累積緩存,所以從變量cAlphaBits到cAccumAlphaBits都設(shè)置為0;深度緩存設(shè)置為32位,這個(gè)緩存能解決三維場景的消隱問題;變量cAuxBuffers設(shè)置為0,在WindowsNT下不支持輔助緩存;WindowsNT下針對OpenGL變量ilayerType只能設(shè)置為PFD-MAIN-PLANE,但其他平臺也許支持PFD-OVERLAY-PLANE或PFD-UNDERLA
Y-PLANE;接下來bReserved變量只能設(shè)為0,而最后三個(gè)變量WindowsNT都不支持,故全設(shè)置成0。
(3)設(shè)置像素格式
當(dāng)初始化PIXELFORMATDESCRIPTOR結(jié)構(gòu)后,就要設(shè)置像素格式。下面幾段從VC++2.0的MFC程序中摘出的代碼就是設(shè)置像素格式的方式。代碼如下:
CClientDCclientDC(this);
intpixelFormat=ChoosePixelFormat(clientDC.m-hDC,&pfd);
BOOLresult=SetPixelFormat(clientDC.m-hDC,pixelFormat,&p
fd);
第一行語句說明得到一個(gè)應(yīng)用窗口客戶區(qū)的設(shè)置描述表。
第二行調(diào)用ChoosePixelFormat()選擇一個(gè)像素格式,并將像素格式索引號返回給pixelFormat變量;函數(shù)中第一個(gè)參數(shù)是選擇像素格式的設(shè)置描述表的句柄,第二個(gè)參數(shù)是PIXELFORMATDESCRIPTOR結(jié)構(gòu)的地址。如果調(diào)用失敗則返回0;否則返回像素格式索引號。
第三行調(diào)用SetPixelFormat()設(shè)置像素格式,三個(gè)參數(shù)分別是設(shè)備描述表的句柄、像素格式索引號和PIXELFORMATDESCRIPTOR結(jié)構(gòu)的地址。如果調(diào)用成功則返回TURE;否則返回FALSE。
3.創(chuàng)建圖形操作描述表
正如前所述,必須創(chuàng)建圖形操作描述表并啟用它后,才能調(diào)用OpenGL函數(shù)在窗口內(nèi)進(jìn)行各種圖形操作。一般說來,利用MFC中增補(bǔ)的管理圖形操作描述表方法來編程比較方便。下面舉一例:
intCopenglView::OnCreate(LPCREATESTRUCTlpCreateStruct
)
{
if(CView::OnCreate(lpCreateStruct)==-1)return-1;
//TODO:Addyourspecializedcreationcodehere
PIXELFORMATDESCRIPTORpfd=
{
sizeof(PIXELFORMATDESCRIPTIOR),
//structuresizel,
//structureversionnumber
PFD-DRAW-TO-WINDOWS|PFD-SUPPORT-OPENGL,//propertyflags
PFD-TYPE-RGBA,//RGBAmode
24,//24bitcolor
0,0,0,0,0,0,//notconcernedwiththese
0,0,0,0,0,0,0,//noalphaoraccumbuffer
32,//32bitdepthbuffer
0,0,//nostencilorauxbuffer
PFD-MAIN-PLANE,//mainlayertype
0,//reserved
0,0,0//unsupported
};
CClientDCclientDC(this);
intpixelFormat=ChoosePixelFormat(clientDC.m-hDC,&pfd);
BOOLresult=SetPixelFormat(clientDC.m-hDC,pixelFormat,&p
fd);
m-hRC=wglCreateContext(clientDC.m-hRC);
return0;
}
voidCOpenglView::onDraw(CDC*pDC)
{
COpenglDoc*pDoc=GetDocument();
ASSERT-VAILD(pDoc);
//TODO:adddrawcodefornativedatahere
wglMakeCurrent(pDC->m-hDC,m-hDC);
DrawMyOpenGL();
wglMakeCurrent(pDC->m-hDC,NULL);
}
voidCOpenglView::OnDestroy()
{
CView::OnDestroy();
//TODO:Addyourmessagehandlercodehere
wglDeleteContext(m-hRC);
}
2關(guān)鍵技術(shù)
本文將通過無線傳輸技術(shù)通訊全站儀,將全站儀傳回的數(shù)據(jù)進(jìn)行分析、驗(yàn)證,實(shí)時(shí)將所測點(diǎn)位展繪到測圖軟件中。
2.1數(shù)字化測圖軟件
國內(nèi)外有不少測繪行業(yè)的相關(guān)測圖軟件,較著名的國內(nèi)軟件有“威遠(yuǎn)圖”、“開思”、“山維”等。各軟件平臺都有自己獨(dú)到的優(yōu)勢和特點(diǎn)。如“威遠(yuǎn)圖”和“開思”,基于AutoCAD環(huán)境作了二次開發(fā),直接生產(chǎn)工程設(shè)計(jì)軟件環(huán)境需求的DWG數(shù)據(jù)。避免因數(shù)據(jù)格式兼容性而產(chǎn)生的數(shù)據(jù)錯(cuò)誤及數(shù)據(jù)不穩(wěn)定,并且在后期的圖形編輯中,還能夠直接借助AutoCAD強(qiáng)大的圖形編輯功能?!吧骄S”軟件是自行設(shè)計(jì)的獨(dú)立軟件平臺,可生產(chǎn)DXF格式的交換數(shù)據(jù)。自主性強(qiáng),不受支撐軟件平臺的制約。本文選用的測圖軟件是廣州開思軟件。
2.2電子平板與全站儀間的實(shí)時(shí)無線藍(lán)牙通訊
全站儀與計(jì)算機(jī)通常是采用RS-232串行連接[2],也就是說全站儀與計(jì)算機(jī)的通信是通過一根線來完成的。經(jīng)過藍(lán)牙適配器無線解決方案(藍(lán)牙與全站儀的連接匹配),可以使儀器與全站儀之間不再受連線的限制,只要用藍(lán)牙串口適配器代替串口電纜插入兩個(gè)設(shè)備的串行端口上,就可以實(shí)現(xiàn)串行端口間的無線通信。再通過在計(jì)算機(jī)上的實(shí)時(shí)通訊程序控制全站儀進(jìn)行測量工作,并且將全站儀傳回的數(shù)據(jù)進(jìn)行分析、驗(yàn)證。利用VB6.0程序中的MSComm控件,配置正確通訊參數(shù)后,設(shè)計(jì)出與便攜機(jī)間的通訊程序,通過發(fā)送數(shù)據(jù)申請,經(jīng)無線藍(lán)牙虛擬出的串口連接到全站儀,再把從全站儀傳回的數(shù)據(jù)進(jìn)行分析、驗(yàn)證。[3]具體的實(shí)現(xiàn)步驟如下:
(1)安裝藍(lán)牙驅(qū)動:讓平板電腦最大效率的發(fā)揮藍(lán)牙功能,需要先安裝和藍(lán)牙適配器配套的光盤驅(qū)動程序。
(2)全站儀的設(shè)置與連接:全站儀選用的是日本拓?fù)淇?002N,在操作界面下,將RS-232C下的[波特率]調(diào)為4800,[字符/校驗(yàn)]調(diào)為8/無校驗(yàn),[停止位]調(diào)為1,[Ack模式]調(diào)為標(biāo)準(zhǔn)方式,[CR,LF]調(diào)為關(guān),[記錄類型]調(diào)為REC-A。(3)連接藍(lán)牙串口適配器:數(shù)據(jù)線一端通過串口連接藍(lán)牙適配器,另一端通過RS-232端口連接到全站儀,這樣儀器的設(shè)置與連接工作準(zhǔn)備完畢。(4)藍(lán)牙與全站儀的匹配:電子筆記本上打開藍(lán)牙,搜索適配器并進(jìn)行匹配。至此,筆記本與全站儀間的藍(lán)牙無線連通已經(jīng)完成,藍(lán)牙在筆記本上虛擬出一個(gè)串口,通過該串口與全站儀的藍(lán)牙適配器連接,就如同在筆記本與全站儀間用數(shù)據(jù)線連接是一樣的。下面就需要一個(gè)控制程序,發(fā)出命令,通過建立的藍(lán)牙關(guān)系驅(qū)動全站儀,進(jìn)而操作全站儀。[4]
2.3全站儀與筆記本間的數(shù)據(jù)發(fā)送與接收全站儀與筆記本間的數(shù)據(jù)通訊利用的是VB中的MSComm通信控件。程序?qū)崿F(xiàn)步驟與方法如下:
(1)創(chuàng)建通訊窗體:在VB環(huán)境下創(chuàng)造一個(gè)窗體,用于驅(qū)動全站儀和接收來自全站儀的數(shù)據(jù)。
(2)設(shè)定通訊參數(shù):將全站儀與程序的通訊參數(shù)輸入一致,否則兩者之間無法聯(lián)通。
(3)數(shù)據(jù)的發(fā)送與接受命令:向全站儀發(fā)出測量指令[5]。a.向全站儀發(fā)出測量指令,測量指令參考各全站儀指令說明書內(nèi)容。b.從緩沖區(qū)得到全站儀傳回的數(shù)據(jù),例如:006?+00001772m3252048+1751349d+00001008*60+00+00061c.發(fā)送命令,告知全站儀數(shù)據(jù)接收完畢。d.進(jìn)行數(shù)據(jù)正確性驗(yàn)證:首先從上述數(shù)據(jù)中提取垂直角(V1),利用正弦函數(shù)得出數(shù)值A(chǔ)。例如:A=Sin(V1),其次提取斜距(SD)、平距(HD),利用平距除以斜距計(jì)算數(shù)值B。例如:B=HD/SD,最后計(jì)算C=A-B。如果C在一個(gè)允許的限差內(nèi),則說明從全站儀傳過來的數(shù)據(jù)是正確的。
2.4實(shí)時(shí)展繪點(diǎn)位程序
(1)讀取設(shè)站數(shù)據(jù),寫出觀測數(shù)據(jù):首先讀取設(shè)站信息并記錄在變量中,提取出設(shè)站坐標(biāo)X1、Y1、Z1,后視坐標(biāo)X2、Y2,后視定向值以及儀器高。然后創(chuàng)建觀測數(shù)據(jù)文本,將上面提到的7個(gè)參數(shù)加上觀測后得到的斜距、平距、垂直角、水平角一起存儲在其中。
(2)計(jì)算前、后視方位角:前視方位角=(水平角讀數(shù)-后視歸零值)+后視方位角后視方位角=Atn(橫軸坐標(biāo)差/縱軸坐標(biāo)差)
(3)計(jì)算前視點(diǎn)坐標(biāo):前視點(diǎn)橫軸坐標(biāo)=設(shè)站橫坐標(biāo)+水平距離*Sin(前視方位角)前視點(diǎn)縱軸坐標(biāo)=設(shè)站縱坐標(biāo)+水平距離*Cos(前視方位角)前視高程=設(shè)站點(diǎn)高程+儀器高+(平距*Ctn(垂直角))-棱鏡高(4)插入高程點(diǎn)和高程注記:首先在計(jì)算出的前視點(diǎn)位置插入高程點(diǎn)圖塊,然后在前視點(diǎn)位固定的位置插入前視高程值的注記文本。至此,外業(yè)利用藍(lán)牙連接全站儀,實(shí)時(shí)計(jì)算并驗(yàn)證碎步數(shù)據(jù)信息正確性,展繪點(diǎn)位工作完畢。