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 只能跳出最内层的循环或 switch , continue 也只能终止最内层循环并回到该循环的开头。
用循环也可以打印表格式的数据,比如打印小九九乘法表:
例 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 字符称为制表符。
习题
上面打印的小九九有一半数据是重复的,因为 8*9 和 9*8 的结果一样。请修改程序打印这样的小九九:
plaintext1 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编写函数
diamond打印一个菱形。如果调用diamond(3, '*')则打印:plaintext* * * * *如果调用
diamond(5, '+')则打印:plaintext+ + + + + + + + + + + + +如果用偶数做参数则打印错误提示。