这是大学作业,我知道我只是错过了一些应该是显而易见的东西,但我对此很新,所以这对我来说并不明显。我需要使用Java和嵌套循环创建一个空盒子(由星号概述)。没有用户输入。常数设置为4宽6长。
我完成了所有工作,除了它一直打印所有正确的东西,而不是制作一个盒子!我做错了什么?
final int NUM_ACROSS = 4; // Number of asterisks to print across.
final int NUM_DOWN = 6; // Number of asterisks to print down.
int row; // Loop control for row number.
int column; // Loop control for column number.
// This is the work done in the detailLoop() method
{
for (row = 0; row < NUM_DOWN; row++)
for (column = 0; column < NUM_ACROSS; column++)
{
if (column == 0 || column == NUM_ACROSS)
System.out.print("*");
else if (row == 1 || row == NUM_DOWN-1)
System.out.print("*");
else
System.out.print (" ");
}
{
System.out.println();
答案 0 :(得分:4)
这就是为什么总是使用花括号的环绕块的好习惯,即使它们只有一行。这是你的代码,正确缩进:
for (row = 0; row < NUM_DOWN; row++)
for (column = 0; column < NUM_ACROSS; column++) {
if (column == 0 || column == NUM_ACROSS)
System.out.print("*");
else if (row == 1 || row == NUM_DOWN-1)
System.out.print("*");
else
System.out.print (" ");
}
{
System.out.println();
你写的新行的System.out.println(" ");
是for循环的 ,所以最后只调用一次。
这是循环应该的写法:
for (row = 0; row < NUM_DOWN; row++) {
for (column = 0; column < NUM_ACROSS; column++) {
if (column == 0 || column == NUM_ACROSS) {
System.out.print("*");
} else if (row == 1 || row == NUM_DOWN-1) {
System.out.print("*");
} else {
System.out.print (" ");
}
} // end inner for
System.out.println();
} // end outer for
关于大括号的说明
在Java中,如果for循环或if语句中只有一行,那么省略花括号在技术上是可以的。因此,这是找到:
if (column == 0 || column == NUM_ACROSS)
System.out.print("");
如果有两行,则必须使用花括号:
if(column == 0 || column == NUM_ACROSS) {
System.out.print("");
doSomething();
}
if-else if-else树在for循环中计为单个“line”,因此技术上不需要花括号。这是有效的:
for (column = 0; column < NUM_ACROSS; column++)
if (column == 0 || column == NUM_ACROSS)
System.out.print("*");
else if (row == 1 || row == NUM_DOWN-1)
System.out.print("*");
else
System.out.print (" ");
同样,整个for循环计为外部for循环内的单行:
for (row = 0; row < NUM_DOWN; row++)
for (column = 0; column < NUM_ACROSS; column++)
if (column == 0 || column == NUM_ACROSS)
System.out.print("*");
else if (row == 1 || row == NUM_DOWN-1)
System.out.print("*");
else
System.out.print (" ");
// this line is inside of neither for-loop because of the lack of braces:
System.out.println();
一般而言,所有程序员(无论级别或能力)使用大括号包围其代码块以避免语法模糊,这是一种很好的做法。在多个程序员的情况下,或者甚至是错误地缩进代码时,这种省略大括号的做法会变得很危险。考虑一下原始帖子中的代码 - 你能否一眼就看出嵌套在哪个环中或包含在哪个循环中?
缺少花括号的另一个例子可能会出现意想不到的后果。如果日期小于15,则需要打印“上半部分”,如果月份为11,则打印“11月”。以下代码
if ( day < 6 )
System.out.println("First half.");
if ( month == 11 )
System.out.println("November.");
假设项目要求发生变化,如果当天小于15,你不再打印出“上半场”。一些有用的实习生进来并注释掉这一行:
if ( day < 15 )
// System.out.println("First half.");
if ( month == 11 )
System.out.println("November.");
这样好吗?没有!现在你已经打破了11月的情况,因为上面的代码在语义上等同于:
if (day < 15)
if (month == 11)
System.out.println("November.");
如果我们一直使用花括号,我们会没事的:
if (day < 15) {
// System.out.println("First half.");
}
if (month == 11) {
System.out.println("November.");
}
对于为什么这是最佳实践,毫无疑问有其他六个原因和例子。养成总是使用花括号的习惯,即使它意味着每隔一段时间输入一些额外的字符,无疑会帮助你保持代码按预期工作,并减少你可能遇到的编译和其他错误的数量。 / p>
答案 1 :(得分:1)
for (row = 0; row < NUM_DOWN; row++) {
for (column = 0; column < NUM_ACROSS; column++) {
if (column == 0 || column == NUM_ACROSS)
System.out.print("*");
else if (row == 1 || row == NUM_DOWN-1)
System.out.print("*");
else
System.out.print (" ");
}
System.out.println();
}
这可以解决你的问题吗? (将System.out.println();
放入第一个循环中)?
答案 2 :(得分:0)
如果重新格式化代码以使其更具可读性,则错误变得更加明显:
for (row = 0; row < NUM_DOWN; row++)
for (column = 0; column < NUM_ACROSS; column++) {
if (column == 0 || column == NUM_ACROSS)
System.out.print("*");
else if (row == 1 || row == NUM_DOWN-1)
System.out.print("*");
else
System.out.print (" ");
}
{ //What's this brace doing here?
System.out.println();
外部for
循环(遍历每一行)没有在正确位置定义的左大括号。因为for
语句后面没有左括号,for循环的主体只是下一个语句(即内部for
循环)。
之后的左大括号只是在println()
语句周围形成一个块。为了避免这个问题,我个人更喜欢将开括号放在与for
和if
语句相同的行上,以避免在块之前意外插入任何内容。我还建议在一行if语句主体周围放置大括号,以避免在以后添加额外行时出现混淆。请参阅以下示例:
for (row = 0; row < NUM_DOWN; row++) {
for (column = 0; column < NUM_ACROSS; column++) {
if (column == 0 || column == NUM_ACROSS)
System.out.print("*");
else if (row == 1 || row == NUM_DOWN-1)
System.out.print("*");
else
System.out.print (" ");
}
System.out.println();
}