5. 嵌套循環

上一節求素數的例子在循環中調用一個函數,而那個函數里面又有一個循環,這其實是一種嵌套循環。如果把那個函數的代碼拿出來寫就更清楚了:

例 6.2. 用嵌套循環求1-100的素數

#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. 打印小九九

#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;
}

內循環每次打印一個數,數與數之間用兩個空格隔開,外循環每次打印一行。結果如下:

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的結果一樣。請修改程序打印這樣的小九九:

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, '*')則打印:

	*
*	*	*
	*

如果調用diamond(5, '+')則打印:

		+
	+	+	+
+	+	+	+	+
	+	+	+
		+

如果用偶數做參數則打印錯誤提示。