Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15198763
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-03-20 18:50:03

来源: 作者:antigloss 等级:精品
发布于2006-10-15 13:16 被读2788次 【字体: 】

    循环体里面也可以有循环,这就是所谓的循环嵌套。循环嵌套可以帮助我们解决很多问题,经常被用于按行列方式输出数据。例如:

        /* 按行列方式输出九九乘法表 */

        #include <stdio.h>

        #define   ROWS   9                  // 九九乘法表一共只有九行

        int main(void)
        {
            int i, j;

            for ( i = 1; i <= ROWS; ++i )   // 外循环控制输出多少行
            {
                for ( j = 1; j <= i; ++j )  // 内循环控制输出多少列
                {
                    printf("%d ", i * j);   // 输出乘积
                }
                printf("\n");               // 换行
            }

            return 0;
        }

在对这个例子进行详细讲解之前,我们先来了解一下循环嵌套的其它特性。

    并非一定要同种结构的循环才能进行嵌套。for 循环里面可以嵌套 while/do while 循环,while 循环里也可也嵌套 for/do while 循环。循环体里可以嵌套多个内循环,内循环里还可以嵌套内循环。例如:

        while ( condition1 )
        {
            do
            {
                for ( expr1; expr2; expr3 )
                {
                    for ( expr4; expr5; expr6 )
                    {
                        /* ... ... */
                    }

                    /* ... ... */
                }

                /* ... ... */
            } while ( condition2 ) ;

            for ( expr7; expr8; expr9 )
            {
                while ( condition3 )
                {
                    /* ... ... */
                }

                /* ... ... */
            }

            while ( condition4 )
            {
                /* ... ... */
            }

            /* ... ... */
        }

下面我们来讨论一下前面那个九九乘法表的例子。

    本例中的外循环共循环 9 次(即一共输出九行),当 i 等于 10 时循环终止。外循环的每轮循环都会执行内循环,在外循环的每轮循环中,内循环的循环次数都不相同。因为外循环的每轮循环都会使 i 增 1,而且 j 的值也会被重新赋值为 1,而内循环的结束条件是 j <= i,且内循环的每轮循环中 j 只增加 1,所以外循环每循环一次,内循环的循环次数就增加一次:在外循环的第一轮循环,内循环的循环次数为 1;在外循环的第二轮循环,内循环的循环次数为 2;在外循环的第三轮循环,内循环的循环次数为 3……下面我们模拟一下本例的运行过程。

    1. 外循环第一轮循环

        i 的值为 1(以下简写为 i = 1),故而 i <= ROWS 成立,进入循环体:

            1). 内循环的第一轮循环

                j = 1,故而 j <= i 成立,进入循环体:

                    输出 i * j(即 1 * 1)的乘积和一个空格,即 1

                ++j --> j = 2,j <= i 不成立,内循环结束。

            输出 \n,换行。

        ++i --> i = 2,故而 i <= ROWS 成立,开始第二轮循环。

    2. 外循环第二轮循环

            1). 内循环的第一轮循环

                j = 1,j <= i 成立,进入循环体:

                    输出 i * j ( 2 * 1 ) 和一个空格,即 2

                ++j --> j = 2,j <= i 仍然成立,开始第二轮循环。

            2). 内循环的第二轮循环

                    输出 i * j ( 2 * 2 ) 和一个空格,即 4

                ++j --> j = 3,j <= i 不成立,内循环结束。

            输出 \n,换行。

        ++i --> i = 3,i <= ROWS 成立,开始第三轮循环。

至此,输出结果为:

        1
        2 4

外循环第三轮循环至第九轮循环从略,请读者自行模拟一次。

    3. 外循环第三轮循环

        /* ... ... */

    4. /* ... ... */

    /* ... ... */

    9. 外循环第九轮循环

        /* ... ... */

        ++i --> i = 10,i <= ROWS 不成立,外循环结束。

最终的输出结果为:

    1
    2 4
    3 6 9
    4 8 12 16
    5 10 15 20 25
    6 12 18 24 30 36
    7 14 21 28 35 42 49
    8 16 24 32 40 48 56 64
    9 18 27 36 45 54 63 72 81

参考资料:C Primer 5th Edition
          The C Programming Language 2nd Edition
          C99 标准

本文版权归 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。

阅读(599) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~