Java Box of Asterisks - 只是一条线

时间:2012-10-04 14:56:18

标签: java

这是大学作业,我知道我只是错过了一些应该是显而易见的东西,但我对此很新,所以这对我来说并不明显。我需要使用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();

3 个答案:

答案 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()语句周围形成一个块。为了避免这个问题,我个人更喜欢将开括号放在与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();
}