用Java打印梯形图

用Java打印梯形图,java,Java,在设置行数和梯形底部的宽度后,我尝试输出一个梯形。目前,它在某些情况下有效,但在其他情况下无效 在本例中,它是有效的 Enter height: 5 Enter width: 16 @@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ 在这个例子中,它不是 Enter height: 5 Enter width: 14 @@@@@@@ @@@@@@@@@ @@@

在设置行数和梯形底部的宽度后,我尝试输出一个梯形。目前,它在某些情况下有效,但在其他情况下无效

在本例中,它是有效的

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("");
}
public void打印梯形(扫描仪sc)
{
整数宽度;
int行;
系统输出打印(“输入高度:”);
行=sc.nextInt();
系统输出打印(“输入宽度:”);
宽度=sc.nextInt();
System.out.println(“”);
对于(int i=0;i0;j--)
{
系统输出打印(“”);
}
对于(int j=0;j<(宽度/2)+(2*i);j++)
{
系统输出打印(“@”);
}
系统输出打印(“\n”);
}
System.out.println(“”);
}

我会保持简单:您希望在基部之前为每行删除两个块,因此我可能会从
行-1
0
(包括在内)计数
I

在循环中,为每个
i
减去两个块:

int blocks = width - i * 2;
因为我们每行只需要打印一个空格(而不是两个,后面的空格是隐含的),并且因为我们向后计数
i
,所以我们只输出
i
空格

因此:

public void打印梯形(扫描仪sc)
{
整数宽度;
int行;
系统输出打印(“输入高度:”);
行=sc.nextInt();
系统输出打印(“输入宽度:”);
宽度=sc.nextInt();
System.out.println();
对于(int i=行-1;i>=0;--i)
{
整块=宽度-i*2;
对于(int j=0;j
其在2014年5月的输出如下:

@@@@@@ @@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@ @@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@ 这是2016年5月的情况:

@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@
我会保持简单:您希望在基之前为每行删除两个块,因此我可能会从
行-1
0
(包括在内)计数
I

在循环中,为每个
i
减去两个块:

int blocks = width - i * 2;
因为我们每行只需要打印一个空格(而不是两个,后面的空格是隐含的),并且因为我们向后计数
i
,所以我们只输出
i
空格

因此:

public void打印梯形(扫描仪sc)
{
整数宽度;
int行;
系统输出打印(“输入高度:”);
行=sc.nextInt();
系统输出打印(“输入宽度:”);
宽度=sc.nextInt();
System.out.println();
对于(int i=行-1;i>=0;--i)
{
整块=宽度-i*2;
对于(int j=0;j
其在2014年5月的输出如下:

@@@@@@ @@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@ @@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@ 这是2016年5月的情况:

@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@
这里有一个有效的解决方案


主要变化:当您从第1行开始而不是从第0行开始时,更容易想到代码。对for循环做了一个小的更改,从1开始,这里有一个有效的解决方案


主要变化:当您从第1行开始而不是从第0行开始时,更容易想到代码。对从1开始的for循环做了一个小改动,“在这个循环中,它没有”具体来说,什么是错误的?当您在IDE中内置调试器时,在代码中看到了什么?(使用调试器不是一种高级技术;它是每个初学者在写“你好,世界”后应该立即学习的基本技能。)我建议将
System.out.print(“\n”)
System.out.println(“”)替换为
System.out.println()
@T.J.Crowder抱歉,我应该指定,底行应该有14个@符号,由宽度指定,但它有15个。我会把它改成(int j=0;j<((width-1)/2)+(2*I);j++
,但这仍然不起作用。我理解调试器,它计数到15。这就是问题所在。那么为什么不在底部输入宽度:14?这就是问题所在?“在这篇文章中,它没有”具体来说,什么是错的?当您在IDE中内置调试器时,在代码中看到了什么?(使用调试器不是一种高级技术;它是每个初学者在写“你好,世界”后应该立即学习的基本技能。)我建议将
System.out.print(“\n”)
System.out.println(“”)替换为
System.out.println()
@T.J.Crowder抱歉,我应该指定,底行应该有14个@符号,由宽度指定,但它有15个。我会把它改成(int j=0;j<((width-1)/2)+(2*I);j++
,但这仍然不起作用。我理解调试器,它计数到15。这就是问题所在。那么为什么不在底部输入宽度:14?这就是问题所在?这很有道理。我应该看到的。我很感激!这是有道理的。我应该看到的。我很感激!