【不是惡夢的開始,而是再度的精進。 for迴圈】


程式中需要重複執行某一組指令功能時,迴圈就是最好的選擇。

我們可以根據程式的需求與習慣,選擇 for、while 及 do-while 迴圈,一般來說,for 迴圈用在已知要重複執行幾次時。


for迴圈主要是用在執行已知要執行幾次敘述的迴圈,但是也可以用在其他方面。
for迴圈的控制是關鍵字for之後括號內的三個以分號隔開的運算式。其格式如下: 

 

for(設定初值; 判斷條件; 設定增減量)
{
  敘述1;
  敘述2;
  ....
  敘述n;
}


第一個運算式是用來初值化一個或多個迴圈變數。
第二個運算式是在迴圈每次反覆開始時會比對這一個運算式,若為真則迴圈繼續執行,若為偽則執行for迴圈後面的下一個敘述。
第三個運算式是在迴圈每次反覆結束時,一般是用來修改在第一個運算式中的初值化的變數值。


for迴圈的邏輯流程是這樣的,迴圈開始的第一個運算式只求值一次,接著檢查迴圈判斷條件,若為真則執行迴圈敘述,接著執行第三個運算式,再次檢查判斷條件是否可以繼續執行迴圈,若為偽則跳出迴圈並執行迴圈後面的下一個敘述。


例: 
求1加到10的總和


#include<iostream>
using namespace std;

int main(int argc, char** argv) 
{
     int sum = 0;
     for(int i = 1; i <= 10; i++)
        sum += i;
        
        cout << "sum =  " << sum  << "\n";

    return 0;
}

執行結果: 

sum =  55

 

 

另外,比較常見的就是 for迴圈會做成巢狀迴圈的,譬如九九乘法表就是喜歡用的例子。


而比較少見的,卻也是正常的就是....
三個運算式(設定初值; 判斷條件; 設定增減量)的設定值也可以是浮點數。

 

例: 

#include<iostream>

using namespace std;

int main(int argc, char** argv)
{
    long double capital = 0;
    long double interest = 0.0;
    
    cout << fixed << cout.precision(3); 
    cout << "輸入貸款金額(7位數以內) :  ";   // 只能輸入7位數金額...8位數就亂進位 
    cin >> capital;
    cout << "\n貸款金額 : " << capital << "\n\n";
    
    
    for(float rate = 0.002; rate < 0.008; rate += 0.001)
        {
          interest = capital * rate; 
         cout << "月利率 " << rate * 100 << "% 時 "  ;
            cout << "每月利息 =   " ;
            cout << interest << "\n"; 

        }
    
    return 0;
 } 


三個運算式的任一個運算式的變數也可以很多個。

我們來假設一個例子:
 
a車是等加速度,每秒增加時速15公里
b車並不是等加速度,b車每秒可增加速度是a車車速的30%
一起出發幾秒後,b車車速可以超過a車車速


#include <iostream>

using namespace std;

int main(int argc, char** argv)
{
    int a = 0;
    float b = 0;
    int count = 0;
    
    for(a = 0, b = 0; b <= a; a += 15, b += a * 0.3)
    {
        cout << "\n第 " << count << " 秒 ";
        cout << "\na車速 =   " << a;
            cout << "\nb車速 =   " << b;
         
            cout << "\n\n";
         
        if(count > 100)
        break;
        
        count++;
    }
    
            cout << "\n第 " << count << " 秒 b車速度超過 a車"; 
            cout << "\na =   " << a;
            cout << "\nb =   " << b;

            cout << "\n\n";
    

    return 0;
 } 

 
答案是:


第 0 秒
a車速 =   0
b車速 =   0


第 1 秒
a車速 =   15
b車速 =   4.5


第 2 秒
a車速 =   30
b車速 =   13.5


第 3 秒
a車速 =   45
b車速 =   27


第 4 秒
a車速 =   60
b車速 =   45


第 5 秒
a車速 =   75
b車速 =   67.5


第 6 秒 b車速度超過 a車
a =   90
b =   94.5


本例的重點在表達三個運算式的任一個運算式的變數也可以很多個。
for(a = 0, b = 0;     b <= a;     a += 15, b += a * 0.3)


而程式碼中的
if(count > 100)
break;

是在做一個保護機制,避免陷入無窮迴圈,超過100秒就不再計算了


三個運算式的變數也可以單獨或多重的省略。

當全部運算式都省略而變成 for(  ;  ;  ) 時,就變成無窮迴圈,這時候就要在迴圈中適當的加入中斷點以結束迴圈。

在回圈主體程式碼中加入類似
if(count > 100)
break;

當某個條件成立時就跳出迴圈,否則就真的變成無窮迴圈(電腦會有類似當機個表現,其實程式還在跑迴圈)

另一方面,for迴圈也可以做成空迴圈,例: 


for(int i = 1; i <1000000; i++); <-- 在這裡加上分號就成空迴圈了。

 

可別把一般迴圈不知不覺中寫成這樣,造成語意上的錯誤。當需要觀察某些執行結果時,可以做空迴圈來延遲程式執行速度。

 

 

for迴圈也可以配合if()判斷,在for迴圈的主體敘述中加入break; 或 continue;
若是在for回圈內加入 break; 時,只要if()判斷條件成立,就會直接跳出for迴圈主體。
若是在for回圈內加入 continue; 時,只要if()判斷條件成立,則會停止執行迴圈主體內continue後剩餘的敘述,跳過本次迴圈,而回到迴圈的開始處繼續執行。

 

 

 

 

延伸閱讀

 

[做中學 dev c++] dev c++

 

[伊蒙 dev c++] 視窗程式學習筆記

.

arrow
arrow
    全站熱搜

    伊蒙‧普羅客 發表在 痞客邦 留言(0) 人氣()