我想打印出来:
____*
___*_*
__*___*
_*_____*
*********
(下划线“_”被空格“”代替)
代码如下:
public static void main(String[] args) {
triangle(5);
}
public static void triangle(int height){
String space = " ";
String asterisk = "*";
if(height == 1){
System.out.println(asterisk);
}else{
//print out the "height - 1" line of triangle
for (int i = 1; i <= height - 1; i++) {
System.out.println(space.repeat(height - i) + asterisk + space.repeat(2 * i - 3) + asterisk);
}
System.out.println(asterisk.repeat(2 * height - 1));
}
}
然后点击“运行”,控制台上说:
Exception in thread "main" java.lang.IllegalArgumentException: count is negative: -1
at java.base/java.lang.String.repeat(String.java:3565)
at comp1110.lab2.Triangle.triangle(Triangle.java:16)
at comp1110.lab2.Triangle.main(Triangle.java:47)
有什么问题吗?
答案 0 :(得分:2)
您有两个问题.... 一,@ublec 已经提到过。你的第一个循环失败,因为你的数学是错误的。另一个是你试图一次解决所有问题,而不是把这个问题分解成更小的问题(问题分解)。当你这样做时,你会找到每个部分的解决方案,然后通过对所有部分求和来合成整体解决方案。
让我们分解问题。你首先有三角形前半部分的间距问题:
1 *
2 *
3 *
4*
星号前的空格是 1 减去高度。因此,对于 5 的高度,您的顶层有 4 个空格,然后是星号,然后是 3 加上星号,依此类推。您应该在 System.out.print()
语句(而不是 println
)中处理该部分。现在你有了它,你需要“绘制”三角形的后半部分。
顶层可以简单地打印换行符。但是,对于后续级别,间距为 1、3、5、7 等...
1 *
2 *1*
3 *-3-*
4 *--5--*
5*---7---*
你现在看到图案了吗?您计算星号之间填充的公式显然是错误的。除非您找到 String#repeat(int)
与星号之间的空格数之间的正确关联,否则 i
将无法填充星号之间的区域。您是否看到这样一个事实,即我放置在星号之间的数字的左侧和右侧有相等数量的破折号,以表示每层的空间总量?这是您应该如何进行的提示。
最后,您最后的打印输出语句是正确的。
我按照我建议的修改运行了您的代码,这是我对高度为 5 的三角形的输出:
*
* *
* *
* *
*********
答案 1 :(得分:1)
问题出在 for 循环内的 triangle()
方法中。我们来分析一下错误代码:space.repeat(2 * i - 3)
。在 for 循环第一次运行时,i
= 1。
2 次 i = 2。2 减 3 = -1。结果是负数。这就是为什么您的计数为 negative -1 error
。