用for循环创建一个三角形

时间:2012-07-10 08:43:02

标签: java loops for-loop geometry

我似乎无法找到答案 -

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

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

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

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



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

谢谢 -

12 个答案:

答案 0 :(得分:20)

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

for (int i = 0; i < 5; i++) 
  System.out.println("    *********".substring(i, 5 + 2*i));

答案 1 :(得分: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("");
}

正如您所看到的,这会导致i1开始,并在每个步骤增加2,只要它小于10(即{ {1}},1357)。这为我们提供了正确数量的9符号。然后我们需要修复每行的缩进级别。这可以按如下方式完成:

*

在打印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(""); } 符号之前,我们会打印一些空格,并且空格的数量会因我们所在的行而异。这就是带有*变量的for循环的用途。当k为{k时,我们可以看到4遍历值3210ì {1}},1357。这就是我们想要的,因为我们所处的三角形越高,我们需要放置的空间越多。我们越往下三角形,我们需要更少的空间,三角形的最后一行甚至根本不需要空格。

答案 2 :(得分: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之类的东西来返回String(您可以从程序中的较高位置打印),并且可以使用以下命令自动执行测试:

assertEquals("   *****", TriangleDrawer.triangleLine(2));
assertEquals("     *", TriangleDrawer.triangleLine(0))

现在我们有了绘制三角形所需的部分。

public void drawTriangle() {
    for(int i=0; i<5; i++) {
        printTriangleLine(i);
    }
}

我们编写的代码比其他人给出的答案要长一些。但是我们已经能够测试每一步,并且我们有可以在其他问题中再次使用的方法。在现实生活中,我们必须在将问题分解为太多方法或太少方法之间找到适当的平衡点。我倾向于选择很多非常简短的方法。

额外信用:

  • 对此进行调整,以便代替打印到System.out,方法返回一个String - 所以在main()中你可以使用System.out.print(drawTriangle())
  • 对此进行调整,以便您可以向drawTriangle()询问不同的尺寸 - 也就是说,您可以调用drawTriangle(3)drawTriangle(5)
  • 使其适用于更大的三角形。提示:您需要在printTriangleLine()中添加一个新的“width”参数。

答案 3 :(得分:3)

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

答案 4 :(得分: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");
}

答案 5 :(得分: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();
}

答案 6 :(得分: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("");
  }

答案 7 :(得分: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("");
        }
    }
}

答案 8 :(得分: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();
    }
}

答案 9 :(得分: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...)已经过测试即可运行。

答案 10 :(得分: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)));
    }
}

答案 11 :(得分: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");

    }

   }

}

希望它将对您有帮助