2017-09-27 53 views
1

我在java中做了樓梯案例問題。我寫了它,但它沒有奏效。所以我張貼它,如果有人可以檢查我的錯誤。謝謝。樓梯不工作,有我的代碼中的錯誤

public static void main(String[] args) { 

     Scanner sc=new Scanner(System.in); 
     int n=sc.nextInt(); 
     int f=n; 
     for(int i=0;i<n;i++) 
     { 
      for(int j=0;i<f;j++) 
      { 
       System.out.print(" "); 
      } 
      for(int k=0;k<=i;k++) 
      { 
       System.out.print("#"); 
      } 
      f=f-1; 
      System.out.println(" "); 
     } 
    } 

輸入爲6

和輸出模式應該是

 # 
    ## 
    ### 
    #### 
##### 
###### 

,但該礦沒有產生任何 代碼是固定的代碼應該已經

公共靜態void main(String [] args){

 Scanner sc=new Scanner(System.in); 
     int n=sc.nextInt(); 
     int f=n; 
     for(int i=0;i<n;i++) 
     { 
      for(int j=1;j<f;j++) 
      { 
       System.out.print(" "); 
      } 
      for(int k=0;k<=i;k++) 
      { 
       System.out.print("#"); 
      } 
      f=f-1; 
      System.out.println(" "); 
     } 
    } 

感謝所有幫助傢伙......幸運,有這樣一個社區.. :)

+0

是否沒有輸出或輸出很多空間? – dave

+0

歡迎來到堆棧溢出!它看起來像你需要學習使用調試器。請幫助一些[互補調試技術](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之後仍然遇到問題,請隨時回答一個更具體的問題。 –

回答

2

此行是錯誤的

  for(int j=0;i<f;j++) 
      { 
       System.out.print(" "); 
      } 

應該

 for(int j=0;j<f;j++) 
     { 
      System.out.print(" "); 
     } 

你切換i和j讓你永遠不會退出那個循環

+0

你的代碼沒有通過這個測試用例。 輸入(stdin)你的輸出(stdout) # ## ### #### ##### ###### 期望輸出 # ## # ## #### ##### ###### 編譯器消息 錯誤代碼 – Fiore

+0

你能找到更好的格式嗎?它很難區分。一個問題可能是您使用System.out.println(「」)添加了額外的空間。最後。也許改爲System.out.println(「」) – Legman

+0

讓我知道如果最後一點有幫助 – Legman

2

讓我們分解一下你的每個部分代碼是幹什麼的,看看如果答案是顯而易見的:

int n=sc.nextInt(); 
    int f=n; 

所以,我們在讀取數量(在本例中6),並同時設置nf是這個值。

for(int i=0;i<n;i++) 
    { 

在這裏,我們要重複下列塊6次,i等於0,那麼1,則2,3,4,5,我們會停下來時i不再少比n,在這種情況下是6。

因此,我們開始循環,i爲0. nf都仍然是6,因爲我們沒有改變它們。

 for(int j=0;i<f;j++) 
     { 

另一個循環,這時候我們已經開始與j爲0,並一直持續到i沒有比f再少。又是什麼ifi是0(我們第一次通過外部循環),f仍然是6. 0小於6,所以我們開始這個循環。

  System.out.print(" "); 
     } 

我們打印空間,並找到循環的結束,所以我們回去繞到for(int j=0...循環,增加j(因爲我們說在這個循環的開始j++)。

所以,現在我們的價值是:j = 1,i = 0f = 6。我們檢查循環條件 - i<f - 並且0仍然小於6,因此我們再次重複該循環,並打印另一個空間,並再次重複上述操作。這個循環中

沒有什麼是不斷變化的if值,所以對於循環(i<f)的條件始終是真實的,我們剛剛結束了一個無限循環,打印空間永遠。 j每次迭代都會增加,因此它會上升到1,2,3等,但是因爲您再也不會參考它,所以這是無關緊要的。

所以,問題是您需要更改循環條件,以便您可以退出循環,並轉到程序的其他部分。

鑑於你的循環遍歷了j,並且你正在增加它,所以我想你是想用它來決定是否結束循環 - 所以,你可能想要的i<f它的條件,而不是j<f,那就是:

 for(int j=0;j<f;j++) 
     { 
      System.out.print(" "); 
     } 

我不知道這是否會令你的程序完善,或者如果你會被它分解這樣你打另一個類似的問題,但希望可以看到你需要經歷的那種思維過程,以解決你遇到的下一個問題。基本上,你需要假裝成爲計算機,並通過每條線單獨工作,記下每次變化時每個變量的值。這並不困難,但是這非常耗時和煩人 - 歡迎編程!

0

我覺得這很簡單,可以用幾行來完成。您只需要兩個計數器(一個用於行,另一個用於分割empty部分和#部分)。

int rows = 6; 
for (int i = rows; i > 0; i--) { 
    for (int j = rows; j > 0; j--) 
     System.out.print((rows - j + 1) < i ? ' ' : '#'); 
    System.out.println(); 
} 
+0

如果你可以發佈一些解釋來幫助別人學習你建議的內容,而不僅僅是工作代碼,那麼答案會更好。另外,OP已經明確表示他正在學習語言,因此將代碼縮減爲複雜的單行語句不太可能幫助他們學習。如果他們有任何計劃成爲一名專業軟件開發人員,這也是一個可怕的例子 - 如果我在真實代碼中遇到這樣的事情,我會立即重寫它,以使其意圖清晰,而不是「聰明」,但完全朦朧。 – DaveyDaveDave

+0

@DaveyDaveDave我在帖子中添加了評論 –

0

使用Java 8流,String.format你可以解決這個問題的一個更簡潔的方式:

int limit = 6; 
IntStream.rangeClosed(1, limit) 
    .forEach(i -> System.out.printf("%" + limit + "s%n", String.join("", Collections.nCopies(i, "#")))); 

這是怎樣的 「#」 被重複:

String.join("", Collections.nCopies(i, "#") 

使用System.out.printf"%" + digit + "s"右對齊一個字符串。