2017-04-03 90 views
1

我想在設置行數和梯形的底部寬度後輸出一個梯形。目前,它在某些情況下有效,但在其他情況下不起作用在Java中打印一個梯形

在這個例子中,它的工作原理

Enter height: 5 
Enter width: 16 

    @@@@@@@@ 
    @@@@@@@@@@ 
    @@@@@@@@@@@@ 
    @@@@@@@@@@@@@@ 
@@@@@@@@@@@@@@@@ 

在這其中,它不

Enter height: 5 
Enter width: 14 

    @@@@@@@ 
    @@@@@@@@@ 
    @@@@@@@@@@@ 
    @@@@@@@@@@@@@ 
@@@@@@@@@@@@@@@ 

我在做什麼錯?這是我的代碼:

public void printTrapezoid(Scanner sc) 
{ 
    int width; 
    int rows; 

    System.out.print("Enter height: "); 
    rows = sc.nextInt(); 

    System.out.print("Enter width: "); 
    width = sc.nextInt(); 

    System.out.println(""); 

    for (int i = 0; i < rows; i++) 
    { 
     for (int j = rows - i; j > 0; j--) 
     { 
      System.out.print(" "); 
     } 
     for (int j = 0; j < (width/2) + (2 * i); j++) 
     { 
      System.out.print("@"); 
     } 

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

    System.out.println(""); 
} 
+2

*「在這一個,它不」*什麼,*明確*,是錯的?當你使用內置在IDE中的調試器完成代​​碼時,你看到了什麼? (使用調試器是**不是**高級技術;這是每個初學者在編寫「Hello,World」後應立即學習的基本技能。) –

+2

我建議您更換'System.out.print(「\ n」) '和'System.out.println(「」)'''System.out.println()' – mre

+0

@TJCrowder對不起,我應該指定,底部行應該有14個符號,如寬度所指定的,但它有15個。我將它改爲這個'for(int j = 0; j <((width-1)/ 2)+(2 * i); j ++)'但這仍然行不通。我瞭解調試器,它數到15.這是問題。 –

回答

0

我會保持它的簡單:你要敲掉兩個街區的前基地的每一行,所以我可能從rows - 1i0(含):

for (int i = rows - 1; i >= 0; --i) 

,並在環減去兩個塊每i

int blocks = width - i * 2; 

由於我們只需要打印出一個空間(而比兩個,後面的空間隱含)每行,並且由於我們計數爲i落後,我們只輸出i空格。

所以:

public void printTrapezoid(Scanner sc) 
{ 
    int width; 
    int rows; 

    System.out.print("Enter height: "); 
    rows = sc.nextInt(); 

    System.out.print("Enter width: "); 
    width = sc.nextInt(); 

    System.out.println(); 

    for (int i = rows - 1; i >= 0; --i) 
    { 
     int blocks = width - i * 2; 
     for (int j = 0; j < i; ++j) 
     { 
      System.out.print(" "); 
     } 
     for (int j = 0; j < blocks; ++j) 
     { 
      System.out.print("@"); 
     } 

     System.out.println(); 
    } 

    System.out.println(""); 
} 

輸出用於14分之5以下:

 
    @@@@@@ 
    @@@@@@@@ 
    @@@@@@@@@@ 
@@@@@@@@@@@@ 
@@@@@@@@@@@@@@ 

這對於16分之5:

 
    @@@@@@@@ 
    @@@@@@@@@@ 
    @@@@@@@@@@@@ 
@@@@@@@@@@@@@@ 
@@@@@@@@@@@@@@@@ 
+0

這是有道理的。我應該看到它。我很感激! –

0

這裏是一個可行的解決方案。

主要更改:當您從第1行開始而不是第0行時,更容易想到代碼。對從1開始的for循環和< =行進行小小更改。

第二次更改正在改變您打印X值的方式。使用Collections.nCopies和String.join。這是更容易遵循,你不必擔心/ 2 int和奇怪的行號...

public void printTrapezoid(Scanner sc) { 
    int width; 
    int rows; 

    System.out.print("Enter height: "); 
    rows = sc.nextInt(); 

    System.out.print("Enter width: "); 
    width = sc.nextInt(); 

    System.out.println(""); 

    for (int i = 1; i <= rows; i++) { 
     System.out.print(String.join("", Collections.nCopies(rows - i, " "))); 
     System.out.println(String.join("", Collections.nCopies(width - 2 * (rows - i), "@"))); 
    } 

    System.out.println(""); 
}