1

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

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

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 的输出如下所示,我遇到了间距问题:

***
 **
 *
  **
   ***

我真的很感激有人可以帮助我完成我的程序并向我解释算法以及如何制作更多模式。

4

5 回答 5

2

想象一下垂直和水平范围内的坐标平面。[-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();
}

滴漏:

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

另请参阅:如何在 C# 中打印 ASCII 模式但使用 Java 语法?

于 2021-06-15T18:27:42.507 回答
1

您可以将沙漏可视化为一个[-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

在线尝试!

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

输出:

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

另请参阅:如何使用 Java 绘制楼梯?

于 2021-03-24T22:36:04.467 回答
0

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

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

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...

*****
 ***
  *
 ***
*****
于 2021-06-22T04:16:08.693 回答
0

因为用于输入/输出/代码的字体中的每个字符都具有相同的宽度,所以您必须将每次迭代减少 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();
}
于 2020-11-22T18:06:03.303 回答
0

你可以试试下面的代码

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

输出如下:

* * * 
 * * 
  * 
 * * 
* * * 
于 2021-06-21T16:49:57.737 回答