2

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

3 回答 3

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(" ");写入新行的Your位于 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 循环内的单个“行”,因此花括号在技术上不是必需的。这是有效的:

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,则需要打印“十一月”。以下代码

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

毫无疑问,还有很多其他原因和例子可以说明为什么这是最佳实践。养成始终使用花括号的习惯,即使这意味着每隔一段时间输入几个额外的字符,这无疑会帮助您保持代码按预期工作,并减少您可能遇到的编译和其他错误的数量。

于 2012-10-04T15:03:30.337 回答
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();一个循环)?

于 2012-10-04T15:05:13.620 回答
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();
}
于 2012-10-04T15:03:18.493 回答