跳转到内容

5. 嵌套循环

上一节求素数的例子在循环中调用一个函数,而那个函数里面又有一个循环,这其实是一种嵌套循环。如果把那个函数的代码拿出来写就更清楚了:

例 6.2. 用嵌套循环求 1-100 的素数

c
#include <stdio.h>

int main(void) {
    int i, j;
    for (i = 1; i <= 100; i++) {
        for (j = 2; j < i; j++)
            if (i % j == 0) break;
        if (j == i) printf("%d\n", i);
    }
    return 0;
}

现在内循环的循环变量就不能再用 i 了,而是改用 j ,原来程序中 is_prime 函数的参数 n 现在直接用 i 代替。在有多层循环或 switch 嵌套的情况下, break 只能跳出最内层的循环或 switchcontinue 也只能终止最内层循环并回到该循环的开头。

用循环也可以打印表格式的数据,比如打印小九九乘法表:

例 6.3. 打印小九九

c
#include <stdio.h>

int main(void) {
    int i, j;
    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= 9; j++) printf("%d  ", i * j);
        printf("\n");
    }
    return 0;
}

内循环每次打印一个数,数与数之间用两个空格隔开,外循环每次打印一行。结果如下:

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

结果有一位数的有两位数的,这个表格很不整齐,如果把打印语句改为 printf("%d\t", i*j); 就整齐了,所以 Tab 字符称为制表符。

习题

  1. 上面打印的小九九有一半数据是重复的,因为 8*9 和 9*8 的结果一样。请修改程序打印这样的小九九:

    plaintext
    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
  2. 编写函数 diamond 打印一个菱形。如果调用 diamond(3, '*') 则打印:

    plaintext
        *
    *   *    *
        *

    如果调用 diamond(5, '+') 则打印:

    plaintext
            +
        +   +    +
    +   +   +    +    +
        +   +    +
            +

    如果用偶数做参数则打印错误提示。