使用Java中的用户输入创建X模式?
我已经做了很长一段时间了,实际上已经有几天了,但我似乎不明白我的循环出了什么问题 我必须用用户输入创建一个“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
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
* *
* *
* *
* *
**
**
* *
* *
* *
* *