【问题标题】:Making an ASCII hourglass using asterisks使用星号制作 ASCII 沙漏
【发布时间】:2020-11-22 17:50:04
【问题描述】:

我知道有人问过它,但我很难理解其他程序和嵌套循环,如果有人有一个技巧来遵循嵌套循环并用星号制作形状,我想知道,因为它真的让我感到困惑。

这是我经过多次尝试和实验后编写的代码:

Scanner input = new Scanner(System.in);
System.out.print("Enter a number: ");
int userentry = input.nextInt();
for (int i = 0; i < userentry - 1; i++) {
    for (int k = 0; k < i; k++) {
        System.out.print(" ");
    }
    for (int j = userentry - 1; j >= i; j--) {
        System.out.print("*");
    }
    System.out.println();
}
for (int i = 0; i < userentry; i++) {
    for (int k = 0; k < i + 1; k++) {
        System.out.print(" ");
    }
    for (int j = 0; j <= i; j++) {
        System.out.print("*");
    }
    System.out.println();
}

例如,数字条目 3 的输出是这样的,我遇到了间距问题:

***
 **
 *
  **
   ***

我非常感谢能在我的程序中帮助我并解释算法以及如何制作更多模式的人。

【问题讨论】:

    标签: java loops nested-loops ascii-art nested-for-loop


    【解决方案1】:

    想象一个坐标平面在垂直和水平范围[-n, n]。您可以使用两个嵌套的 for 循环 和一个 if else 语句 将其打印出来:

    int n = 3;
    for (int i = -n; i <= n; i++) {
        for (int j = -n; j <= n; j++)
            if (i == 0 || j == 0)
                System.out.print("*");
            else
                System.out.print("-");
        System.out.println();
    }
    

    坐标平面:

    ---*---
    ---*---
    ---*---
    *******
    ---*---
    ---*---
    ---*---
    

    要打印沙漏,您只需要更改if else 语句

    int n = 3;
    for (int i = -n; i <= n; i++) {
        for (int j = -n; j <= n; j++)
            if (Math.abs(i) < Math.abs(j))
                System.out.print(" ");
            else
                System.out.print("*");
        System.out.println();
    }
    

    沙漏:

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

    另见:How to print ASCII patterns in C# but using Java syntax?

    【讨论】:

      【解决方案2】:

      您可以将 沙漏 可视化为 [-n, n] 范围内的数字矩阵,其中每个点是:

      m[i][j] = Math.abs(i) - Math.abs(j);
      

      如果n = 3,那么这个矩阵看起来像这样:

        0  1  2  3  2  1  0
       -1  0  1  2  1  0 -1
       -2 -1  0  1  0 -1 -2
       -3 -2 -1  0 -1 -2 -3
       -2 -1  0  1  0 -1 -2
       -1  0  1  2  1  0 -1
        0  1  2  3  2  1  0
      

      Try it online!

      int n = 3;
      IntStream.rangeClosed(-n, n)
              .map(Math::abs)
              .peek(i -> IntStream.rangeClosed(-n, n)
                      .map(Math::abs)
                      .mapToObj(j -> i < j ? "  " : "* ")
                      .forEach(System.out::print))
              .forEach(i -> System.out.println());
      

      输出:

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

      另见:How to draw a staircase with Java?

      【讨论】:

        【解决方案3】:

        由于用于输入/输出/代码的字体中的每个字符都具有相同的宽度,因此您必须将每次迭代减少 2,例如:

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

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

        而不是一个。 对于间距,请使用以下内容:

        for (int i = userentry; i > 0; i -= 2) {
          for (int j = 0; j < (userentry - i) / 2; j++) System.out.print(" ");
          for (int j = 0; j < i; j++) System.out.print("*");
          for (int j = 0; j < (userentry - i) / 2; j++) System.out.print(" ");
          System.out.println();
        }
        for (int i = (userentry % 2 == 0 ? 2 : 3); i <= userentry; i += 2) {
          for (int j = 0; j < (userentry - i) / 2; j++) System.out.print(" ");
          for (int j = 0; j < i; j++) System.out.print("*");
          for (int j = 0; j < (userentry - i) / 2; j++) System.out.print(" ");
          System.out.println();
        }
        

        【讨论】:

          【解决方案4】:

          你可以试试下面的代码

          class HelloWorld {
            static void pattern(int rows_no) {
              int i, j, k;
              for (i = 1; i <= rows_no; i++) {
                for (k = 1; k < i; k++)
                  System.out.print(" ");
                for (j = i; j <= rows_no; j++)
                  System.out.print("*" + " ");
          
                System.out.println();
              }
              for (i = rows_no - 1; i >= 1; i--) {
                for (k = 1; k < i; k++)
                  System.out.print(" ");
                for (j = i; j <= rows_no; j++)
                  System.out.print("*" + " ");
                System.out.println();
              }
            }
          
            public static void main(String[] args) {
              int rows_no = 3;
              pattern(rows_no);
            }
          }
          

          输出如下:

          * * * 
           * * 
            * 
           * * 
          * * * 
          

          【讨论】:

            【解决方案5】:

            如果要打印沙漏,则必须打印两个三角形,一个是直立的,另一个是倒置的(请注意,两个三角形的尖端都是常见的星号)。

            这可以使用下面给出的代码来完成...

            class HourGlass {
                public static void main(String args[]) {
                    Scanner input = new Scanner(System.in);
                    System.out.print("Enter a number: ");
                    int userentry = input.nextInt();
                    for (int i = 0; i < userentry; i++) {
                        for (int k = 0; k < i; k++) {
                            System.out.print(" ");
                        }
                        for (int j = userentry - 1; j >= i; j--) {
                            System.out.print("*");
                        }
                        for (int k = userentry - i; k > 1; k--) {
                            System.out.print("*");
                        }
                        System.out.println();
                    }
                    for (int i = 1; i < userentry; i++) {
                        for (int k = 0; k < userentry - i - 1; k++) {
                            System.out.print(" ");
                        }
                        for (int j = 0; j <= i; j++) {
                            System.out.print("*");
                        }
                        for (int k = 0; k < i; k++) {
                            System.out.print("*");
                        }
                        System.out.println();
                    }
                }
            }
            

            这会在输入3...时打印出来...

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-21
              相关资源
              最近更新 更多