2017-04-03 199 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(""); 
}