文章編號:1672-5913(2008)20-0138-02
摘 要:變量的使用是VB程序設(shè)計(jì)中必不可少的重要環(huán)節(jié),而在教學(xué)中變量的使用技巧沒有得到足夠的重視,學(xué)生的掌握程度不佳。本文著重探討了變量錯(cuò)用導(dǎo)致的“溢出”問題和變體型變量的使用問題。
關(guān)鍵詞:VB程序設(shè)計(jì);變量類型;溢出;變體型
中圖分類號:G642 文獻(xiàn)標(biāo)識(shí)碼:B
1 引言
Visual Basic(以下簡稱VB)是一種可視化的、面向?qū)ο蠛筒捎檬录?qū)動(dòng)方式的結(jié)構(gòu)化高級程序設(shè)計(jì)語言,可用于開發(fā)Windows環(huán)境下的各類應(yīng)用程序。它簡單易學(xué)、效率高、功能又強(qiáng),所以目前很多院校將它作為非計(jì)算機(jī)專業(yè)軟件技術(shù)基礎(chǔ)課程講授的編程語言之一(使用VB6.0版本)。
筆者在講授這門課程的過程中發(fā)現(xiàn),變量的使用是任何一種程序設(shè)計(jì)語言中都必不可少的環(huán)節(jié),變量用來存放程序運(yùn)行時(shí)使用到的數(shù)據(jù)和程序運(yùn)行產(chǎn)生的中間結(jié)果,正確的使用變量可以使程序清晰明了,減少程序運(yùn)行時(shí)占用的內(nèi)存,提高運(yùn)行效率。然而由于VB常作為非計(jì)算機(jī)專業(yè)的第一門程序設(shè)計(jì)課程,加之課時(shí)有限,所以無論在教材中,還是在課堂講授中,對變量的講解都比較淺顯,不能滿足學(xué)生實(shí)際應(yīng)用的需要。筆者特將兩個(gè)和變量相關(guān)的問題提出來,與講授這門課程的教師們共同探討。
2 變量類型使用錯(cuò)誤導(dǎo)致的溢出問題
大多數(shù)VB程序設(shè)計(jì)教程都很少提及賦值和計(jì)算中的“溢出”問題。然而在學(xué)生的編程中,“溢出”卻是不可回避的一個(gè)問題。不正確的變量類型使用可能導(dǎo)致“溢出”。例如在龔沛曾等主編的教材《Visual Basic 程序設(shè)計(jì)教程》(第3版)的實(shí)驗(yàn)篇中有這樣一道題目[1]。
[例1]計(jì)算π的近似值,π的計(jì)算公式為:
注意:
① 分別顯示當(dāng)n=10、100、1000時(shí)的結(jié)果,由此可見,此公式收斂程度如何?
② 同時(shí)為防止大相乘是結(jié)果溢出的問題,將變量類型改為長整型或?qū)崝?shù)類型。
大部分學(xué)生會(huì)寫出這樣的程序段:
Private Sub Form_Click()
Dim pi As Single, n As Integer, t As Single
pi = 2
For n = 1 To 10
t = (2 * n) ^ 2 / ((2 * n - 1) * (2 * n + 1))
pi = pi * t
Next n
Print \"n=10時(shí),π=\"; pi
pi = 2
For n = 1 To 100
t = (2 * n) ^ 2 / ((2 * n - 1) * (2 * n + 1)) ‘此句發(fā)生溢出
pi = pi * t
Next n
Print \"n=100時(shí), =\"; pi
……
End Sub
當(dāng)程序運(yùn)行到程序中加注釋的語句時(shí)會(huì)產(chǎn)生運(yùn)行期錯(cuò)誤“實(shí)時(shí)錯(cuò)誤'6':溢出”。(見圖1)學(xué)生們都注意到變量t用來保存公式的通項(xiàng),應(yīng)該使用精度比較高的實(shí)型數(shù)據(jù),而認(rèn)為n變量的取值分別是1~10、1~100、1~1000,當(dāng)然使用整型(integer)就可以了。其實(shí),錯(cuò)誤就出在這里。為了解釋這個(gè)問題,我們舉一個(gè)簡單的例子,如下程序段:
[例2] Private Sub Command1_Click()
Dim c As Long
c = 3 2* 1024
End Sub
圖1
程序運(yùn)行時(shí)會(huì)發(fā)生溢出錯(cuò)誤。大部分學(xué)生會(huì)認(rèn)為,變量c已經(jīng)是長整型了,足以放的下32×1024的積,怎么還會(huì)溢出呢?其實(shí),VB在做數(shù)值運(yùn)算時(shí),會(huì)先開辟一個(gè)內(nèi)存地址來存放計(jì)算結(jié)果,然后再傳送到指定的變量中。如上面的程序,變量c雖然是長整型,其可存放數(shù)值的范圍是(-2147483648,+2147483647),但VB做計(jì)算時(shí),將32判斷為整數(shù),1024也判斷為整數(shù),就任意在內(nèi)存的某個(gè)位置開辟2Byte大小的空間來存放32×1024的值,然后再回存至變量c。但32×1024(即32768)已超過任意在內(nèi)存的某個(gè)地址開辟的2Byte的大小,故溢出。
怎樣解決溢出問題呢?答案就是轉(zhuǎn)變數(shù)據(jù)的類型。將例2的程序段改為:
Private Sub Command1_Click()
Dim c As Long
c = CLng(3 2)*CLng( 1024)
End Sub
就可以正常計(jì)算了。理解了VB做數(shù)值運(yùn)算的內(nèi)部機(jī)理,我們就可以重新審視例1。當(dāng)程序發(fā)生溢出錯(cuò)誤時(shí),我們點(diǎn)擊“調(diào)試”,出錯(cuò)的語句會(huì)高亮度顯示,我們把光標(biāo)放在n變量上,可以發(fā)現(xiàn)溢出時(shí)n的值為91,n=91時(shí),表達(dá)式(2 * n - 1) * (2 * n + 1)的值為33123。通過例2我們得知,n為整型變量,計(jì)算機(jī)會(huì)認(rèn)為表達(dá)式2*n-1和2*n+1也是整型,所以會(huì)在內(nèi)存中開辟2Byte的空間暫時(shí)存儲(chǔ)表示式(2 * n - 1) * (2 * n + 1)的值,當(dāng)n取值91時(shí),乘積大于整型變量的取值范圍-32768~+32767,故溢出。解決的辦法可以有多種:
(1)將變量n定義為長整型或?qū)嵭汀?/p>
(2)將錯(cuò)誤語句中的乘數(shù)2后面加上長整型類型符或者實(shí)型符號!、#均可。
(3)避免大數(shù)相乘,將錯(cuò)誤語句改為t = (2 * n) ^ 2 / (2 * n - 1) / (2 * n + 1)。
3 慎用變體型(Variant)變量
很多教師在講授VB程序設(shè)計(jì)的過程中不注重強(qiáng)調(diào)變量的顯式聲明,而且在安裝VB時(shí),它的默認(rèn)設(shè)置并不要求對變量進(jìn)行顯式聲明,所以學(xué)生們都不是很注意這個(gè)問題。由于VB程序設(shè)計(jì)課程不強(qiáng)調(diào)在程序編寫之前畫出流程圖,所以大部分學(xué)生習(xí)慣于在程序編寫之前不對程序所要使用的變量進(jìn)行通盤考慮,而是在最后需要使用的時(shí)候才將變量插進(jìn)來。而VB規(guī)定所有未定義的變量默認(rèn)為Variant型。例如下面的程序段,其中的變量i將作為Variant處理。
Private Sub Command1_Click()
Dim MyArray(5) As Single
For i = 0 To 5
a(i) = inputbox(\"請輸入第\" i \"個(gè)元素的值\")
Next i
End Sub
還有一些同學(xué)在變量聲明中沒有包含As<類型>子句,那么該變量也被創(chuàng)建為Variant型。例如下面兩個(gè)變量聲明將產(chǎn)生相同的結(jié)果:
Dim MyVarialble
Dim MyVarialble As Variant
對于用戶創(chuàng)建的Function過程來講,這一原則也同樣使用。定義一個(gè)函數(shù)時(shí),如果不包含As<類型>子句,函數(shù)的返回值將始終是Variant。下面兩個(gè)函數(shù)定義也產(chǎn)生相同的結(jié)果:
Private Function MyFunction()
Private Function MyFunction() as Variant
這一點(diǎn)也是我們講課時(shí)經(jīng)常忽略的。
雖然VB能夠很好地確定Variant中存放的數(shù)據(jù)類型并應(yīng)用相應(yīng)的運(yùn)算規(guī)則,然而Variant變量存在一個(gè)重大的缺陷就是它們占用的內(nèi)存比VB的任何其他數(shù)據(jù)類型都要多。每一個(gè)Integer占2個(gè)字節(jié),Double占8個(gè)字節(jié),而每一個(gè)Variant存放任何數(shù)值數(shù)據(jù)都占用個(gè)16字節(jié)。變長字符串變量占用4個(gè)字節(jié)加上宇符串中每一個(gè)宇符占用1個(gè)字節(jié),而每一個(gè)包含字符串的Variant都要占用22個(gè)字節(jié)加上字符串長度。任何數(shù)據(jù)類型的Variant數(shù)組都要占用20個(gè)字節(jié)內(nèi)存,加上4字節(jié)用于每個(gè)維數(shù),再加上用于每個(gè)數(shù)據(jù)元素本身的字節(jié)數(shù)。Variant不僅占用的內(nèi)存比其他數(shù)據(jù)類型要多,而且對于Variant中的數(shù)據(jù)操作時(shí)的速度幾乎總是比對其他數(shù)據(jù)類型進(jìn)行操作的速度要慢[2]。因此在用作局部變量或過程的參數(shù)時(shí),Variant變量是特別煩人的,因?yàn)樗鼈兿亩褩?臻g太快[3]。因此,教師應(yīng)引導(dǎo)學(xué)生在開始學(xué)習(xí)編程時(shí)就養(yǎng)成良好的習(xí)慣,注意顯示聲明變量,并為變量精心選擇數(shù)據(jù)類型,絕對必要時(shí)才采用變體型。
4 結(jié)束語
本文對VB教學(xué)中普遍容易忽略的變量類型選用問題進(jìn)行了初步的探討,變量的正確使用關(guān)系到程序運(yùn)行結(jié)果的準(zhǔn)確型和運(yùn)行的效率,關(guān)系重大,值得我們認(rèn)真加以研究。同時(shí),要精確的使用變量,也非一件易事,需要我們進(jìn)一步的探討。
參考文獻(xiàn)
[1] 龔沛曾.Visual Basic程序設(shè)計(jì)教程[M].北京:高等教育出版社,2007.
[2](美)James D.Foxall著.王建華譯.Visual Basic編程標(biāo)準(zhǔn)[M].北京:機(jī)械工業(yè)出版社,2000.
[3] 姚福娥.談VB程序設(shè)計(jì)的后續(xù)的若干問題[J].科技信息,2006,(8):12-13.
“本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文”