5. 嵌套循环

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

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

  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5. int i, j;
  6. for (i = 1; i <= 100; i++) {
  7. for (j = 2; j < i; j++)
  8. if (i % j == 0)
  9. break;
  10. if (j == i)
  11. printf("%d\n", i);
  12. }
  13. return 0;
  14. }

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

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

例 6.3. 打印小九九

  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5. int i, j;
  6. for (i=1; i<=9; i++) {
  7. for (j=1; j<=9; j++)
  8. printf("%d ", i*j);
  9. printf("\n");
  10. }
  11. return 0;
  12. }

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

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

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

习题

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

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

2、编写函数diamond打印一个菱形。如果调用diamond(3, '*')则打印:

  1. *
  2. * * *
  3. *

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

  1. +
  2. + + +
  3. + + + + +
  4. + + +
  5. +

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