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

これが、ブロックが 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(" ");を書き込む は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 ステートメントに 1 行しかない場合、中括弧を省略しても技術的に問題ありません。したがって、これは次のようになります。

if (column == 0 || column == NUM_ACROSS) 
    System.out.print("");

ただし、2 行ある場合は、中かっこが必要です。

if(column == 0 || column == NUM_ACROSS) {
    System.out.print("");
    doSomething();
}

if-else if-else ツリーは、for ループ内の 1 つの「行」としてカウントされるため、中括弧は技術的には必要ありません。これは有効です:

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 ループ内の 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 (" "); 

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

プロジェクトの要件が変更され、1 日が 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.");
}

これがベスト プラクティスである理由については、間違いなく他にも 6 つ以上の理由と例があります。中括弧を常に使用する習慣を身につけることは、たとえそれが時々余分な文字をいくつか入力することを意味するとしても、間違いなく、コードを期待どおりに機能させ続け、遭遇する可能性のあるコンパイルやその他のエラーの数を減らすのに役立ちます.

于 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()ステートメントの周りにブロックを形成するだけです。この問題を回避するために、ブロックの前に誤って何かを挿入しないように、開き中括弧をforandステートメントと同じ行に配置することを個人的に好みます。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();
}
于 2012-10-04T15:03:18.493 に答える