一.实例说明:
本实例在输出菱形的基础上加大了难度,输出空心的菱形图案。在等级考试与公司面试时也出现过类似题目,实际目的在于掌握for循环的嵌套使用。
二.设计过程:
像这种复杂问题我们也可以先从简单处着手,如果要打印空心菱形,可以沿着“金字塔——>空心金字塔——>空心菱形”这一思路进行。实现如下:
(一)金字塔
1.需求:在控制台打印一个由5行“*”组成的金字塔
2.分析:
首先行数5行是确定的,列数是不确定的。
第一行: i = 0; i < 5; j = 0; j < 4; 4个空白
k = 0; k < 1; 1个星号
第二行: i = 1; i < 5; j = 0; j < 3; 3个空白
k = 0; k < 3; 3个星号
第三行: i = 2; i < 5; j = 0; j < 2; 2个空白
k = 0; k < 5; 5个星号
……
由以上分析可知,每行空白的个数为 j < (5-1-i),每行星号的个数为 k < 2*i+1。
3.实例:
class Demo1{
public static void main(String[] args){
for(int i = 0;i < 5;i++){ //i控制金字塔行数
for(int j = 0;j < (5-1-i);j++){//j控制每行"*"前面的空格数
System.out.print(" ");
}
for(int k = 0;k < (2*i+1);k++){ //k控制要打印的"*"的个数
System.out.print("*");
}
System.out.println();
}
}
}
4.运行结果如下图所示:
(二)镂空金字塔
1.需求:在控制台上打印镂空金字塔。
2.分析:
镂空金字塔与完整金字塔比较,可以看出除了金字塔的各个边上是"*"号外,金字塔的内部全是用空格代替了“*”号。因此可以在打印每行的"*"号时判断是不是第一个“*”或者最后一个"*",如果不是则用空格替换掉。
3.实例:
class Demo2{
public static void main(String[] args){
for(int i = 0;i < 5;i++){ //i控制金字塔行数
for(int j = 0;j < (5-1-i);j++){//j控制每行"*"前面的空格数
System.out.print(" ");
}
for(int k = 0;k < (2*i+1);k++){ //k控制要打印的"*"的个数
if(i == 0||i==4){//如果是第一行或最后一行则将"*"全部打印
System.out.print("*");
}else if(k == 0||k == (2*i)){//如果要打印的"*"是第一个或最后一个则打印出来
System.out.print("*");
}else{//如果要打印的"*"不是第一个或最后一个则打印空格
System.out.print(" ");
}
}
System.out.println();
}
}
}
4.运行结果如下图所示:
(三)空心菱形
1.需求:在控制台上打印出空心菱形。
2.分析:
空心菱形可以看作两部分组成:上半部分和下半部分。而这两部分均属于空心金字塔类型。
3.实例:
class Demo3{
public static void main(String[] args){
for(int i = 0;i < 5;i++){ //i表示空心菱形上半部分行数;类似于金字塔行数
for(int j = 0;j < (5-1-i);j++){//j控制每行"*"前面的空格数
System.out.print(" ");
}
for(int k = 0;k < (2*i+1);k++){ //k控制要打印的"*"的个数
if(i == 0){//如果是第一行则将"*"全部打印
System.out.print("*");
}else if(k == 0||k == (2*i)){//如果要打印的"*"是第一个或最后一个则 //打印出来
System.out.print("*");
}else{//如果要打印的"*"不是第一个或最后一个则打印空格
System.out.print(" ");
}
}
System.out.println();
}//以上打印的是空心菱形的上半部分。
for(int i = 0;i < 4;i++){ //空心菱形的下半部分的行数比上半部分少一行;比如上 //半部分是5行,下半部分为4行才能构成菱形
for(int j = 0;j < (i+1);j++){//j控制每行"*"前面的空格数
System.out.print(" ");
}
for(int k = 0;k < 2*(4-i)-1;k++){ //k控制要打印的"*"的个数
if(i == 3){//如果是最后一行则将"*"全部打印
System.out.print("*");
}else if(k == 0||k == 2*(3-i)){//如果要打印的"*"是第一个或最后一个 //则打印出来
System.out.print("*");
}else{//如果要打印的"*"不是第一个或最后一个则打印空格
System.out.print(" ");
}
}
System.out.println();
}
}
}
4.运行结果如下图所示: