Skip to main content

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~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~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

就上題來說,方法一 比較有效率。但有時候除了逐一過濾檢查之外,沒有更好的辦法。

練習:輸出 n 的所有正因數

某個整數的因數,可不會簡單到成等差數列分布。$$n$$n 的所有正因數是在 1 ~ n 之間每個可以整數 n 的整數。

int n;
cin >> n;
cout << n << " 的正因數有:";

int i=1;
while(i<=n)
{
    if(n%i==0)
    {
        cout << i << " ";
    }
    i = i+1;
}
cout << endl;
16 的正因數有:1 2 4 8 16