在控制台打印菱形是个很经典的题目,考察的是对嵌套循环的使用。

题目的要求是,打印出如下菱形:




java 数字菱形 java输出菱形*号代码解析_算法


思路分析:

因为代码都是自上而下,从左往右一步步运行的,所以想要打印出这样的图形需要先拆解它,分析它的构成,拆成不同的小部分来完成,也有助于理清思路,简化代码。

上半部分:等腰三角形

不难看出菱形是由一个正的等腰三角形和一个倒的等腰三角形拼接而成,并且倒着的等腰三角形比正着的少一层。如图所示:


java 数字菱形 java输出菱形*号代码解析_开发语言_02


先看上面的等腰三角形,由于代码都是一行行自上而下打印的,所以可以一行行分析。不难发现等腰三角形第1行有1个点,第2行有2个点,第3行有3个点,所以第一步可以先用循环将点打印出来,保证数目是对的,代码如下(这里我循环初始值为0,总共5层,第0层1个点,第1层2个点,以此类推):

for(int i = 0; i < 5; i++) {//外层循环,表示层数
            for(int j = 0; j < i + 1; j++) { //内层循环,表示每层点的打印
                System.out.print("o ");
            }
            System.out.println(); //打完一层换一行
        }

打印结果如下:


java 数字菱形 java输出菱形*号代码解析_开发语言_03


第一步完成了,但是发现这是直角三角形,只有当左侧有了空格才可以成为等腰三角形。通过观察可以发现每一行的空格数是不一样的,空格自下而上是从0递增的,因此可以看出规律:第5层0个空格,第4层1个空格...第1层4个空格。因此我们在打印每一层的时候,可以先打印该层前面的空格数,再打印后面的点数:

for(int i = 0; i < 5; i++) {//外层循环,表示层数
            for(int j = 4 - i; j > 0;  j--) {//内层循环,表示每层左侧空格情况
                System.out.print(" ");
            }
    
            for(int j = 0; j < i + 1; j++) {//内层循环,表示每层点的打印
                System.out.print("o ");
            }
            System.out.println();//一层结束换行
        }

运行结果如下:


java 数字菱形 java输出菱形*号代码解析_java_04


2.下半部分:倒等腰三角形

通过上面的步骤,菱形的一半已经打印完毕了,剩下的一半是小一层的倒等腰三角形:


java 数字菱形 java输出菱形*号代码解析_Powered by 金山文档_05


同理,通过找规律观察出层数和左侧空格数的关系,代码如下:

for(int i = 0; i < 4; i++) {
            for(int j = 0; j < i + 1; j++) {
                System.out.print(" ");
            }
            
            for(int j = 4 - i; j > 0; j--) {
                System.out.print("o ");
            }
            System.out.println();
        }

打印出结果如下:


java 数字菱形 java输出菱形*号代码解析_开发语言_06


最后,将上下部分代码拼在一起就可以得到菱形了。

当然,我们可以通过将层数改成变量num,然后通过扫描器Scanner来输入想要的层数,让代码”活“起来。比如,我想要一个上半部分为10层的菱形,只需要在控制台输入10,即可得到这样一个大的菱形:


java 数字菱形 java输出菱形*号代码解析_Powered by 金山文档_07