java打印正金字塔,倒金字塔和“水影”金字塔

                                              -------哒哒~~~~~~~~~~

小小少年

   闲来无事,想起自己初学java的时候做的经典的无非就是打印出一些有意思的图形,心血来潮自己就写了这么一个打印金字塔的demo,自己回顾一下当初的感受,同时也  分享给初学java的同道中人,一起来培养编程的兴趣<(^-^)>。

金字塔图案

  1,问题分析

  我们都知道,打印输出的时候,都是从最左端输出,而这里,第一个星号是在中间。这实际是因为星号之前有很多空格。当我们使用问号来表示空格,实际的输出效果应该是图1.2的形式。

              

Java入门菱形金字塔 java星号金字塔_System

1.1              

Java入门菱形金字塔 java星号金字塔_Java入门菱形金字塔_02

  1.2

  从图中分析,我们可以看到本次打印出的金字塔有5行,每一行都会打印出几个空格,然后再打印出几个★号,这样我们就知道该如何确认程序的框架了。

public static void Triangle(){
for(int i = 1;i <= 5;i++){    //循环5次,打印5行
//打印空格数
                        //打印★数
out.pringln();      //打印出行数
        }
      }

  现在我们知道了需要的的行数,那么接下来我们需要确认空格数和★数有多少,我们来看它的规律。

2,寻找空格和★号的规律。

  从图中,我们可以发现:第1行的空格为4个,第2行是3个,第3行是2个,……,每行依次递减,直至最后一行空格数为0;而星号数目是第1行是1个,第2行是3,第3行是5,……,每行依次递增2,直至最后一行星号数为9。总结数据,我们可以得到表1.1所示的规律。

空格和星星的规律

行数

空格数

星星数

1


5-1 


1*2-1 

2


5-2 


2*2-1 

3


5-3 


 3*2-1

4


5-4 


 4*2-1

5


5-5 


 5*2-1

规律 

依次减1 

5-行数 

依次加2 

行数*2-1 

   根据图中我们可以发现这种规律,那么接下来是不是就简单了。

3,确定空格数

  由于每行空格数有着“5–行数”的规律。所以在第i行的时候,空格数就为5–i。所以我们只要把5–i个空格打印出来即可。

    

    

public static void Triangle(){
        for(int i = 1;i <= 5;i++){    //循环5次,打印5行
           for(int j = 1;j <= 5-i;j++){
              System.out.print(" ");     //打印空格数
           }             
 
                        //打印★数
          System.out.pringln();      //打印出行数
        }
      }

  注意打印空格数的时候不要输成了println();这样会换行的。

 

4,打印星星数

 

  由于每行星号数有着“行数*2–1”的规律。所以在第i行的时候,星号数就为2*i–1。所以我们只要把2*i–1个星号打印出来即可。

     

public static void Triangle(){
        for(int i = 1;i <= 5;i++){    //循环5次,打印5行
           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.pringln();      //打印出行数
          }
        }

  OK,程序到此分析完毕,而我们的正金字塔也打印出来了,我回顾了,你懂了吗?o( ̄▽ ̄)d

  

  正金字塔的思路就是这样,那么对应的倒金字塔的思路与此如出一辙,我就不在此一一写了,相信聪明的你能够很好的解决的,我就单纯的把倒金字塔空格和星星数的规律和我写的一个demo放在下面吧。

 

行数

空格数

星星数

1

0

1-1

9

5*2-1

2

1

2-1

7

4*2-1

3

2

3-1

5

3*2-1

4

3

4-1

3

2*2-1

5

4

5-1

1

1*2-1

规律

依次递增1

行数-1

依次递减2

行数*2-1(反向)

  ****哒哒****:关于菱形,大家可以参考我的随笔 javaScript打印正倒直线 来做哦。O(∩_∩)O嗯!

我的例子

  1,下面是我写的一个demo,大家可以参考看看哦。

package com.javase.demo;
import java.util.Scanner;
 
    /**
     * 金字塔
     * @author Mr.Zhang
     *
     */
    public class Pyramid {

	      static Scanner input = new Scanner(System.in);
	    /**
	     * *****打印金字塔*****
	     * 1,确定金字塔行数
	     * 2,确认空格数
	     * 3,确认星星数
	     * @param args
	     */
	    public static void main(String[] args) {

		      entrance();

	    }	    /**
	     * 入口项
	     */
	    public static void entrance() {
		      System.out.println("请选择(0--正金字塔,1--倒金字塔,2--菱形金字塔)");
		      String select = input.nextLine();

		      if(isNumber(select)){
			        int selectInt = Integer.parseInt(select);

			        switch(selectInt){
				          case 0:
					            uprightPyramid();
				            break;
				          case 1:
					            fallPyramid();
					            break;
				          case 2:
					            System.out.println("该功能尚未完善!");
					            break;
				          default:
					            System.out.println("请输入正确的选项!");
					            entrance();
					            break;
			        }
		      }else if(!select.equals(0) || !select.equals(1) || !select.equals(2)){
			        nullSuccess();
		      }
	    }	    /**
	     * 打印正金字塔
	     * @param input
	     */
	    public static void uprightPyramid() {
		      System.out.println("请输入行数:");
		      String row = input.nextLine();

		      if(isNumber(row)){
			        int rows = Integer.parseInt(row);
			        for(int i = 1;i <= rows;i++){  //循环输入的行数,

				          for(int j = 1;j <= rows - i;j++){  //输出循环每行的空格
					            System.out.print("   ");
				          }

				          for(int k = 1;k <= 2 * i - 1;k++){  // 输出循环每行的★
					            System.out.print("★");
				          }

				          System.out.println();
			        }
			          System.out.println("打印完成,线程结束");
		      }else{
			        nullSuccess();
		      }

	    }
	    /**
	     * 打印倒金字塔
	     */
	    public static void fallPyramid(){
		      System.out.println("请输入行数:");
		      String row = input.nextLine();
		      if(isNumber(row)){
			        int rows = Integer.parseInt(row);

			        for(int i = rows;i >= 1;i--){
				          for(int j = 0;j < rows-i;j++){  //打印空格数
					            System.out.print("   ");
				          }

				          for(int k = 0;k < i * 2 - 1;k++){  //打印★数
					            System.out.print("★");
				          }

				          System.out.println();
			        }

			        System.out.println("打印完成,线程结束");
		      }else{
			        nullSuccess();
		      }

	    }

	    /**
	     * 判断是否为数字
	     * @param str
	     * @return
	     */
	    public static boolean isNumber(String str){
		        boolean ok = false;
		        if(null != str && str.matches("^[0-9]+$")){
			          return true;
		        }
		      return ok;
	    }

	    /**
	     * 调用错误结果
	     */
	    public static void nullSuccess(){
		      System.out.println("您输入的不是数字,一遍浪去,不听话的孩子!");
	    }}