循环体里面也可以有循环,这就是所谓的循环嵌套。循环嵌套可以帮助我们解决很多问题,经常被用于按行列方式输出数据。例如:
/* 按行列方式输出九九乘法表 */
#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("
"); // 换行
}
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 不成立,内循环结束。
输出
,换行。
++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 不成立,内循环结束。
输出
,换行。
++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 |