我遇到了打印代码的问题。我需要用一个用户输入大小的网格打印棋盘。
应输出的内容示例。
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();
}
}
}
我的代码一直打印
**
****
答案 0 :(得分:2)
通过查看您的代码,我发现了这些潜在的问题:
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
一样长。答案 1 :(得分:2)
此循环精确地产生您指定的输出:
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
时打印星号,如果条件为{1}则使用空格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(" ");
}