3.4 循环嵌套
在一个循环语句(外部循环)中包含另一个循环语句(内嵌循环),称为循环的嵌套,内嵌循环中还可以嵌套循环。3种循环(while循环、do-while循环和for循环)可以互相嵌套。
例3-5 下面程序的执行结果是什么?

分析:
程序中有两个变量i和j,外部循环的变量为i,内嵌循环的变量为j。当i的值为1时,i<=3成立,执行循环语句,而外部循环的循环语句又是一个for循环,也就是内嵌循环,循环变量为j,j的初值为1,判断j<=i是否成立,此时i的值为1,条件成立,执行循环语句,输出一个“*”,j的值变成2,再判断j<=i是否成立,条件不成立,退出循环,内嵌循环执行完毕,执行后面的输出换行符。然后外循环的第一轮循环语句执行完毕,i的值增加为2。
判断i<=3成立,执行循环语句,j的初值为1,判断j<=i是否成立,此时i的值为2,条件成立,执行循环语句,输出一个“*”,j的值变成2,再判断j<=i是否成立,条件仍成立,再输出一个“*”,j的值变化为3,判断j<=i是否成立,条件不成立,退出内嵌循环,执行后面的输出换行符。然后外循环的第二轮循环语句执行完毕,i的值增加为3。
判断i<=3成立,执行循环语句,而外部循环的循环语句又是一个for循环,也就是内嵌循环,循环变量为j,j的初值为1,判断j<=i是否成立,此时i的值为3,条件成立,执行循环语句,输出一个“*”,j的值变成2,再判断j<=i是否成立,条件仍成立,再输出一个“*”,j的值变化为3,判断j<=i是否成立,条件仍成立,再输出一个“*”,j的值变化为4,再判断j<=i是否成立,此时条件不成立,退出循环,内嵌循环执行完毕,执行后面的输出换行符。然后外循环的第三轮循环语句执行完毕。
所以,整个程序执行的结果为:
*
**
***
例3-6 要输出以下图形,需要怎样编写程序?
*
**
***
本例题跟例3-5之间的区别在于每行的“*”不是左对齐的,而是右对齐的,也就是在第一行先输出两个空格,再输出“*”,第二行先输出一个空格,再输出2个“*”,第三行直接输出3个“*”。
输出“*”的程序是跟例3-5一样的,唯一不同的是在外循环的循环语句中要加一个输出空格的for循环,程序如下:

第1行输出2个空格,第2行输出1个空格,第3行输出0个空格,行数和空格数的和正好为总行数3,因此用“j<=3-i”来控制每行输出的空格数。
思考:如果要输出如下图形,应该怎么编写程序?

例3-7 编程实现输出以下数字金字塔:
1
12
123
1234
分析:
要输出上述4行数字,每行数字都是从1开始,最大输出到行标,需要使用嵌套循环来实现。用外循环来控制行数,内嵌循环来控制每行的输出内容。程序如下:

外循环控制行数,因此变量i的范围要不超过4,内循环控制输出内容从1到行标,因此变量j不能超过行标i,最关键的一点是在每一轮外循环结束时,都要输出换行符,因此在内嵌循环的结尾要有printf("\n"),执行程序的结果如下:

分析:
例3-8中的数字金字塔跟例3-7每行输出的内容一样,不同之处在于每行数据是右对齐,不是左对齐。因此需要在每行输出数字之前先输出空格,并且空格的个数和数字的个数之和为4。因此在输出数据的内嵌循环前面需要加一个输出空格的for循环。程序如下:

因为每行输出空格的个数和输出数字的个数之和为4,因此输出空格时用“j<=4-i”来控制变量j的结束。程序执行结果如下所示:

例3-9 编程实现输出如下的数字金字塔:(https://www.daowen.com)
1
121
12321
1234321
这个数字金字塔跟例3-8里面的不同在于每行的后面又多了几个数字,而且是从每行的最大值开始递减到1的。因此在例3-8的程序基础上,在内嵌循环的后面再添加一个输出递减数字到1的for循环来实现数字金字塔右半部分的数字输出即可。程序如下:


程序执行结果如下所示:

例3-10 编程实现输出如下图形。
0
1 2
2 3 4
3 4 5 6
4 5 6 7 8
分析:
该数字金字塔共分5层,每层的输出数字序列是连续的,从行标减1开始,到2倍的行标减2结束。因此对于输出数字内容的for循环变量j的开始和结束可以通过行“i-1”和“2*i-2”来控制。程序如下:


例3-11 编程实现输出如下矩阵:
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
分析:
在上面的矩阵中,一共要输出共16个数,但是要4个一行,对齐显示。每行显示的数都是第一行的行标倍。因此程序如下:

执行结果为:

例3-12 编程实现输出如下矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
分析:
要输出从1到16之间的16个数,且每4个数一行,可以在程序中设置一个计数器t,用于每次循环记一次数。当t的值为4的倍数时,就输出一个换行,再输出该数;当t的值不是4的倍数时,只输出该数即可。程序如下:
