計算機概論:C/C++程式設計

 

第4. 反覆計算:迴圈

 

 


授課教師:陳慶瀚

WWW : http://www.miat.ee.isu.edu.tw/cpp

E-mail : pierre@isu.edu.tw   

 


4.2 for迴圈的變化形式

for迴圈是應用最廣泛的迴圈控制方法。一方面因為它的迴圈控制結構嚴謹,偵錯較為容易;一方面其語法具有很大的調整性,可以適用在廣泛的應用問題。在4.1節,我們看到了for迴圈的標準形式。接下來,我們將介紹幾種for迴圈的變化形式。

第一種常見的變化是在初始條件運算式中使用兩個或更多的變數來控制迴圈,例如

    for(x=1,y=1,z=1; x+y+z<15; z++)

兩個控制變數之間是以逗點","來區隔。我們同時將三個控制變數x,y,z設為1。繼續條件運算式x+y+z<15便是以這三個控制變數的和是否小於15作為繼續執行的條件。

/*----------------------------------------------------*/

//                  範例程式4-5

//            使用兩個控制變數的for迴圈

//                  陳慶瀚,2001

/*----------------------------------------------------*/

#include <iostream.h>

    void main()

{

int x,y;

for(x=0,y=0; x+y<=10; x++)

{

cout<<"請輸入y";

cin>>y;

}

}

for陳述中,兩個控制參數初值設定陳述以","分隔。每一次迴圈循環,x遞增1y值則由使用者從鍵盤輸入。xy必須共同符合x+y>=10才能夠結束這個迴圈。初學者在這個程式上比較容易犯錯的地方是忽略變數y的初值化,因為y值將由使用者輸入,那麼為什麼一定要將y先設為0? 這是因為在第一個迴圈循環時,for迴圈會先執行繼續條件運算式,也就是在使用者第一次輸入y值之前,程式就要先判斷是否x+y<=10。如果變數y沒有初值化,則y值是不確定的(它可能根據你先前執行過某一個程式或電腦開機時的記憶體配置狀態而具有某一個雖雞的數值),它可能是0,也可能是10,如果它是大於10的任意值,那麼這個運算式就會得到false,導致迴圈內的陳述還沒開始執行,程式就跳離迴圈了。

for陳述中的遞增運算式並不是非要不可,在某些情況下,它可能是多餘的,例如下列迴圈將反覆執行直到使用者輸入123才結束迴圈:

for(x=0; x!=123; )

{

 cin>>x; 

    }

這裡,遞增運算子是多餘的。我們無法預知迴圈要執行多少個循環,因此不需要使用遞增運算子來控制迴圈次數。我們使用

    x!=123

作為繼續條件運算式,當x不等於123,則迴圈繼續。換句話說,一旦使用者輸入x=123,則該運算式將得到false,迴圈隨即結束。

有時候我們還可以把初始條件運算式寫在迴圈外部,例如

x=0;

for(; x!=123; )

{

 cin>>x; 

    }

雖然這樣的寫法仍合於語法,但我們並不鼓勵使用,因為它叫不具有結構性,會讓程式流於鬆散。

另外一種重要的for迴圈變化形式是無限迴圈(Infinite Loop),我們只需要讓for陳述裡的三個運算式全部忽略不寫,就會得到一個永遠都不會結束的迴圈,例如:

for(;;)

{

cout<<"永不停止的迴圈<<endl; 

}

在真實的程式裡,我們可能不會如此寫,因為這個程式執行時,最後需要動用到外部作業系統的強制程式中斷(例如同時按Ctrl+Alt+Del)才有辦法讓程式停止下來。通常一個無限迴圈是用在不預知迴圈執行圈數情況下,我們希望監測某個事件(event)發生或某個變數值的出現,一旦該事件真的發生或該變數值真的出現,則我們可使用break指令強制迴圈中斷。本章最後一節將進一步探討這種強制迴圈中斷的方法。

還有一種較為少見的for迴圈變化形式是不具bodyfor迴圈,也就是迴圈原本所包含的程式區段內沒有任何的陳述,這個迴圈不執行任何陳述。那麼這樣的迴圈有何作用?我們可以拿它來產生一段時間延遲,這在一些特殊的應用(例如工業控制)問題是很有用的技巧。如下式

for(t=0; t<SOME_VALUE; t++) ;

SOM_VALUE是宣告為長整數(long)的常數,譬如我們設SOM_VALUE=10000000,則這個迴圈會空轉1千萬次,由於每一次循環都必須執行兩個運算式t<SOME_VALUEt++,因此會花掉一些執行時間,對於後續的程式而言,就如同時間延遲的作用。


 

計算機概論:C/C++程式設計

義守大學電機系 陳慶瀚 
2001.10.22