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