打印带有嵌套循环的棋盘。 [Java]

Printing a checker board with nested loops. [Java]

我在打印代码时遇到问题。我需要打印一个带有用户输入大小的网格的棋盘。

应输出的示例。

Input a size (must be larger than 1):
5

0 *   *   *
1   *   *  
2 *   *   *
3   *   *  
4 *   *   *

这是我的代码:

import java.util.Scanner;
public class nestedpractice1 
{
    public static void main(String[] args)
    {
        Scanner kbinput = new Scanner(System.in); 
        //Create Size variable
        System.out.println("Input a size: ");
        int n = 0; n = kbinput.nextInt();

        for(int r = 0; r < n; r++)
        {
            for(int c = 0; c < r; c++)
                    {
                if((r%2) == 0)
                {
                    System.out.print("*");
                }
                else if((r%1) == 0)
                {
                    System.out.print(" *");
                }
            }
            System.out.println("");
            kbinput.close();
        }
    }
}

我的代码不断打印

**

****

通过查看您的代码,我发现了这些潜在的问题:

  • kbinput.close(); 不应在循环内调用。
  • else if((r%1) == 0) 应该是 else if (r % 2 != 0),尽管在这种情况下 else 就足够了。
  • else 中,您可能想要 System.out.print(" ");
    而不是 System.out.print(" *");
  • 我相信 for(int c = 0; c < r; c++) { 应该循环只要 c < n.

此循环精确地产生您指定的输出:

    for (int r = 0; r < n; r++) {
        System.out.print(r);
        for (int c = 0; c < n; c++) {
            System.out.print(r % 2 == 1 ^ c % 2 == 0 ? " *" : "  ");
        }
        System.out.println();
    }

我将内部循环的主体压缩为单个 print 语句。此语句使用 ^(异或)运算符来测试条件,然后使用 ?:(三元)运算符在条件为 true 时打印星号,在条件为false.

我们可以拆分单个语句,同时保留其含义,如下所示:

            boolean isOddRow = r % 2 == 1;
            boolean isEvenCol = c % 2 == 0;
            System.out.print(isOddRow ^ isEvenCol ? " *" : "  ");

作为解释,我们只想在行和列都是偶数或奇数时打印 *。所以如果行是偶数但列是奇数,或者如果行是奇数但列是偶数,我们只打印空格。

我们可以使用 == 而不是 ^ 来表达相同的逻辑:

            boolean isEvenRow = r % 2 == 0;
            boolean isEvenCol = c % 2 == 0;
            System.out.print(isEvenRow == isEvenCol ? " *" : "  ");

或者,如果您更喜欢普通的 if..else 而不是 shorthand 三元运算符:

            if (isEvenRow == isEvenCol) {
                System.out.print(" *");
            } else {
                System.out.print("  ");
            }