【问题标题】:Creating a triangle with for loops使用 for 循环创建三角形
【发布时间】:2012-07-09 17:04:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: java loops for-loop geometry


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    首先,您需要确保生成正确数量的* 符号。我们需要生成 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(即13、@ 987654329@、79)。这为我们提供了正确数量的 * 符号。然后我们需要修复每行的缩进级别。这可以按如下方式完成:

    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 迭代值43210ì13、@9876546@5546@5和9。这就是我们想要的,因为我们在三角形中越高,我们需要放置的空间就越多。我们越往下三角形,我们需要的空间就越少,三角形的最后一行甚至根本不需要空间。

    【讨论】:

      【解决方案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);
          }
      }
      

      现在您可以自己test printSequence,也可以自己test 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() 添加一个新的“宽度”参数。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          用 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】:

            家庭作业问题? 好吧,您可以修改原始“直角三角形”代码以生成带有空格的倒“直角三角形” 所以会是这样的

            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");
            }
            

            【讨论】:

            • 是的,我是java新手
            【解决方案7】:
              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("");
              }
            

            【讨论】:

              【解决方案8】:
              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】:

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

                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("");
                        }
                    }
                }
                

                【讨论】:

                  【解决方案10】:

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

                  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...) 已经过测试可以工作。

                  【讨论】:

                    【解决方案11】:

                    嗯,将有两个序列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)));
                        }
                    }
                    

                    【讨论】:

                      【解决方案12】:

                      试试这个

                      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");
                      
                          }
                      
                         }
                      
                      }
                      

                      希望对你有帮助

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-01-31
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多