2012-10-04 25 views
2

这是大学作业,我知道我只是错过了一些应该是显而易见的东西,但我对此很陌生,所以对我来说并不明显。我需要使用Java和嵌套循环创建一个空框(用星号表示)。没有用户输入。常量设置为4宽6长。Java盒星号 - 只是一条线

我已经完成了所有工作,只是它不断打印所有正确的东西,而不是制作一个盒子!我做错了什么?

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(); 
+2

你可以发布一些编译? – Fildor

+1

仔细看看你的牙套。 – SLaks

+1

你的第一个for循环没有正确的大括号。 –

回答

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()声明形成一个块。为了避免这个问题,我个人更喜欢把开口花括号放在与forif语句相同的行上,以避免在块之前意外插入任何东西。我还建议围绕一行的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(); 
} 
+0

我明白了!起初,线条末尾的大括号让我感到困惑。谢谢你的解释。我也有一个应该是0的1。现在一切都很好。感谢您的帮助!我保存了你的回复,所以我会记得下一次! –

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 (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-loop,所以大括号在技术上是没有必要的。这是有效的:

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 situtation,并打印“月”,如果一个月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."); 

这样行吗?没有!现在你已经打破了你的十一月情况下,因为上面的代码在语义上是相同的:

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."); 
} 

毫无疑问,有其他六个原因和例子为什么这是最佳做法。养成总是使用大括号的习惯,即使它意味着每隔一段时间输入一些额外的字符,毫无疑问将帮助您保持代码正常工作,并减少可能遇到的编译错误和其他错误的数量。

+1

+1“总是用花括号包围块是个好习惯” –

+0

我明白了!我曾经花括号,然后把它们拿出来,因为它仍然没有正确格式化,但是现在我发现它是因为我的系统无法打印出来。所以它永远不会创造出一个盒子....我没有意识到第二个陈述需要在它自己的大括号中,但我现在看到了这种必要性。 –

+0

@ValerieDurrantPurvis内部for循环必须位于外部for循环的块内。 if语句必须位于内部的for循环块内。 – Edd

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();放到第一个循环中)?

+1

复制/粘贴代码并将其作为答案提交的诱惑非常棒。她会得到100%的分数,她不会学会如何编程。学习,而不是发表评论堆栈溢出:“告诉我要输入什么”。通过给她答案,我们正在为她做一次解脱服务。我们应该将她引导到讨论如何编写编译代码的网站。如何解决逐个错误。大括号如何工作。如何解决问题以及如何正确缩进代码。她需要自己学习如何解决,而且我们正在阻止这一点。 –

+1

好吧,我明白你的意思,我会记住它。谢谢你的建议。 –

+0

这是我的大括号如何放置。我现在拥有它。谢谢你的回应。 –