2016-10-11 170 views
3

我想打印以下圖案打印星使用的星星圖案的Java

 
     *  
*************** 
* * * * 
    * *  * * 
    *  * 
    * *  * * 
* * * * 
*************** 
     *   

我可以使用下面的代碼以打印圖案的兩個外金字塔:

public static void main(String[] args) { 
    int n = 8; 
    int i, j; 

    for (i = 1; i <= n; i++) { 
     for (j = i; j < n; j++) { 
      System.out.print(" "); 
     } 
     for (j = 1; j <= (2 * i - 1); j++) { 
      if (i == n || j == 1 || j == (2 * i - 1)) { 
       System.out.print("*"); 
      } else { 
       System.out.print(" "); 
      } 
     } 

     System.out.print("\n"); 

    } 
    for (i = n; i >= 1; i--) { 
     for (j = i; j < n; j++) { 
      System.out.print(" "); 
     } 
     for (j = 1; j <= (2 * i - 1); j++) { 
      if (i == n || j == 1 || j == (2 * i - 1)) { 
       System.out.print("*"); 
      } else { 
       System.out.print(" "); 
      } 
     } 
     System.out.print("\n"); 
    } 
} 

此打印模式爲

 
     *    
     * *    
    * *    
    *  *    
    *  *   
    *   *    
*   * 
*************** 
*************** 
*   * 
    *   * 
    *  * 
    *  * 
    * * 
     * * 
     *`` 

但是如何將這兩個結合起來形成星形?

回答

1

您可以暫時將打印存儲在2D char陣列中,並對其進行兩次修改,然後使用for循環打印陣列。

public static void main(String[] args) { 
int n = 8; 
char[][] temp = new char[][]; 
Arrays.fill(temp, ' '); 
int i, j; 

for (i = 1; i <= n; i++) { 
    for (j = 1; j <= (2 * i - 1); j++) { 
     if (i == n || j == 1 || j == (2 * i - 1)) { 
      temp[i][j] = '*'; 
     } 
    } 
} 
for (i = n; i >= 1; i--) { 
    for (j = 1; j <= (2 * i - 1); j++) { 
     if (i == n || j == 1 || j == (2 * i - 1)) { 
      temp[i][j] = '*'; 
     } 
    } 
} 

for (i = 0; i < n; i++) { 
    for (j = 0; j < n; j++) 
     System.out.print(temp[i][j]); 
    System.out.println(); 
} 

}

0

在我看來,你的循環是一樣的,只是一個代碼塊是升序和一個代碼塊下降。你可以組合兩個代碼塊,並使用第三個整數k來處理另一個模式。

public static void main(String[] args) { 
    int n = 8; 
    int i, j, k; 

    for (i = 1; i <= n; i++) { 
     k = n - i; 

     for (j = i; j < n; j++) { 
      if (/* TODO: handle k case */) { 
       System.out.print("*"); 
      } else { 
       System.out.print(" "); 
      } 
     } 

     for (j = 1; j <= (2 * i - 1); j++) { 
      if (i == n || j == 1 || j == (2 * i - 1)) { 
       System.out.print("*"); 
      } else if (/* TODO: handle k case */) { 
       System.out.print("*"); 
      } else { 
       System.out.print(" "); 
      } 
     } 

     System.out.print("\n"); 
    } 
} 

有意義嗎?

2

既然你沒有指定你的限制是什麼?

public static void main(String[] args) { 
    System.out.println("  *  "); 
    System.out.println("***************"); 
    System.out.println(" * * * * "); 
    System.out.println(" * *  * * "); 
    System.out.println(" *  * "); 
    System.out.println(" * *  * * "); 
    System.out.println(" * * * * "); 
    System.out.println("***************"); 
    System.out.println("  *  "); 
} 

現在很明顯,是不是你打算做什麼,但下一次會有所幫助,如果你有更具體的瞭解您的要求,即:「我必須做的只有使用for」,「我不允許多次打印一個字符在一個時間」,「該代碼必須能夠打印任何明星的一個給定寬度「等。
因爲如果沒有這些限制那麼最好的方法就是打印上面的ASCII行。