9

我似乎无法找到这个问题的答案-

我需要使用 for 循环绘制一个简单的三角形。

    *
   ***
  *****
 *******
*********

我可以制作一个半三角形,但我不知道如何添加到我当前的循环中以形成一个完整的三角形。

*
**
***
****
*****
for (int i = 0; i < 6; i++) {
    for (int j = 0; j < i; j++) {
        System.out.print("*");
    }
    System.out.println("");
}
4

12 回答 12

20

一个有趣,简单的解决方案:

for (int i = 0; i < 5; i++) 
  System.out.println("    *********".substring(i, 5 + 2*i));
于 2012-07-10T09:20:44.447 回答
17

首先,您需要确保生成正确数量的*符号。我们需要产生 1、3、5 等等而不是 1、2、3。这可以通过修改计数器变量来解决:

for (int i=1; i<10; i += 2)
{
    for (int j=0; j<i; j++)
    {
        System.out.print("*");
    }
    System.out.println("");
}

正如您所看到的,只要它小于(即 , , , , ) ,这将导致在每一步i开始1并增加。这为我们提供了正确数量的符号。然后我们需要修复每行的缩进级别。这可以按如下方式完成:21013579*

for (int i=1; i<10; i += 2)
{
    for (int k=0; k < (4 - i / 2); k++)
    {
        System.out.print(" ");
    }
    for (int j=0; j<i; j++)
    {
        System.out.print("*");
    }
    System.out.println("");
}

在打印*符号之前,我们会打印一些空格,空格的数量取决于我们所在的行。这就是带有k变量的 for 循环的用途。我们可以看到k迭代值4, 3, 2,10什么时候ì1, 3, 5,79。这就是我们想要的,因为我们在三角形中越高,我们需要放置的空间就越多。我们越往下三角形,我们需要的空间就越少,三角形的最后一行甚至根本不需要空间。

于 2012-07-10T08:52:29.690 回答
3

我很欣赏 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() 添加一个新的“宽度”参数。
于 2012-08-21T12:43:47.273 回答
3

首先想一个没有代码的解决方案。这个想法是打印奇数个*,逐行增加。然后使用空格将 * 居中。知道最后一行 * 的最大数量,将为您提供使第一个 * 居中的初始空格数。现在用代码编写它。

于 2015-06-12T02:07:08.170 回答
2

作业问题?好吧,您可以修改原始的“直角三角形”代码以生成带有空格的倒置“直角三角形”所以就像

for(i=0; i<6; i++)
{
    for(j=6; j>=(6-i); j--)
    {
        print(" ");
    }
    for(x=0; x<=((2*i)+1); x++)
    {
        print("*");
    }
    print("\n");
}
于 2012-07-10T08:51:12.443 回答
2

用 Java 试试这个

for (int i = 6, k = 0; i > 0 && k < 6; i--, k++) {
    for (int j = 0; j < i; j++) {
        System.out.print(" ");
    }
    for (int j = 0; j < k; j++) {
        System.out.print("*");
    }
    for (int j = 1; j < k; j++) {
        System.out.print("*");
    }
    System.out.println();
}
于 2013-07-11T10:19:40.567 回答
1
  for (int i=0; i<6; i++)
  {
     for (int k=0; k<6-i; k++)
     {
        System.out.print(" ");
     }
     for (int j=0; j<i*2+1; j++)
     {
        System.out.print("*");
     }
     System.out.println("");
  }
于 2012-07-10T08:51:36.383 回答
1

这将回答你的问题。取消注释注释代码以仅显示外行:)

public class TrianglePattern {

    public static void main(String[] args) {
        // This logic will generate the triangle for given dimension
        int dim = 10;
        for (int i = 0; i < dim; i++) {
            for (int k = i; k < dim; k++) {
                System.out.print(" ");
            }
            for (int j = 0; j <= i; j++) {
                //if (i != dim - 1)
                //  if (j == 0 || j == i)
                //      System.out.print("*");
                //  else
                //      System.out.print(" ");
                //else
                    System.out.print("*");
                System.out.print(" ");
            }
            System.out.println("");
        }
    }
}
于 2013-11-17T10:14:28.093 回答
1
private static void printStar(int x) {
    int i, j;
    for (int y = 0; y < x; y++) { // number of row of '*'

        for (i = y; i < x - 1; i++)
            // number of space each row
            System.out.print(' ');

        for (j = 0; j < y * 2 + 1; j++)
            // number of '*' each row
            System.out.print('*');

        System.out.println();
    }
}
于 2014-10-21T05:31:05.003 回答
0

这让您有更多的控制权和更轻松的时间:

public static int biggestoddnum = 31;

public static void main(String[] args) {
    for (int i=1; i<biggestoddnum; i += 2)
    {
        for (int k=0; k < ((biggestoddnum / 2) - i / 2); k++)
        {
            System.out.print(" ");
        }
        for (int j=0; j<i; j++)
        {
            System.out.print("*");
        }
        System.out.println("");
    }
}

只需将public static int biggestoddnum' 的值更改为您想要的任何奇数,并且 'for(int k...)已经过测试可以工作。

于 2017-10-15T12:16:35.113 回答
0

size-n好吧,空间和(2*(n+1)) -1星星会有两个序列。干得好。

public static void main(String[] args) {
    String template = "***************************";
    int size = (template.length()/2);
    for(int n=0;n<size;n++){
        System.out.print(template.substring(0,size-n).replace('*',' '));
        System.out.println(template.substring(0,((2*(n+1)) -1)));
    }
}
于 2018-03-29T12:22:32.530 回答
0

试试这个

class piramid 
{
    public static void main(String[] args) 
    {
        //System.out.println("Hello World!");

    int max = 7; 
    int k=max/2;
    int j ; 
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    for(i=k;i>0;i--){

          for(j=0;j<k+1;j++){

                if(i==j){

                       printf("*");

                }else if(j>i){
                      printf(" ");
                      printf("*");
                }else {
                      printf(" ");

                }

           }
            printf("\n");

    }

   }

}

希望对你有帮助

于 2019-11-30T13:48:53.943 回答