2016-10-03 173 views
0

的問題似乎令人困惑,但它的要點是,我需要做的,比方說一個箭頭,N = 3,這看起來像如何用箭頭字符串「*」在箭頭上創建尾端?

* 
** 
*** 
** 
* 

我想尾部添加到這個三角形把它變成箭頭。它必須是長度(n-1)。所以:

* 
    ** 
***** 
    ** 
    * 

在這裏我的代碼到目前爲止,它只能讓你三角形。我似乎無法弄清楚如何獲得箭頭上的尾巴。任何幫助將是偉大的,謝謝!

public class Arrow 
{ 
public static void main (String[] args) 
{ 
double n=0; 
if (args.length < 1){ 
    System.out.println("Input a number"); 
    System.exit(0); // Terminate the program if user has not input a number 
    } 
    else 
    n = Double.parseDouble(args[0]); 

    String text = "*"; 
    int n1 = (int) n; 
    System.out.println(text); 
    for (int x = 1; x < n1; x++) { 
    System.out.println(text += "*"); 
    } 

    for (int i = (n1-1); i>0; i--) { 
    System.out.println(text = text.substring(0, text.length()-1)); 
    } 

}}

+2

在r = 3以外的行上,使用適當數量的空格開始行。在r = 3行,用許多星號開始。試着將問題分解爲基本要素,希望你會發現每一個要素都是可行的。 – yshavit

+0

我說,不要爲你的第一個for循環輸出println,而只是輸出。然後在打印後加一個if-else,如果'x = n1'則輸出'n1 - 1'更多的星號,然後移動到新的一行,否則就移動到一個新的行。 – skwear

+0

對不起,忘了空格。我稍後會發布解決方案,但這個想法是一樣的。這可能實際上是Code Golf SE的東西:) – skwear

回答

0

代碼一樣,就是如果你寫一個可重用的helper方法重複代碼編寫要容易得多。

這就是所謂的幹原理(Don't Repeat Yourself)。

在這種情況下,您希望爲箭頭打印'*'的重複字符,併爲縮進重複' '(空格)的字符。因此,寫一個方法用於創建重複字符的String

private static String repeat(char ch, int count) { 
    char[] buf = new char[count]; 
    Arrays.fill(buf, ch); 
    return new String(buf); 
} 

現在你已經是,打印右箭頭突然輕鬆了不少:

private static void printRightArrow(char ch, int n) { 
    for (int i = 1; i < n; i++) 
     System.out.println(repeat(' ', n - 1) + repeat(ch, i)); 
    System.out.println(repeat(ch, n * 2 - 1)); 
    for (int i = n - 1; i >= 1; i--) 
     System.out.println(repeat(' ', n - 1) + repeat(ch, i)); 
} 

測試和輸出

printRightArrow('*', 3); 
printRightArrow('#', 7); 
* 
    ** 
***** 
    ** 
    * 
 # 
     ## 
     ### 
     #### 
     ##### 
     ###### 
############# 
     ###### 
     ##### 
     #### 
     ### 
     ## 
     # 

在另一個方向上印刷箭頭非常相似:

private static void printLeftArrow(char ch, int n) { 
    for (int i = 1; i < n; i++) 
     System.out.println(repeat(' ', n - i) + repeat(ch, i)); 
    System.out.println(repeat(ch, n * 2 - 1)); 
    for (int i = n - 1; i >= 1; i--) 
     System.out.println(repeat(' ', n - i) + repeat(ch, i)); 
} 
private static void printUpArrow(char ch, int n) { 
    for (int i = 1; i <= n; i++) 
     System.out.println(repeat(' ', n - i) + repeat(ch, i * 2 - 1)); 
    for (int i = 1; i < n; i++) 
     System.out.println(repeat(' ', n - 1) + ch); 
} 
private static void printDownArrow(char ch, int n) { 
    for (int i = 1; i < n; i++) 
     System.out.println(repeat(' ', n - 1) + ch); 
    for (int i = n; i >= 1; i--) 
     System.out.println(repeat(' ', n - i) + repeat(ch, i * 2 - 1)); 
} 

測試和輸出

printRightArrow('*', 5); 
printLeftArrow('*', 5); 
printUpArrow('*', 5); 
printDownArrow('*', 5); 
* 
    ** 
    *** 
    **** 
********* 
    **** 
    *** 
    ** 
    * 
* 
    ** 
    *** 
**** 
********* 
**** 
    *** 
    ** 
    * 
* 
    *** 
    ***** 
******* 
********* 
    * 
    * 
    * 
    * 
* 
    * 
    * 
    * 
********* 
******* 
    ***** 
    *** 
    * 
0

這絕對不像安德烈亞斯的解決方案那麼強大,但它非常像你的解決方案。我剛剛添加了一些for循環和if-else語句。

class Arrow { 
    public static void main (String[] args) { 
     double n = 0; 
     if (args.length < 1){ 
      System.out.println("Input a number"); 
      System.exit(0); // Terminate the program if user has not input a number 
     } 
     else 
      n = Double.parseDouble(args[0]); 

     String text = ""; 
     int n1 = (int) n; 
     for (int x = 0; x < n1; x++) { 
      for (int i = 0; i < n1 - 1; i++) { 
       if (x != n1 - 1) { 
        System.out.print(" "); 
       } 
       else { 
        System.out.print("*"); 
       } 
      } 
      System.out.println(text += "*"); 
     } 

     for (int i = (n1-1); i>0; i--) { 
      for (int j = (n1 - 1); j > 0; j--) { 
       System.out.print(" "); 
      } 
      System.out.println(text = text.substring(0, text.length()-1)); 
     } 
    } 
}