C語言中文網 目錄

for循環嵌套,C語言for循環嵌套詳解

前面我們講的是單個 for 循環的使用,最后再跟大家講一下多層 for 之間的嵌套使用。雖說是多層,事實上 for 循環嵌套的層數也不能太多。通常為兩個 for 循環的嵌套,超過兩個的極少使用。

與單個 for 循環相比,多個 for 循環的嵌套在邏輯上更復雜一點,但并不難懂。直接給大家寫一個程序:
# include <stdio.h>
int main(void)
{
    int i, j;
    for (i=0; i<4; ++i)
    {
        printf("問世間情是何物, 直教生死相許\n");
        for (j=0; j<3; ++j)
        {
            printf("兩情若是久長時, 又豈在朝朝暮暮\n");
        }
    }
    return 0;
}

輸出結果是:
問世間情是何物, 直教生死相許
兩情若是久長時, 又豈在朝朝暮暮
兩情若是久長時, 又豈在朝朝暮暮
兩情若是久長時, 又豈在朝朝暮暮
問世間情是何物, 直教生死相許
兩情若是久長時, 又豈在朝朝暮暮
兩情若是久長時, 又豈在朝朝暮暮
兩情若是久長時, 又豈在朝朝暮暮
問世間情是何物, 直教生死相許
兩情若是久長時, 又豈在朝朝暮暮
兩情若是久長時, 又豈在朝朝暮暮
兩情若是久長時, 又豈在朝朝暮暮
問世間情是何物, 直教生死相許
兩情若是久長時, 又豈在朝朝暮暮
兩情若是久長時, 又豈在朝朝暮暮
兩情若是久長時, 又豈在朝朝暮暮


其實,多層 for 循環嵌套的執行過程與單個 for 循環的執行過程是一模一樣的。多層 for 循環的嵌套只不過是將單個 for 循環大括號中的“語句”換成了 for 循環而已。

下面看看上面程序中兩個 for 循環嵌套是怎么執行的。
1) 首先求解表達式 1,即給變量 i 賦初值,i=0;表達式 1 只執行這一次,下面都不會再執行了。

2) 然后求解表達式 2,即 0<4 成立,則執行 for 循環中的內嵌語句: 
printf("問世間情是何物, 直教生死相許\n");
for (j=0; j<3; ++j)
{
    printf("兩情若是久長時, 又豈在朝朝暮暮\n");
}
首先 “printf("問世間情是何物,直教生死相許\n")”,然后執行內部 for 循環,對這個 for 循環再次應用“單個 for 循環”的執行過程:
  1. 首先求解表達式 1,即給變量 j 賦初值,j=0。
  2. 然后求解表達式 2,即 0<3 成立,則執行 for 循環中的內嵌語句,即 “printf("兩情若是久長時,又豈在朝朝暮暮\n");”。
  3. 然后執行表達式 3,變量 j 自加 1,即變量 j 由 0 變為 1。
  4. 然后求解表達式 2,即 1<3 成立,則執行 for 循環中的內嵌語句,即“printf("兩情若是久長時,又豈在朝朝暮暮\n");”。
  5. 然后執行表達式 3,變量 j 自加 1,即變量 j 由 1 變為 2。
  6. 然后求解表達式 2,即 2<3 成立,則執行 for 循環中的內嵌語句,即“printf("兩情若是久長時,又豈在朝朝暮暮\n");”。
  7. 然后執行表達式 3,變量 j 自加 1,即變量 j 由 2 變為 3。
  8. 然后求解表達式 2,即 3<3 不成立,則內部的循環結束。對內部的 for 而言循環是結束了,但對外部的 for 而言,“for 循環的執行”過程才執行到表達式 3。
3) 然后執行表達式 3,變量 i 自加 1,即變量 i 由 0 變為 1。

4) 然后再求解表達式 2……
……

就這樣一直循環下去,直到外層循環結束,整個循環才結束。

總之,不管是單個 for 循環還是多個 for 循環的嵌套,它們的執行過程是一樣的。只不過如果是“多個 for 循環的嵌套”,則其執行過程也是嵌套的。

for循環嵌套編程練習

1) 求出 1!+2!+3!+…+n!的和。

對于這個程序前面用一個for編程也可以實現,但是邏輯性太強,現在再用for循環嵌套編程實現一下:
# include <stdio.h>
int main(void)
{
    int n = 0;  //存儲1!+2!+3!+…+n!中n的值
    int i = 0, j = 0;  //循環變量
    int m = 1;  //用于計算每個數的階乘
    unsigned long sum=0;  /*階乘的值往往很大, 定義成long型。雖然如此, 下面輸入的n的值也不能太大, 不然long也放不下*/
    printf("請輸入n的值:");
    scanf("%d", &n);
    for (i=1; i<=n; ++i)
    {
        for (j=1; j<=i; ++j)  //求一個數的階乘
        {
            m = m*j;
        }
        sum = sum + m;  //求完之后就立即把它加到sum中
        m = 1;
    }
    printf ("sum = %ld\n", sum);
    return 0;
}
輸出結果是:
請輸入n的值:10
sum = 4037913

我們看到 n 的值僅為 10 結果就這么大,要再大點 long 類型肯定是存放不了的。此外,有人可能會糾結這樣的問題,程序開頭定義那么多變量,可是我寫的時候怎么知道后面要用到哪些變量呢?其實,這些變量都不是剛開始寫程序的時候就定義的,大多數情況下都是“若剛開始知道定義哪些變量那么就定義上,如果不知道那就不定義,等到后面需要用再回到前面進行定義”,這才是正常的邏輯。

2) 求出用 50元、20元 和 10元換算 100元有幾種方式?

思路:用窮舉法, 將所有可能的情況都列出來, 用 for 循環可以實現窮舉
分析:100 元單用 50 換算, 最多需要兩張;用 20 元換算, 最多需要五張;用 10 元換算最多需要十張
# include <stdio.h>
int main(void)
{
    int w, e, s;  //w代表wushi;e代表ershi;s代表shi
    for (w=0; w<=2; ++w)
    {
        for (e=0; e<=5; ++e)
        {
            for (s=0; s<=10; ++s)
            {
                if (100 == 50*w+20*e+10*s)
                {
                    printf("%d  %d  %d\n", w, e, s);
                }
            }
        }
    }
    return 0;
}
輸出結果是:
0  0  10
0  1  8
0  2  6
0  3  4
0  4  2
0  5  0
1  0  5
1  1  3
1  2  1
2  0  0

3) “百錢買百雞”是中國古代一個著名的枚舉法題目。所謂枚舉就是將所有可能的情況全部列出來的意思。for 循環嵌套是實現枚舉的一種手段,上面的換算也是一種枚舉。假設公雞 5 元一只,母雞 3 元一只,小雞 1 元 3 只,現在給你 100 元,要你買回 100 只雞,求出公雞、母雞、小雞分別為多少只。 
# include <stdio.h>
int main(void)
{
    int x, y, z;  //x、y、z 分別表示公雞、母雞、小雞
    for (x=0; x<20; ++x)
    {
        for (y=0; y<33; ++y)
        {
            z = 100 - x - y;  //小雞也可以用循環,但是能用二層循環解決的就不要用三層。
            if ((0 == z%3) && (100 == 5*x + 3*y + z/3))  //將 0==z%3 放前面更好,因為 && 是“短路與”,前面不成立后面就不會執行了,所以把計算量小的放前面。
            {
                printf("x = %d, y = %d, z = %d\n", x, y, z);
            }
        }
    }
    return 0;
}
輸出結果是:
x = 0, y = 25, z = 75
x = 4, y = 18, z = 78
x = 8, y = 11, z = 81
x = 12, y = 4, z = 84

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo