我正在尝试让我的程序打印出一个由用户定义的尺寸的钻石形状,但是下半部分搞砸了,我不知道为什么。必须沿着对角线向下,底部有一个V形,形成菱形。任何人都可以解释导致它陷入困境的原因吗?
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Boolean f = true;
while (f) {
System.out.print("Choose a diamond size: ");
try {
int diamondSize = Integer.parseInt(input.nextLine());
int g = 0;
while (g < diamondSize +1) {
System.out.print(" ");
g++;
}
System.out.println("^");
for (int i = 1; i <= diamondSize; i++) {
for (int a = 0; a <= diamondSize - i; a++) {
System.out.print(" ");
}
for (int a = 1; a <= 2 * diamondSize - 1; a++) {
if (a == i || a == 0) {
System.out.print("/");
for (int n = 1; n < a * 2; n++) {
System.out.print(" ");
}
System.out.print("\\");
}
}
System.out.println();
}
System.out.print("<");
int e = 0;
while (e <= diamondSize * 2) {
System.out.print(" ");
e++;
}
System.out.println(">");
for (int i = diamondSize * 2; i >= diamondSize; i--) {
for (int a = 1; a >= diamondSize; a--) {
System.out.print(" ");
}
for (int a = 1; a <= 2 * diamondSize - 1; a++) {
if (a == i || a == 0) {
System.out.print("\\");
for (int n = 1; n < a * 2; n++) {
System.out.print(" ");
}
System.out.print("/");
System.out.println();
}
}
}
int m = 0;
while (m < diamondSize + 1) {
System.out.print(" ");
m++;
}
System.out.println("V");
}
catch(Exception e){
System.out.println("RESETTING. Please type an integer this time.");
}
System.out.println("Make another diamond? Type yes or no: ");
if (input.nextLine().equals("no")) {
System.out.print("Thanks for playing!");
System.exit(0);
}
}
}
}
答案 0 :(得分:2)
您的代码中有两个主要错误。第一个是你的第二个外循环指望错误的索引。
当你打印钻石的顶部时,你的外环是正确的:
for (int i = 1; i <= diamondSize; i++) {
但是当您打印下半部分时,由于某种原因,您试图将尺寸缩小两倍以上:
for (int i = diamondSize * 2; i >= diamondSize; i--) {
这应该是:
for (int i = diamondSize; i >= 1; i--) {
这会导致您的问题是,当您没有循环遍历正确的索引值时,您不能在以后的任何循环中使用该循环索引。
你的第二个错误是你下半部分的第一个空格打印循环正在尝试倒计时,但你的起始值和条件已经反转,而你正在计算硬编码1
而不是外部循环索引为i
。
此:
for (int a = 1; a >= diamondSize; a--) {
应该是这样的:
for (int a = diamondSize; a >= i; a--) {
替换代码的这两行:
for (int i = diamondSize * 2; i >= diamondSize; i--) {
for (int a = 1; a >= diamondSize; a--) {
有了这个:
for (int i = diamondSize; i >= 1; i--) {
for (int a = diamondSize; a >= i; a--) {
作为一个风格问题,您的代码因为不必要而极难阅读和调试 复杂。您应该考虑将一些常见工作(例如打印空间)重构为自己的方法。在重写之前,我无法调试您的代码。
例如,您可以通过编写如下方法来重构所有空间打印循环:
private static void printSpaces(int spaces) {
for (int i = 0; i < spaces; i++) {
System.out.print(" ");
}
}
那会让你替换这样的代码:
int g = 0;
while (g < diamondSize +1) {
System.out.print(" ");
g++;
}
调用该方法,如下所示:
printSpaces(diamondSize + 1);
这不会改变程序的行为,但它使您和其他人更容易阅读它,并查看它正在做什么。
答案 1 :(得分:1)
问题在于:
for (int a = 1; a <= 2 * diamondSize - 1; a++) {
if (a == i || a == 0) {
System.out.print("\\");
for (int n = 1; n < a * 2; n++) {
System.out.print(" ");
}
System.out.print("/");
System.out.println();
}
}
您在&#34; \&#34;之后添加空格在&#34; /&#34;之前。但是,您需要在&#34; \&#34;之前放置空格。一半之后。
我已经尝试过修复它但我无法在你的许多嵌套块和东西中做出头或尾,但我相信你可以把它弄清楚。对不起。