4.1 while 迴圈
程式執行流程結構
目前為止我們學過了兩種程式執行的流程結構,(1)循序結構;(2)選擇結構。

接下來我們要學的是 重覆結構,也就是可以重覆執行一段程式。
while
練習:輸出一行,共 5 個 '*'
這個很簡單,只要一行 cout 就能搞定。
cout << "*****" << endl;
那如果是這題呢?
練習:輸出一行,共 375 個 '*'
我們不太可能傻傻的在字串裡一邊打字一邊數 375 個吧?我們想要的是重覆 cout << '*'; 375 次。而且要簡單明瞭,不是複製後貼上 375 次。
在這裡我們引入 while 敘述,它可以在指定條件成立時,不斷重覆指定的工作,直到該條件不再成立為止。
while 的基本語法如下:

就輸出 375 個 '*' 來說,使用 while 可以這麼做。
int i=1;
while(i<=375)
{
cout << '*';
i = i+1; // 這行如果忘記,迴圈永遠不會結束
}
cout << endl;
請注意在這個 while 迴圈中,變數 i 擔任的角色。它一開始的初值是 1,每執行一次會遞增 1,當 i 大於 375 之後,就離開迴圈。這是一個「計數器」的角色,我們利用一個變數來記錄這個迴圈繞到第幾圈了。
練習:輸出一行,共 n 個 '*'
如果我們要程式更有彈性一點,由使用者指定要輸出的 '*' 數量 n。
只要把前一個程式的 375 改成變數 n 即可。
int n;
cin >> n;
int i=1;
while(i<=n)
{
cout << '*';
i = i+1;
}
cout << endl;
雖然在前面的例子裡我們說 i 擔任「計數器」的角色,但它本質上就只是個變數,也可以參與到迴圈內的計算、輸出......。
練習:輸出 1~n
在這個例子裡,我們在迴圈的每一圈輸出 i 當下的值。
int n;
cin >> n;
int i=1;
while(i<=n)
{
cout << i << " ";
i = i+1;
}
cout << endl;
5
1 2 3 4 5
1 2 3 4 5
接下來這題我們來看兩種做法。
輸出 1~n 之間的奇數
方法一: 首項為1,公差為2 的等差數列
int n;
cin >> n;
int i=1; // 首項為 1
while(i<=n)
{
cout << i << " ";
i = i+2; // 公差為 2
}
cout << endl;
10
1 3 5 7 9
1 3 5 7 9
方法二: 在 1~n 之間,逐一過濾符合條件的才輸出
int n;
cin >> n;
int i=1;
while(i<=n)
{
if(i%2==1)
{
cout << i << " ";
}
i = i+1;
}
cout << endl;
10
1 3 5 7 9
1 3 5 7 9
就上題來說,方法一 比較有效率。但有時候除了逐一過濾檢查之外,沒有更好的辦法。
練習:輸出 n 的所有正因數
某個整數的因數,可不會簡單到成等差數列分布。$$n$$