【不是惡夢的開始,而是再度的精進。 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後剩餘的敘述,跳過本次迴圈,而回到迴圈的開始處繼續執行。
延伸閱讀
.