使用Java中的用户输入创建X模式?

使用Java中的用户输入创建X模式?,java,loops,for-loop,Java,Loops,For Loop,我已经做了很长一段时间了,实际上已经有几天了,但我似乎不明白我的循环出了什么问题 我必须用用户输入创建一个“X”模式。如果用户输入四,则如下所示: X X X X X X XX XX X X X X X X 它基本上是一个“V”型的叠加在一个倒置的上面。但是,我的编码导致了一些非常奇怪的事情 XX XX XX XX X X X X X X X X 顶部只打印出起始空格,第二部分

我已经做了很长一段时间了,实际上已经有几天了,但我似乎不明白我的循环出了什么问题

我必须用用户输入创建一个“X”模式。如果用户输入四,则如下所示:

X      X
 X    X
  X  X
   XX
   XX
  X  X
 X    X
X      X
它基本上是一个“V”型的叠加在一个倒置的上面。但是,我的编码导致了一些非常奇怪的事情

    XX
    XX
    XX
    XX
X    X
X    X
X    X
X    X
顶部只打印出起始空格,第二部分只打印出中间空格

    int num = 0;
    System.out.println("Enter a value between 2 and 10.");
    num = keyNum.nextInt();
    } 
    for (int a = 0; a < num; a++) 
    {
        System.out.println("");
        for (int b = 0; b <= (num - 1); b++) 
        {
            System.out.print(" ");
        }
        System.out.print("X");
        for (int c = num + 2; c <= 0; c -= 2)
        {
            System.out.print(" ");  
        }
        System.out.print("X");
    for (int d = 0; d < num; d++) 
    {
        System.out.println("");
        for (int e = (num - 1); e <= 0; e--) 
        {
            System.out.print(" ");
        }
        System.out.print("X");
        for (int f = 0; f <= num + 2; f += 2)
        {
            System.out.print(" ");  
        }
        System.out.print("X");
    }
int num=0;
System.out.println(“输入一个介于2和10之间的值”);
num=keyNum.nextInt();
} 
for(int a=0;a对于(intb=0;b您应该一次只关注一行,然后计算出获得循环所需的数学

例如,第一行

X      X
可以通过方法调用来表示(如果您还没有学习方法,请不要担心,这只是隐藏了循环的逻辑)

然后,下一行,相同的方法调用,只有不同的数字

printSpaces(1); printX(); printSpaces(4); printX(); printSpaces(1);
现在,您可能开始注意到外部空间每次增加1,内部空间每次减少2

内部空间将减少2,直到达到零,但不是写一个反向循环,实际上可以用增加的外部空间量、2x和绘制的X的宽度来表示

inner_space = (num * 2) - 2 - (outer_spaces * 2)
对于显示的示例

inner_space = (4 * 2) - 2 - (0 * 2) = 6
inner_space = (4 * 2) - 2 - (1 * 2) = 4
因此,您可以编写一个顶部循环,如

int num = 4;
// loop 0..3
for (int outerSpace = 0; outerSpace < num; outerSpace++) {
    int innerSpaces =  (num * 2) - 2 - (outerSpace * 2);

    // printSpaces(outerSpace); 
    printX();
    // printSpaces(innerSpaces);
    printX();
    // printSpaces(outerSpace);
}
int num=4;
//循环0..3
对于(int-outerSpace=0;outerSpace

现在,无论是使用方法还是循环,都是一个实现细节,但这是用于获取X顶部的伪代码。您可以通过一些简单的数学来解决这个问题。首先,让我们绘制一些2D函数

Z = Y + X                             Z = Y - X

x/y| 0  1  2  3  4  5  6  7           x/y| 0  1  2  3  4  5  6  7 
---|-----------------------           ---|----------------------- 
 0 | 0  1  2  3  4  5  6  7            0 | 0 -1 -2 -3 -4 -5 -6 -7 
   |                                     |                        
 1 | 1  2  3  4  5  6  7  8            1 | 1  0 -1 -2 -3 -4 -5 -6 
   |                                     |                        
 2 | 2  3  4  5  6  7  8  9            2 | 2  1  0 -1 -2 -3 -4 -5  
   |                                     |                        
 3 | 3  4  5  6  7  8  9  10           3 | 3  2  1  0 -1 -2 -3 -4  
   |                                     |                        
 4 | 4  5  6  7  8  9  10 11           4 | 4  3  2  1  0 -1 -2 -3
   |                                     |                        
 5 | 5  6  7  8  9  10 11 12           5 | 5  4  3  2  1  0 -1 -2
   |                                     |                        
 6 | 6  7  8  9  10 11 12 13           6 | 6  5  4  3  2  1  0 -1
   |                                     |                        
 7 | 7  8  9  10 11 12 13 14           7 | 7  6  5  4  3  2  1  0
您可以看到,后对角线由不变量
Z=0=Y-X
确定,前对角线由
Z=7=Y+X
确定,其中
7
2*输入大小-1

总而言之:

int inputSize = 4;
int forwardDiagonal = inputSize*2 - 1;
for (int y = 0; y < inputSize*2; y++) {
    for (int x = 0; x < inputSize*2; x++) {
        if (y - x == 0) {
            System.out.print("X");
        } else if (y + x == forwardDiagonal) {
            System.out.print("X");
        } else {
            System.out.print(" ");
        }
    }
    System.out.println();
}
int inputSize=4;
int forwardDiagonal=输入大小*2-1;
对于(int y=0;y
其他答案很好地解决了OP代码中的问题。以下是解决该问题的递归方法:

import java.util.Scanner;

public class DrawX {
    public static void main(String[] args) {
        int n = Integer.valueOf(new Scanner(System.in).nextLine());
        //To obtain a figure similar to the OP's
        drawX(2*(n - 1), 2* (n - 1), false);
    }

    static void drawX(int n, int limit, boolean z) {
        if(Math.abs(n) > limit) return;
        System.out.println(
          String.join("", Collections.nCopies((limit-Math.abs(n))/2, " ")) +
          "x" + //First x
          String.join("", Collections.nCopies(Math.abs(n), " ")) + 
          "x"  //Second x
          );
        if(n==0 && !z) drawX(n, limit, true); //This only happens once!
        else drawX(n - 2, limit, false);
    }
}
执行:

10
x                  x
 x                x
  x              x
   x            x
    x          x
     x        x
      x      x
       x    x
        x  x
         xx
         xx
        x  x
       x    x
      x      x
     x        x
    x          x
   x            x
  x              x
 x                x
x                  x
其思想是计算每行第一个
x
之前所需的空格数和
x
s之间的空格数(这两个空格都可以通过一些简单的数学观察得到),然后使用
String.join
Collections.nCopies
递归打印行以重复空格。因为与对应的行de>n=0
需要打印两次,我们需要添加一个布尔变量来跟踪何时发生这种情况


将递归函数转换为循环应该很容易,我将把它留给OP来处理。

您只需为两条对角线上的星号添加两个条件,否则只需打印空格即可

import java.util.Scanner;

public class XPattern {

  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("Enter a number : ");
    int size = scan.nextInt();
    printXPattern(size*2);
  }

  private static void printXPattern(int size) {
    for (int i = 0; i < size ; i++) {
      for (int j = 0; j < size ; j++) {
        if (i == j || i + j == size - 1) {//conditions for diagonals
          System.out.print("*");
        } else {
          System.out.print(" ");
        }
      }
      System.out.println();
    }
  }
}

对于间距循环,使用变量
num
,该变量在每行之后都不会更改。例如:


用于(int b=0;b我建议制作一个包含两个参数的方法——每个X的外部的空格数和内部的空格数。然后,计算出只生成顶部V所需的数学。此外,我可能想尝试学习更多关于调试的知识,这就是我一直在做的!我先生成顶部的部分,然后反转It、 我知道我的循环有点问题,但在无休止的尝试和明天即将到来的最后期限之后,我真的需要帮助完成这项工作!:(不过,谢谢你。事实上,这不是你在做的。这里没有任何方法。首先,请看第一个循环,你总是在任何X字符之前打印
num-1
空格,然后,
int c=num+2;c谢谢,这有点帮助。我现在的输出更准确了,但只有一侧是对角线,另一侧是直的?I您需要查看循环实现,但如果您打印出每行的空格数量的两个值并确保它们符合您的预期,您应该能够找出问题所在,然后您可以继续在需要的位置添加Xs。什么循环将为我提供正确的中间空格数?我对此非常绝望因为我不认为我能完成这个任务,而且我不能不通过这个任务。如果我只知道使用什么循环,我就可以知道如何在底部反转它。在外部循环中应该有三个循环。对于这三个循环中的第二个,内部循环可以定义为
for(int x=0;x
。外部循环将是相同的,但具有不同的循环条件
import java.util.Scanner;

public class XPattern {

  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.print("Enter a number : ");
    int size = scan.nextInt();
    printXPattern(size*2);
  }

  private static void printXPattern(int size) {
    for (int i = 0; i < size ; i++) {
      for (int j = 0; j < size ; j++) {
        if (i == j || i + j == size - 1) {//conditions for diagonals
          System.out.print("*");
        } else {
          System.out.print(" ");
        }
      }
      System.out.println();
    }
  }
}
Enter a number : 5
*        *
 *      * 
  *    *  
   *  *   
    **    
    **    
   *  *   
  *    *  
 *      * 
*        *