我很欣赏 OP 对 Java 来说是新的,所以方法可能被认为是“高级的”,但是我认为值得使用这个问题来展示如何通过将问题分解成碎片来解决问题。
让我们考虑编写一个打印单行的方法,告诉方法它是哪一行:
public void printTriangleLine(int rowNumber) {
// we have to work out what to put here
}
我们必须打印一些空格,然后打印一些星星。
查看示例,我可以看到(如果第一行是 0)它是 (5-rowNumber) 空格和 (2*rowNumber + 1) 星。
让我们发明一种为我们打印字符行的方法,并使用它:
public void printTriangleLine(int rowNumber) {
printSequence(" ", 5 - rowNumber);
printSequence("*", 2 * rowNumber + 1);
System.out.println();
}
在我们真正编写 printSequence() 之前,它不会编译,所以让我们这样做:
public void printSequence(String s, int repeats) {
for(int i=0; i<repeats; i++) {
System.out.print(s);
}
}
现在您可以自己测试printSequence,也可以自己测试printTriangleLine。现在你可以通过直接调用这些方法来尝试一下main()
public static void main(String [] args) {
printSequence("a",3);
System.out.println();
printTriangleLine(2);
}
...运行它并验证(用你的眼睛)它输出:
aaa
*****
当您深入编程时,您会想要使用像 jUnit 这样的单元测试框架。除了打印之外,您更有可能编写诸如 printTriangleLine 之类的东西来返回一个字符串(您将在程序中从更高层打印),并且您可以使用以下命令自动化您的测试:
assertEquals(" *****", TriangleDrawer.triangleLine(2));
assertEquals(" *", TriangleDrawer.triangleLine(0))
现在我们有了绘制三角形所需的部分。
public void drawTriangle() {
for(int i=0; i<5; i++) {
printTriangleLine(i);
}
}
我们编写的代码比其他人给出的答案要长一些。但是我们已经能够测试每个步骤,并且我们有可以在其他问题中再次使用的方法。在现实生活中,我们必须在将问题分解为太多方法或太少方法之间找到适当的平衡。我倾向于喜欢很多非常短的方法。
额外学分:
- 对此进行调整,以便这些方法不是打印到 System.out,而是返回一个字符串——所以在你的 main() 中你可以使用
System.out.print(drawTriangle())
- 对此进行调整,以便您可以向 drawTriangle() 询问不同的尺寸——也就是说,您可以调用
drawTriangle(3)
或drawTriangle(5)
- 使其适用于更大的三角形。提示:您需要向 printTriangleLine() 添加一个新的“宽度”参数。