for循环的嵌套使用
下图中的图形题在考查循环知识点时中经常出现,在等级考试与公司面试时也出现过类似题目,实际目的在于掌握for循环的嵌套使用。
1.金字塔
- 首先我们来思考一下金字塔是如何实现的,以五行的金字塔为例,
第1行是4个空格,1个*
第2行是3个空格,3个*
第3行是2个空格,5个*
第4行是1个空格,7个*
第5行是0个空格,9个* - 可以看出行数与空格之间满足等差数列,行数与*之间也满足等差数,等差数列通项公式:y=x+(n-1)d;(y:空格数、*数;x:所在行数;n:总行数)
- 所以得出:空格与所在行数的等差关系为:y=5-x;*与所在行数的关系为y=2x-1.
- 代码如下:
//金字塔
//空格:y=5-x;*:y=2x-1
for (int i = 1; i <= 5; i++) {//一共有五行,循环五次
for (int j = 1; j <= 5 - i; j++) {//输出每行的空格数
System.out.print(" ");
}
for (int k = 1; k <= 2 * i - 1; k++) {//输出每行的*号数
System.out.print("*");
}
System.out.println("");//换行
}
2.倒金字塔
- 有了金字塔的练习,倒金字塔就很好理解了,一样的道理找到每行空格、*与行数的对应关系
- 代码如下 :
//倒金字塔
//空格:y=x-1;*:y=11-2x
for (int i = 1; i<=5;i++)
{
for(int j =1; j<=i-1;j++)
{
System.out.print(" ");
}
for (int j =1; j<=11-2*i;j++)
{
System.out.print("*");
}
System.out.println();
}
3.空心金字塔
- 空心金字塔就是将实心金字塔每行输出的*号改成每行只输出金字塔的边界,其余输出空格
- 代码如下:
//空心金字塔
//空格:y=5-x;*:y=2x-1
for (int i = 1; i<=5;i++)//需要输出5行
{
for(int j =1; j<=5-i;j++)//输出每行的空格
{
System.out.print(" ");
}
for (int j =1; j<=2*i-1;j++)//输出每行的*号
{
if(i==5||j==1||j==2*i-1)//只需输出每行头尾的*号
{
System.out.print("*");
}
else//其余也是输出空格
{
System.out.print(" ");
}
}
System.out.println();
}
4.空心倒金字塔
- 同理,代码如下:
//空心倒金字塔
//空格:y=x-1;*:y=11-2x
for (int i = 1; i<=5;i++)//需要输出5行
{
for(int j =1; j<=i-1;j++)
{
System.out.print(" ");
}
for (int j =1; j<=11-2*i;j++)//输出每行的*号
{
if(i==1||j==1||j==11-2*i)//只需输出每行头尾的*号
{
System.out.print("*");
}
else//其余也是输出空格
{
System.out.print(" ");
}
}
System.out.println();
}
5.实心菱形
- 前面我们写了实心(倒)金字塔,一种办法就是把两段代码拼起来,但是要注意的是,要考虑边界值(这种方法就不在细讲,直接贴代码);
- 代码如下:
//实心菱形
for (int i = 1; i < 4; i++) {//金字塔,只输出4行
for (int j = 1; j <= 4 - i; j++) {
System.out.print(" ");
}
for (int k = 1; k <= 2 * i - 1; k++) {
System.out.print("*");
}
System.out.println("");
}
for (int i = 1; i <= n; i++) {//倒金字塔,输出5行
for (int j = 1; j <= i-1; j++) {
System.out.print(" ");
}
for (int k = 1; k <= 11-(2 * i) ; k++) {
System.out.print("*");
}
System.out.println("");
}
- 下面讲另一种方法,我们注意到,菱形是一种对称图形,上半部分空格与*号与下半部分正好相对,所以,我们可以借助绝对值的知识对整个图形进行输出。
- 代码如下:
//实心菱形
for (int i = -4, L; i <= 4; i++) {//需要输出9行
for (int j = 1; j <= Math.abs(i); j++) {//Math.abs(i)取i的绝对值,输出每行空格
System.out.print(" ");
}
L = 9 - 2 * Math.abs(i);//通项公式+绝对值,推出整个菱形的*号输出规律
for (int j = 1; j <= L; j++) {//输出每行*号
System.out.print("*");
}
System.out.println();
}
6.实心沙漏
- 有了上面的菱形对称图形的思想和绝对值概念的加入,沙漏图形也是一样的道理
- 代码如下:
//实心沙漏
for (int i = -4; i<=4;i++)//需要输出9行
{
for(int j =1; j<=4-Math.abs(i);j++)
{
System.out.print(" ");//输出每行空格
}
for (int j =1; j<=2*Math.abs(i)+1;j++)
{
System.out.print("*");//输出每行*号
}
System.out.println();
}
7.空心菱形
- 空心菱形就是在实心菱形的基础上,控制对每行边界值的输出为*号即可;
- 代码如下:
//空心菱形
for (int i = -4, L; i <= 4; i++) {//需要输出9行
for (int j = 1; j <= Math.abs(i); j++) {//输出每行空格
System.out.print(" ");
}
L = 9 - 2 * Math.abs(i);
for (int j = 1; j <= L; j++) {//输出每行*
if (Math.abs(i) == 4 || j == 1 || j == L) {//只输出每行头尾的*号
System.out.print("*");
} else {//其余输出空格
System.out.print(" ");
}
}
System.out.println();
}
8.空心沙漏
- 同理,代码如下:
//空心沙漏
for (int i = -4; i<=4;i++)//需要输出9行
{
for(int j =1; j<=4-Math.abs(i);j++)//输出每行空格
{
System.out.print(" ");
}
for (int j =1; j<=2*Math.abs(i)+1;j++)//输出每行*
{
if(i==-4||i==4||j==1||j==2*Math.abs(i)+1)//只输出每行头尾的*号
{
System.out.print("*");
}
else//其余输出空格
{
System.out.print(" ");
}
}
System.out.println();
}