對於一個初學程式設計者而言,設計迴圈解決問題是一件很難的事,總是拿不到訣竅,本文在此演練幾種入門且重要的題目,希望對剛學迴圈結構的學者有些許幫助。
在此溫馨提醒,迴圈需要條件判斷,因此務必先熟練前面單元 "選擇結構" 。

解題步驟:
  1. 當設計者拿到問題後,請先使用非迴圈方式輸出部分內容 (至少輸出三次以上)。
  2. 觀察輸出部份有何關聯性 (相同處與不同處,不同處相互之間是否有何關係)。
  3. 觀察輸出的總次數是否為定值,若是則選擇計數迴圈,否則選擇條件迴圈。
  4. 將輸出相同處寫入迴圈本體,不同處使用變數控制輸出值。
  5. 將變數套入迴圈判斷中,並在迴圈本體適當控制變數,使得迴圈因變數的改變而中止。
問題一
請連續輸出 5 次 "Hello~",每次均跳行。
  1. 使用非迴圈方式依題意輸出輸出:
    cout << "Hello~" << endl;
    cout << "Hello~" << endl;
    cout << "Hello~" << endl;
    cout << "Hello~" << endl;
    cout << "Hello~" << endl;
  2. 觀察輸出關聯性:
    每一行均相同。
    cout << "Hello~" << endl;
  3. 題意輸出 5 次為定值,故使用計數迴圈。
  4. 將輸出相同處寫入迴圈本體。
    for ( ; ; ) {
          cout << "Hello~" << endl;
    }
  5. 將變數套入迴圈判斷中,並在迴圈本體適當控制變數,使得迴圈因變數的改變而中止。
  6. for ( int i = 0; i<3; i=i+1 ) {
          cout << "Hello~" << endl;
    }

問題二
請連續輸出 2 4 6 8 10 12 每次均空白隔開。
  1. 使用非迴圈方式依題意輸出輸出:
    cout << 2 << ' ';
    cout << 4 << ' ';
    cout << 6 << ' ';
    cout << 8 << ' ';
    cout << 10 << ' ';
    cout << 12 << ' ';
  2. 觀察輸出關聯性:
    每一行均相同處:
    cout <<    << ' ';
  3. 依題意,固定輸出 6 次為定值,故使用計數迴圈。
  4. 將輸出相同處寫入迴圈本體。
    for ( ; ; ) {
         cout <<    << ' ';
    }
  5. 將變數套入迴圈判斷中,並在迴圈本體適當控制變數,使得迴圈因變數的改變而中止。
  6. for ( int i = 2; i<=12; i=i+2 ) {
         cout <<  i  << ' ';
    }

問題三
請計算 1+2+3+4+5+6+7 之值,並將結果輸出。
  1. 使用非迴圈方式依題意輸出輸出:
    令變數 s = 0
    計算 s + 1 將結果存入變數 s (此時 s = 1)
    計算 s + 2 將結果存入變數 s (此時 s = 1+2)
    計算 s + 3 將結果存入變數 s (此時 s = 1+2+3)
    計算 s + 4 將結果存入變數 s (此時 s = 1+2+3+4)
    計算 s + 5 將結果存入變數 s (此時 s = 1+2+3+4+5)
    計算 s + 6 將結果存入變數 s (此時 s = 1+2+3+4+5+6)
    計算 s + 7 將結果存入變數 s (此時 s = 1+2+3+4+5+6+7)
  2. 觀察輸出關聯性:
    每一行均相同處:
    計算 s +    將結果存入變數 s
    相當於指令 s = s +
  3. 依題意,固定輸出 7 次為定值,故使用計數迴圈。
  4. 將輸出相同處寫入迴圈本體。
    for ( ; ; ) {
         s = s + ;
    }
  5. 將變數套入迴圈判斷中,並在迴圈本體適當控制變數,使得迴圈因變數的改變而中止。
  6. int s = 0; //s 必須初值為 0
    for ( int i = 1; i<=7; i=i+1 ) {
         s = s + i ;
    }


問題四
  請輸出 3 位數的阿姆斯特朗數。(每次輸出均跳行)
  阿姆斯特朗數定義如下:
  若一個 3 位數阿姆斯特朗數,則它的百位數字、拾位數字與個位數字的立方和恰等於本身。
  可以 google 一下 阿姆斯特朗數
   https://zh.wikipedia.org/wiki/%E6%B0%B4%E4%BB%99%E8%8A%B1%E6%95%B0
  1. 使用非迴圈方式依題意列出數字:(如下表格說明每次輸出內容與變數 a、b、c 關係)
    阿姆斯特朗數 百位 拾位 個位 立方和 是否相等
    100 1 0 0 1 No
    101 1 0 1 2 No
    102 1 0 2 9 No
    103 1 0 3 28 No
    ... ... ... ... ... ...

    令變數 w 是三位數字最小數 100
    令變數 x 是 w 百位數字、y 是 w 拾位數字、z 是 w 個位數字
    令變數 u 是 x、y、z、的立方和
    判斷 w 是否與 u 相等,若相等,則輸出 w

    下面各變數初值設定與各次運算的指令:
    阿姆斯特朗數 指令 變數內容
    100 w = 100;
    x = w / 100;
    y = (w / 10) % 10;
    z = w % 10;
    u = x*x*x + y*y*y + z*z*z;
    if (w == u) {
        cout << w << endl;
    }
    x = 1
    y = 0
    z = 0
    u = 1*1*1 + 0*0*0 + 0*0*0
       = 1
    101 w = 101;
    x = w / 100;
    y = (w / 10) % 10;
    z = w % 10;
    u = x*x*x + y*y*y + z*z*z;
    if (w == u) {
        cout << w << endl;
    }
    x = 1
    y = 0
    z = 1
    u = 1*1*1 + 0*0*0 + 1*1*1
       = 2
    102 w = 102;
    x = w / 100;
    y = (w / 10) % 10;
    z = w % 10;
    u = x*x*x + y*y*y + z*z*z;
    if (w == u) {
        cout << w << endl;
    }
    x = 1
    y = 0
    z = 2
    u = 1*1*1 + 0*0*0 + 2*2*2
       = 9
    103 w = 103;
    x = w / 100;
    y = (w / 10) % 10;
    z = w % 10;
    u = x*x*x + y*y*y + z*z*z;
    if (w == u) {
        cout << w << endl;
    }
    x = 1
    y = 0
    z = 3
    u = 1*1*1 + 0*0*0 + 3*3*3
       = 28
    ... ... ...

  2. 觀察每一次運算關聯性:
    每一次運算相同處:
    x = w / 100;
    y = (w / 10) % 10;
    z = w % 10;
    u = x*x*x + y*y*y + z*z*z;
    if (w == u) {
        cout << w << endl;
    }

  3. 依題意,三位數最小是 100,最大是 999 ,故使用計數迴圈。
  4. 將輸出相同處寫入迴圈本體。
    for ( ; ; ) {
         x = w / 100;
         y = (w / 10) % 10;
         z = w % 10;
         u = x*x*x + y*y*y + z*z*z;
         if (w == u) {
             cout << w << endl;
         }

    }
  5. 將變數套入迴圈判斷中,並在迴圈本體適當控制變數,使得迴圈因變數的改變而中止。
  6. int w, x, y, z, u;
    for ( w = 100; w<1000; w = w + 1) {
         x = w / 100;
         y = (w / 10) % 10;
         z = w % 10;
         u = x*x*x + y*y*y + z*z*z;
         if (w == u) {
             cout << w << endl;
         }

    }

問題五
  請輸出費式數列 前 6 項。(每次輸出均跳行)
  費氏數列定義如下:
  a1 = 1, a2 = 1
  an = an-1 + an-2
  可以 google 一下 費式數列
  https://zh.wikipedia.org/zh-tw/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97
  1. 使用非迴圈方式依題意輸出:(如下表格說明每次輸出內容與變數 a、b、c 關係)
    費氏數列項數 a1a2a3a4a5a6
    費氏數列11 2 3 5 8
    變數初值 x y        
    第 1 次運算 x y z      
    第 2 次運算   x y z    
    第 3 次運算     x y z  
    第 4 次運算       x y z

    令變數初值 x = a1 = 1, y = a2 = 1
    從第 3 項開始,也就是第 1 次運算,令變數 z = y + x,
    相當於 z = an ,y = an-1,x = an-2,帶入 n = 3
    z = a3 ,y = a2,x = a1
    因此第 1 次運算相當於 a3 = a2 + a1
    當第 2 次運算時,必須適當調整 x 與 y 值,使得滿足 an = an-1 + an-2
    帶入 n = 4,得 a4 = a3 + a2,因此必須 y = a3 、x = a2,才可以再使用 z = y + x
    第 1 次運算後 z = a3 ,y = a2,x = a1,故在第二次運算前須調整 x = y,y = z
    下面各變數初值設定與各次運算的指令:
      指令 變數內容
    變數初值 x = 1;
    y = 1;
    x = a1
    y = a2
    第 1 次運算 z = y + x;
    cout << z << endl;
    x = y;
    y = z;
    z = a3
    x = a2
    y = a3
    第 2 次運算 z = y + x;
    cout << z << endl;
    x = y;
    y = z;
    z = a4
    x = a3
    y = a4
    第 3 次運算 z = y + x;
    cout << z << endl;
    x = y;
    y = z;
    z = a5
    x = a4
    y = a5
    第 4 次運算 z = y + x;
    cout << z << endl;
    x = y;
    y = z;
    z = a6
    x = a5
    y = a6

  2. 觀察每一次運算關聯性:
    每一次運算相同處:
    z = y + x;
    cout << z << endl;
    x = y;
    y = z;

  3. 依題意,固定運算 4 次為定值,故使用計數迴圈。
  4. 將輸出相同處寫入迴圈本體。
    for ( ; ; ) {
         z = y + x;
         cout << z << endl;
         x = y;
         y = z;

    }
  5. 將變數套入迴圈判斷中,並在迴圈本體適當控制變數,使得迴圈因變數的改變而中止。
  6. int x = 1, y = 1, z; //x、y 必須初值為 x = a1、y = a2、z = an
    cout << x << endl << y << endl; //輸出 a1、a2
    for ( int i = 0; i<4; i=i+1 ) {
         z = y + x;
         cout << z << endl;
         x = y;
         y = z;

    }