如何在Java中制作这种模式?

How to make this pattern in Java?

提问人:Arunim Goyal 提问时间:10/15/2023 最后编辑:Arunim Goyal 更新时间:10/16/2023 访问量:154

问:

|  ||  ||  ||  ||  ||  ||  ||<3|
|  ||  ||  ||  ||  ||  ||<3||##|
|  ||  ||  ||  ||  ||<3||##||<3|
|  ||  ||  ||  ||<3||##||<3||##|
|  ||  ||  ||<3||##||<3||##||<3|
|  ||  ||<3||##||<3||##||<3||##|
|  ||<3||##||<3||##||<3||##||<3|
|<3||##||<3||##||<3||##||<3||##|

这就是模式。必须使用流控制(if、for、else if 等)。不能只是打印或一一书写。到目前为止,我的代码是:

class Main {
  public static void main(String [] args){
    int x;

    for(int y = 1; y < 9; y++){
      for(x = 1; x < 9; x++){
        if(x > 8 - y){
          Stairs(true);
          Stairs(false);
        }

        else{
          System.out.print("|  |");
        }
      }
      System.out.println();
    }
  }

  public static void Stairs(boolean odd){
      System.out.print("|" + ((odd)? "<3" : "##") + "|"); 
  }
}

这是输出。我无法找出问题所在

|  ||  ||  ||  ||  ||  ||  ||<3||##| 
|  ||  ||  ||  ||  ||  ||<3||##||<3||##|
|  ||  ||  ||  ||  ||<3||##||<3||##||<3||##|
|  ||  ||  ||  ||<3||##||<3||##||<3||##||<3||##|
|  ||  ||  ||<3||##||<3||##||<3||##||<3||##||<3||##|
|  ||  ||<3||##||<3||##||<3||##||<3||##||<3||##||<3||##|
|  ||<3||##||<3||##||<3||##||<3||##||<3||##||<3||##||<3||##|
|<3||##||<3||##||<3||##||<3||##||<3||##||<3||##||<3||##||<3||##|
java for 循环 if 语句

评论

0赞 markspace 10/15/2023
我不认为偶数或奇数会起作用。看到模式交替了吗?你必须考虑到这一点。(不过,您可以将与该对角线的距离用作偶数或奇数。
1赞 Dave Newton 10/15/2023
@markspace IIRC 偶数和奇数也交替出现。
1赞 Slaw 10/15/2023
你有一个循环迭代 8 次,然后在该循环中,你还有另一个循环 8 次的循环。但是在那个嵌套循环中,如果那样,你打印列。实际上,您打印的列数是所需列数的两倍。x > 8 - y
0赞 Arunim Goyal 10/15/2023
@Slaw我该如何解决这个问题呢?如果我将其设置为 4,那么它不会执行所需的输出。我真的很困惑,对 Java 很陌生,感谢您的帮助。
0赞 Slaw 10/15/2023
您需要在该块内使用另一个 if-else 来确定是打印还是 ,而不是两者兼而有之。请注意,这可能表现为单个调用,您必须弄清楚要测试的内容(在本例中,if-else 在方法中)。if (x > 8 - y)"|##|""|<3|"Stairs(condition)conditionStairs

答:

0赞 Reilas 10/15/2023 #1

"...这是输出。我很难弄清楚问题所在”

我已经运行了代码,由于内部循环值,它似乎失败了。

下面是一个示例。

StringBuilder s = new StringBuilder();
String s1 = "<3", s2 = "##";
boolean b;
for (int i = 7, j; i >= 0; i--) {
    s.append("|  |".repeat(i));
    b = false;
    for (j = i; j < 8; j++)
        s.append("|%s|".formatted((b = !b) ? s1 : s2));
    s.append("%n".formatted());
}

输出

|  ||  ||  ||  ||  ||  ||  ||<3|
|  ||  ||  ||  ||  ||  ||<3||##|
|  ||  ||  ||  ||  ||<3||##||<3|
|  ||  ||  ||  ||<3||##||<3||##|
|  ||  ||  ||<3||##||<3||##||<3|
|  ||  ||<3||##||<3||##||<3||##|
|  ||<3||##||<3||##||<3||##||<3|
|<3||##||<3||##||<3||##||<3||##|
1赞 54Coconi 10/15/2023 #2

这是我根据你的修改的代码:

class Main {
    public static void main(String [] args){
        int x;
        boolean flag;
        for(int y = 1; y < 9; y++){
            for(x = 1; x < 9; x++){
                if(x > 8 - y){
                    flag = true;
                    do{
                        Stairs(flag);
                        x++;
                        flag=!flag;
                    } while(x<9);
                } else{
                    System.out.print("|  |");
                }
            }
            System.out.println();
        }
    }
    public static void Stairs(boolean odd){
        System.out.print("|" + ((odd)? "<3" : "##") + "|"); 
    }
}

输出:

输出图像

0赞 Slaw 10/15/2023 #3

你很接近。下面是略微重构的代码:

public class Main {

    public static void main(String[] args) {
        int numberOfSteps = 8;
        for (int y = 1; y <= numberOfSteps; y++) {
            for (int x = 1; x <= numberOfSteps; x++) {
                if (x > numberOfSteps - y) {
                    System.out.print("|<3|");
                    System.out.print("|##|");
                } else {
                    System.out.print("|  |");
                }
            }
            System.out.println();
        }
    }
}

这给出了这个(错误的)输出:

|  ||  ||  ||  ||  ||  ||  ||<3||##|
|  ||  ||  ||  ||  ||  ||<3||##||<3||##|
|  ||  ||  ||  ||  ||<3||##||<3||##||<3||##|
|  ||  ||  ||  ||<3||##||<3||##||<3||##||<3||##|
|  ||  ||  ||<3||##||<3||##||<3||##||<3||##||<3||##|
|  ||  ||<3||##||<3||##||<3||##||<3||##||<3||##||<3||##|
|  ||<3||##||<3||##||<3||##||<3||##||<3||##||<3||##||<3||##|
|<3||##||<3||##||<3||##||<3||##||<3||##||<3||##||<3||##||<3||##|

这两个循环针对每个“步骤”进行迭代。这意味着对于内部循环的每次迭代,您应该只打印出一个步骤。但是上面将为每个非空步骤打印两个步骤。该行为来自:forfor

System.out.print("|<3|");
System.out.print("|##|");

需要修改代码,以便仅打印 ,而不是同时打印两者。|<3||##|

查看预期的输出,我们可以看到“步骤”在水平方向和垂直方向上交替。在代码中,我们可以访问 和 。这两个数字也在偶数和奇数之间交替。如果我们查看每个步骤的值和,我们将看到一个模式。A 仅在数和数时打印,反之亦然1.换言之,只有当 和 具有不同的奇偶校验时,才会打印 a。xyxy|<3|xy|<3|xy

利用这些知识,我们可以修改原始代码,得到2 个:

public class Main {

    public static void main(String[] args) {
        int numberOfSteps = 8;
        for (int y = 1; y <= numberOfSteps; y++) {
            for (int x = 1; x <= numberOfSteps; x++) {
                if (x > numberOfSteps - y) {
                    if (x % 2 != y % 2) {
                        System.out.print("|<3|");
                    } else {
                        System.out.print("|##|");
                    }
                } else {
                    System.out.print("|  |");
                }
            }
            System.out.println();
        }
    }
}

现在,它为我们提供了预期的输出:

|  ||  ||  ||  ||  ||  ||  ||<3|
|  ||  ||  ||  ||  ||  ||<3||##|
|  ||  ||  ||  ||  ||<3||##||<3|
|  ||  ||  ||  ||<3||##||<3||##|
|  ||  ||  ||<3||##||<3||##||<3|
|  ||  ||<3||##||<3||##||<3||##|
|  ||<3||##||<3||##||<3||##||<3|
|<3||##||<3||##||<3||##||<3||##|

1. 当 xy1 开始时。

2. %模运算符。一个数字 n 是偶数,如果 n % 2 == 0;如果 n % 2 == 1,那就很奇怪了。因此,如果 x % 2 != y % 2,则 xy 具有不同的奇偶校验(即,一个是偶数,另一个是奇数)。

0赞 Idle_Mind 10/16/2023 #4

另一个,但这个版本要求多少个楼梯:

import java.util.Scanner;
class Main {
  
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.print("How many stairs? ");
    int numStairs = sc.nextInt();
    if (numStairs >= 1) {
      for(int row=1; row<=numStairs; row++) {
        boolean heart = true;
        for(int col=1; col<=numStairs; col++) {
          System.out.print("|"); 
          if (col <= (numStairs-row)) {            
            System.out.print("  ");            
          }
          else {
            System.out.print(heart ? "<3" : "##");
            heart = !heart;
          }
          System.out.print("|"); 
        }
        System.out.println();
      }
    }
    else {
      System.out.println("Number of stairs must be greater than or equal to one!");
    }
  }
  
}

试运行:

How many stairs? 8
|  ||  ||  ||  ||  ||  ||  ||<3|
|  ||  ||  ||  ||  ||  ||<3||##|
|  ||  ||  ||  ||  ||<3||##||<3|
|  ||  ||  ||  ||<3||##||<3||##|
|  ||  ||  ||<3||##||<3||##||<3|
|  ||  ||<3||##||<3||##||<3||##|
|  ||<3||##||<3||##||<3||##||<3|
|<3||##||<3||##||<3||##||<3||##|