用Java打印一个梯形

时间:2017-04-03 23:19:23

标签: 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 个答案:

答案 0 :(得分:0)

我保持简单:你想在基地之前为每一行敲掉两个街区,所以我可能会从i到{{1}计算rows - 1 (包含):

0

并在循环中为每个for (int i = rows - 1; i >= 0; --i) 减去两个块:

i

因为我们只需要每行打印一个空格(而不是两个,暗示尾随空格),并且由于我们向后计数int blocks = width - i * 2; ,我们只输出i个空格

所以:

i

输出以下5/14:

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

和5/16:

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

答案 1 :(得分:0)

这是一个有效的解决方案。

主要更改:当您从第1行开始而不是第0行时,更容易想到代码。对for循环进行小的更改,从1开始,并且&lt; = rows。

第二个变化是改变了打印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("");
}