[摘要]本文簡單介紹了VB語言中循環(huán)語句的格式、功能、注意事項。并對Vb語言中循環(huán)語句for…next作了深入討論。
[關(guān)鍵詞]循環(huán)語句 棧 循環(huán)棧
循環(huán)是很重要的,不要輕視。循環(huán)主要是看循環(huán)結(jié)構(gòu)。特別是循環(huán)嵌套。循環(huán)結(jié)構(gòu)是計算機語言里一種重要的結(jié)構(gòu),它的應(yīng)用廣泛,最簡單的例子是累加器的作用,還可以用于窮舉法,更直觀的例子是把某件事重復(fù)指定的次數(shù),這樣就不用把要重復(fù)的語句輸入多次,而通過循環(huán)結(jié)構(gòu)完成,非常方便。循環(huán)語句是每一門編程語言都不可缺少的語句,利用循環(huán)語句可以讓程序員避免頻繁地做同樣的工作。用好循環(huán)語句可以讓程序變的簡單易懂,循環(huán)結(jié)構(gòu)能夠讓程序重復(fù)的執(zhí)行一行或多行代碼,VB支持以下兩種循環(huán)結(jié)構(gòu):一種是計數(shù)型語句,另一種是條件型循環(huán)語句。
一、For…next循環(huán)
For…next循環(huán)能將一組語句重復(fù)執(zhí)行指定的次數(shù),當(dāng)知道要執(zhí)行循環(huán)的次數(shù)時,用這種方法很方便。
具體語法格式是:
For <循環(huán)變量>=<初賦值> To <終值> [Step <步長>]
<語句塊>……
……[exit for]
<語句塊>……
Next <循環(huán)變量>
其中:循環(huán)變量是一個變量,必須為數(shù)值型。比如for i=1 to 100循環(huán)100次,會被執(zhí)行指定次數(shù)。語句塊:為一些指令可以是一句或多句語句,構(gòu)成循環(huán)體。Exit for可選,退出循環(huán)。Next 循環(huán)變量, 將控制轉(zhuǎn)回for語句,以對變量的下一個值重復(fù)循環(huán)。Step可選,指定每次執(zhí)行循環(huán)變量更換的數(shù)量。
功能:(1) 循環(huán)變量取初值,登記終值和步長(2)檢查循環(huán)變量的當(dāng)前值是否越過終值。如已越過,則退出循環(huán),執(zhí)行NEXT的后續(xù)語句,否則,做下面的工作;(3)執(zhí)行循環(huán)體內(nèi)的各語句;(4)遇NEXT語句時,參照對應(yīng)的FOR語句,將循環(huán)變量的值加上步長再賦值給循環(huán)變量,返回第(2)步進(jìn)行比較。
在默認(rèn)情況下,Step被設(shè)為“1”, 如果省略就表明是1可以省略,Step也可以設(shè)為負(fù)值,例如:
Dim s=0
For I=1 To 10
s=s+I
Next I
這是一個最簡單的累加器的例子,把1到10累加在一起,然后賦值給“s”這樣的效果和上面是一樣的,只不過是倒著加罷了,請看:
Dim s=0
For I=10 To 1 Step -1
s=s+I
Next I
循環(huán)的次數(shù): n=int ((終值-初值)/2+1)
各種循環(huán)情況的進(jìn)一步說明:
越過終值的含義是指一個循環(huán)經(jīng)由NEXT結(jié)束以后,循環(huán)變量的值正好是越過終值后的第一個值(或者說,是循環(huán)區(qū)內(nèi)最后一個值加步長),任何變量的當(dāng)前值,總是要登記入變量表中的。而循環(huán)變量也是變量,因此,它的每次取值,都要記入變量表(注意,一個變量取得新值時,舊值被沖掉)。當(dāng)循環(huán)變量取得越過終值的第一個值時,盡管它導(dǎo)致了循環(huán)的結(jié)束,但在變量表中卻被保留了下來。
二、While…wend循環(huán)
While語句也是一個很常用的循環(huán)語句,具體語法格式是:
Do While … Loop語句
While … Wend 語句
Do … Loop While
While后面都跟邏輯條件判斷,“Do While … Loop語句”和“While … Wend 語句”作用相似,都是先判斷While后面的條件是否為“真”,如果為“真”則執(zhí)行里面的語句,如果為“假”,則退出循環(huán),循環(huán)直至條件為“假”終止?!癉o … Loop While ”與前兩者的區(qū)別在于,它不管條件的真假,都會先執(zhí)行“Do”后面的語句,也就是說,它至少執(zhí)行語句一次。與While用法相似的還有Until語句,它是直至條件為真則終止循環(huán),句式把While上述三個語句的While換成Until即可,但是因為容易記混,所以我建議只用While即可。Until <條件>可以相當(dāng)于While Not <條件>。For循環(huán)和Whlie循環(huán)應(yīng)當(dāng)根據(jù)適當(dāng)?shù)沫h(huán)境使用,它們有時也可替換。While…wend只要給定的條件為真,while循環(huán)就執(zhí)行一系列的語句。
具體語法格式是:
While <條件>
<語句塊>
Wend
其中,如果條件成立,既為真,則執(zhí)行<語句塊>為假就結(jié)束循環(huán),將循環(huán)穿帶wend后面的語句。
C語言里有一個“for”循環(huán)語句,VB里也有“For”關(guān)鍵字,作用也差不多,只是VB的“For”語句更容易理解。
像do loop while 和do while loop 的應(yīng)用有哪些不同的意義呢?
顧名思義,do…loop while就是一開始就要執(zhí)行一次循環(huán),然后到while時再判斷是否繼續(xù)循環(huán)
而do while…loop則是開始第一次循環(huán)前先判斷while的條件,如果是真才開始第一次循環(huán),是假的話就直接不進(jìn)入循環(huán)。簡而言之do…loop while肯定至少進(jìn)行一次循環(huán)。
三、循環(huán)語句的深入討論
因為循環(huán)語句具有一定的語句格式和一定的執(zhí)行過程,所以一般使用起來十分方便。然而循環(huán)語句畢竟要比其它語句復(fù)雜,特別是在循環(huán)體內(nèi)允許使用轉(zhuǎn)移、循環(huán)等語句,這樣,復(fù)雜程度更趨嚴(yán)重。在使用循環(huán)語句時,稍不小心,將會導(dǎo)致意想不到的后果。為此,對循環(huán)語句的執(zhí)行細(xì)節(jié)作進(jìn)一步的討論。從而引出一些使用循環(huán)語句時值得注意的問題、常見的錯誤和難點分析。
1.循環(huán)語句的執(zhí)行細(xì)節(jié)
一個VB的程序的運行中,對于循環(huán)語句的處理,是通過循環(huán)棧的輔助作用來實現(xiàn)的。所謂“?!?,這是計算機軟件中的一個非常重要的概念。它是一種先進(jìn)后出(或稱后進(jìn)先出)的結(jié)構(gòu)。好像一個貨棧一樣,最先放入的貸物,總是放在最底下,再放入貨物時,往上推,而往出取時,總是把最上層的貨物先取走(后進(jìn)先出)。
計算機中的棧,是存放數(shù)據(jù)的,它總是開辟在內(nèi)存中一個固定地址開始的一片連續(xù)單元中。這個固定地址,稱為棧底。另外有一個專門的指針(稱為棧指針)在程序未運行前指向這個棧底。當(dāng)一個數(shù)據(jù)需要存入棧中(稱為進(jìn)棧)時,就存入棧指針?biāo)赶虻牡刂分校缓髼V羔樕弦埔粋€數(shù)據(jù)位置。如果再有數(shù)據(jù)要進(jìn)棧,作類似的處理。反過來,如果要從棧中取出一個數(shù)據(jù)(稱為退棧、出棧)時,棧指針首先下移一個數(shù)據(jù)位置,把所指向的那個數(shù)據(jù)(實際上是剛才最后一次存入的數(shù)據(jù))取出供使用(注意,雖然叫退棧,但這個數(shù)據(jù)并未從剛才存放的內(nèi)存位置上消失,只是它已處于棧指針之外,成為無效數(shù)據(jù)罷了)??梢姉V羔樖歉拥摹_M(jìn)棧、退棧總是通過棧指針找到相應(yīng)位置的,而棧指針?biāo)赶虻奈恢糜质峭ㄟ^進(jìn)棧和退棧改變的。任何時刻棧指針?biāo)赶虻奈恢?,通常稱為棧頂或棧的當(dāng)前位置。
所謂循環(huán)棧,是專用于處理循環(huán)語句的棧的棧結(jié)構(gòu)。棧中的數(shù)據(jù)是成組存放的,它們有循環(huán)變量名、FOR語句所在的位置等一組必要的信息(數(shù)據(jù))。現(xiàn)在就可以從棧的角度進(jìn)一步闡明循環(huán)語句執(zhí)行時的細(xì)節(jié)了。在程序運行中發(fā)現(xiàn)FOR語句時,首先要從循環(huán)棧的棧頂?shù)綏5字鸾M檢查一遍(稱為遍歷),看有無當(dāng)前待處理的FOR 保留字所用的循環(huán)變量名,若是沒有(在程序運行中遇到第一個FOR語句時,肯定是這樣。因為這時棧頂和棧底重合,棧中尚無數(shù)據(jù)),則使待處理的FOR的有關(guān)數(shù)據(jù)進(jìn)棧。然后循環(huán)變量取初值,執(zhí)行循環(huán)體內(nèi)的各語句。如果在循環(huán)體內(nèi)又出現(xiàn)了FOR語句,重復(fù)上述過程:遍歷循環(huán)棧,查找有無待處理的同名循環(huán)變量。若還是沒有,第二個FOR的有關(guān)數(shù)據(jù)進(jìn)棧(這時棧中有兩組數(shù)據(jù)了)同樣地,內(nèi)層的(第二個)循環(huán)變量取初值,執(zhí)行內(nèi)循環(huán)體內(nèi)的各語句。如果這個內(nèi)循環(huán)體中又出現(xiàn)了FOR語句,不言而喻,照上面的辦法去處理。通過上面的敘述,可以看到,對于循環(huán)棧而言,F(xiàn)OR的作用,是在循環(huán)棧中登錄一些有關(guān)數(shù)據(jù)備查。對于多重循環(huán)語句,第一重(最外層)循環(huán)的有關(guān)數(shù)據(jù)總是在棧底;最后一重(最內(nèi)層)循環(huán)的有關(guān)數(shù)據(jù)總是在棧頂。
下面,再來敘述一下NEXT的處理過程。
假若處理的是一個單循環(huán),這時循環(huán)棧中當(dāng)然也只有一個數(shù)據(jù),這組數(shù)據(jù)正處在棧指針的當(dāng)前位置上。程序運行遇到保留字NEXT時,如果NEXT之后跟有變量名,則遍歷循環(huán)棧,看棧中有無同名的循環(huán)變量名。若是沒有,則給出出錯提示。若是棧中的數(shù)據(jù)里有NEXT后跟的變量名,則將棧指針指向這組數(shù)據(jù),并提出NEXT使用。
那么退同循環(huán)又做些什么事呢?很簡單,那就是將棧針下移一組數(shù)據(jù)的位置(對于單循環(huán)而言,這時棧指針又返回棧底,回復(fù)到初始狀況了)這也就是使剛剛用過的那組數(shù)據(jù)退棧了。
知道了單循環(huán)NEXT處理過程,對于多重循環(huán)的NEXT處理過程,也就迎刃而解了,這里僅就雙循環(huán)的情況稍作說明。
執(zhí)行VB程序時,最先要處理的NEXT,一般是屬于最內(nèi)層的那個循環(huán)的。對于它的處理,可以按上面處理單循環(huán)的方法去做,直到內(nèi)層循環(huán)結(jié)束,相應(yīng)的數(shù)據(jù)退棧,外層循環(huán)的有關(guān)數(shù)據(jù)處于循環(huán)棧頂。如果程序運行中又遇到了NEXT,一般它屬于外層循環(huán)的,也可按單重循環(huán)的辦法處理,而當(dāng)它不滿足退出的條件時,總要返回外層循環(huán)體的頭上繼續(xù)執(zhí)行。這樣將會再次遇到內(nèi)循環(huán)的FOR,這個FOR的有關(guān)數(shù)據(jù),也就再次進(jìn)入循環(huán)中。往下運行時如果又遇到了內(nèi)層循環(huán)的(而不是外層循環(huán)的)NEXT,則內(nèi)層循環(huán)再次被執(zhí)行,直到退出。內(nèi)循環(huán)退出后,再遇到的NEXT便屬于外循環(huán)的了,再次重復(fù)上面的處理過程,直到退出外循環(huán)??梢?,每遇到一個外循環(huán)的NEXT,只要返回其循環(huán)體,內(nèi)循環(huán)的有關(guān)數(shù)據(jù)將進(jìn)棧一次;而每退出一次內(nèi)循環(huán),這組數(shù)據(jù)也就退棧一次。從而通過這種進(jìn)棧、退棧,實現(xiàn)了對循環(huán)層次的控制。
2.使用循環(huán)語句應(yīng)注意的問題、常見錯誤和難點分析
(1)不循環(huán)或死循環(huán)的問題 主要是循環(huán)條件、初值、終值、步長的設(shè)置有問題;(2)循環(huán)語句結(jié)構(gòu)中缺少配對的結(jié)束語句 For…next中沒有配對的next語句,do語句沒有一個終結(jié)的loop語句等; (3)循環(huán)嵌套時,內(nèi)外循環(huán)交叉 外循環(huán)必須完全包含內(nèi)循環(huán);(4)循環(huán)結(jié)構(gòu)與IF塊結(jié)構(gòu)交叉 正確的應(yīng)為IF結(jié)構(gòu)語句塊完全包含循環(huán)結(jié)構(gòu);或循環(huán)結(jié)構(gòu)完全包含IF結(jié)構(gòu);(5)累加、連乘,存放累加、連乘的變量賦初值問題 在一層循環(huán)中,存放累加、連乘結(jié)果的變量設(shè)置應(yīng)在循環(huán)語句前。多層循環(huán)中存放累加、連乘結(jié)果的變量設(shè)置要具體問題分別對待; (6)關(guān)于內(nèi)外轉(zhuǎn)移的問題 允許從循環(huán)體內(nèi)轉(zhuǎn)出循環(huán)體外,不允許從循環(huán)體外轉(zhuǎn)出循環(huán)體內(nèi);(7)大數(shù)相乘產(chǎn)生“溢出”問題 改變變量聲明類型。
參考文獻(xiàn):
[1]龔沛曾.visual basic 程序設(shè)計簡明教程(第二版).
(作者單位:山西忻州師范學(xué)院)