代码之家  ›  专栏  ›  技术社区  ›  Cameron

打印带有嵌套循环的棋盘。[爪哇语]

  •  2
  • Cameron  · 技术社区  · 10 年前

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

    应该输出的示例。

    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();
            }
        }
    }
    

    我的代码一直在打印

    **
    
    ****
    
    2 回复  |  直到 10 年前
        1
  •  2
  •   gknicker    10 年前

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

        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 陈述此语句使用 ^ (xor)运算符测试条件,然后 ?: (三进制)运算符,如果条件为 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 通过速记三元运算符:

                if (isEvenRow == isEvenCol) {
                    System.out.print(" *");
                } else {
                    System.out.print("  ");
                }
    
        2
  •  2
  •   Simon Forsberg Kyle Rosendo    10 年前

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

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