C 語言初學教材 - 第三章 迴圈中的迴圈

迴圈中也可以用另一個迴圈處理工作,這樣的迴圈也被稱為巢狀迴圈。



巢狀迴圈也是很常見的應用之一,例如我們可以利用巢狀迴圈來印出九九乘法表
#include <stdio.h>

int main(void)
{
    int i, j; //迴圈變數
    
    printf("九九乘法表\n");
    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++) {
            printf("%3d ", i * j);
        }
        printf("\n");
    }
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:nn.c
    功能:示範利用巢狀迴圈印出九九乘法表
    作者:張凱慶
    時間:西元2010年7月 */


編譯後執行,結果如下



因為有兩層迴圈,所以需要兩個迴圈變數,此例中,我們用了 i 及 j 兩個迴圈變數。


這個巢狀迴圈是怎麼運作的呢? i 等於 1 的時候, j 從 1 、 2 、 3 ... 到 9 跑了一次,然後 i 遞增成 2 , j 又從 1 、 2 、 3 ... 到 9 跑了一次,餘下 i 等於 3 、 4 、 5 、 6 、 7 、 8 、 9 , j 同樣從 1 、 2 、 3 ... 到 9 跑了一次。


因此,按順序就得到個別的乘積,一列一列的印出九九乘法表出來。


我們再用另一個例子說明巢狀迴圈的應用,以下是列印聖誕樹的例子
#include <stdio.h>

int main(void)
{
    int i, j; //迴圈變數
    int s;
    
    s = 6;
    for (i = 0; i < 7; i++) {
        for (j = 0; j < s; j++) {
            printf(" ");
        }
        s--;
        
        for (j = 0; j < 2 * i + 1; j++) {
            printf("*");
        }
        
        printf("\n");
    }
    
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 5; j++) {
            printf(" ");
        }
        
        for (j = 0; j < 3; j++) {
            printf("*");
        }
        
        printf("\n");
    }
    
    printf("\n");
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:ct.c
    功能:示範利用巢狀迴圈印出聖誕樹
    作者:張凱慶
    時間:西元2010年7月 */


編譯執行結果如下



這個例子看起來更複雜一點,原理其實很簡單,就是把所要印出的完整圖形,拆解成數個圖形就行了。


第一個 for 迴圈印到第 7 行,第二個 for 迴圈印餘下 4 行,兩個迴圈裡另有兩個 for 迴圈,這是因為我們總共有兩種符號頁列印,一種是空格 ' ' ,另一種是星號 '*' 。


所以兩個巢狀 for 迴圈就是兩個大子圖,每一個巢狀 for 迴圈各有兩個子圖,分別是印出 ' ' 及 '*' 的 for 迴圈。因此,全部可以看成有四個子圖,如下



四個子圖分別是用橘色、藍色、紅色、黃色框起來的部份,這樣理解怎麼畫出這棵聖誕樹了嗎?


問題與討論
  1. 說明印出九九乘法表的方法。
  2. 說明聖誕樹的畫法。
  3. 替聖誕樹加一點裝飾,例如有些地方印 '#' ,有些地方印 '$' 。
  4. 嘗試畫大一點的聖誕樹,想一想,有哪些地方需要做調整?




沒有留言: