目次:
ビデオ: 【Javaプログラミング入門 #10】繰り返し〜for〜(構造化プログラミング/for文) ※1.5倍速での再生を推奨 2024
Javaプログラムのループを書きやすく、分かりやすくするには、Javaのbreak文とcontinue文がループ反復にどのように影響するかを知る必要があります。
Javaのbreak文
以下のプログラムをざっと見てください。プログラムはランダムに1から10までの数字を生成し、その数字を推測するように繰り返し求めます。
リスト1
import static java。ラング。システム。でる; import java。 util。スキャナ; import java。 util。ランダム;パブリッククラスGuessAgain {public static void main(String args []){スキャナのキーボード=新しいスキャナ(システム。 int numGuesses = 0; int randomNumber = new Random()。 nextInt(10)+1;でる。 println( "************");でる。 println( "推測ゲームへようこそ");でる。 println( "************");でる。 println();でる。 print( "1から10までのintを入力してください:"); int inputNumber = keyboard。 nextInt(); numGuesses ++; while(inputNumber!= randomNumber){ out。 println();でる。 println( "もう一度やり直してください…");でる。 print( "1から10までのintを入力してください:"); inputNumber =キーボード。 nextInt(); numGuesses ++; } 。 print( "あなたが勝つ");でる。 println(numGuesses + "推測");キーボード。 close();}}
下の図は、コードの実行を示しています。ユーザーは5つの推測を行います。毎回、コンピュータは、推測が正しいかどうかをチェックします。間違った推測により、再度試行する要求が生成されます。正確な推測のために、ユーザは、彼または彼女が作った推測の数の集計とともに、あなたが勝利することを得る。コンピュータは、何度も何度も何度も何度も何度も何度も何度も繰り返して、毎回チェックして、ユーザーの推測がランダムに生成された数と同じであるかどうかを確認します。ユーザが推測するたびに、コンピュータは推測の集計に1を加える。ユーザが正しい推測を行うと、コンピュータはその計算を表示する。
<! - 1 - >このプログラムはどうですか?まあ、いくつかのステートメントは、プログラムに複数回出現します。通常、プログラムのある部分から別の部分にコピーされるステートメントは、懸念するものではありません。しかし、全体の戦略は疑わしいと思われる。プログラムはループの前にユーザーから番号を取得し、ループの内部で(再び)番号を取得します。
<! - 2 - >。 print( "1から10までのintを入力してください:"); int inputNumber =キーボード。 nextInt(); numGuesses ++; while(inputNumber!= randomNumber){out。 println();でる。 println( "もう一度やり直してください…"); 。 print( "1から10までのintを入力してください:"); inputNumber =キーボード。 nextInt(); numGuesses ++; } このコードでは、ループを作成するための標準的なトリックを使用します。それは、ループをプライミングする
と呼ばれています。パターンは <! { 入力を増やす
}whileループの開始時にコンピュータは、ユーザの入力に関係する条件をチェックする。したがって、コンピュータは、ユーザが何らかの入力を行うまでループに入りません。次に、コンピュータがループ内にあるとき、コンピュータはループの次の反復に給電するための入力を求めます。トリックは変わったようだが、うまくいく。 <! - 1 - > 開発者はこのテクニックを使用してループを始めるので、それほど悪くはありません。しかし、別の方法があります。 リスト2 import static java。ラング。システム。でる; import java。 util。スキャナ; import java。 util。ランダム;パブリッククラスGuessAgain {public static void main(String args []){スキャナのキーボード=新しいスキャナ(システム。 int inputNumber、numGuesses = 0; int randomNumber = new Random()。 nextInt(10)+1;でる。 println( "************");でる。 println( "推測ゲームへようこそ");でる。 println( "************");でる。 println(); while(true){ out。 print( "1から10までのintを入力してください:"); inputNumber =キーボード。 nextInt(); numGuesses ++;
if(inputNumber == randomNumber){
break;}
。 println();でる。 println( "もう一度やり直してください…");
} 。 print( "あなたが勝つ");でる。 println(numGuesses + "推測");キーボード。ユーザーの視点から見ると、リスト2のコードは、リスト1のコードとまったく同じことを行います(どちらのプログラムの出力も見るには、上の図を参照してください)。違いは、リスト2はキーボードの呼び出しが1つしかないことです。 nextInt。その呼び出しはループ内にあるため、コンピュータは入力をテストせずにループに入る必要があります。 <! - 2 - > <! - 1 - > ループの状態を見ると、これがどのように動作するかを見ることができます。ループの条件は常にtrueです。何が起こっていても、ループの状態は常にテストに合格します。ループの状態は大きな詐欺です。ループの状態でテストに失敗することで、ループから飛び出すことは決してありません。代わりに、ループ内にあるbreakステートメントを実行すると飛び出します(if(inputNumber == randomNumber)ロードブロッキングを過ぎたときにbreakステートメントを実行します)。すべてがうまく機能します。- <! - 2 - > コンピュータがループ内にあるbreak文を実行すると、コンピュータはループの外に飛び出します(ループの後の最初の文まで)。 breakステートメントでは、コンピュータは1つのループから飛び出します。そのループが別のループ(外側のループ)の中にある場合、コンピュータは外側のループの外側にジャンプしません。 (int i = 0; i <3; i ++){ for(int j = 0; j <100; j ++)のためのBreakOutOfLoop(public static void main(String [] args) ){ システム。でる。 print(j + ""); if(j> 9){break;}
}
システム。でる。 println( "私は勃発!");}
}}次の図は、前述のコードの出力を示しています。
<! - 3 - >
コンピュータがbreak文に達すると、制御はI broken out文にジャンプします。私が声明を出したのは、jループの 外 ですが、forループの中に あります。 プログラマーの観点から見ると、リスト2のコードはリスト1のコードよりも自然です。結局のところ、ゲームはどのように進んでいますか?ユーザーが推測すると、コンピュータは推測をチェックし、推測が正しくない場合、コンピュータは「もう一度お試しください。リスト2で説明した一連のイベントですが、リスト1では、ループ内のコードは逆の順序でイベントを記述しているようです。ループに「Try again」と表示され、ユーザーが数値を入力します。 リスト2は、リスト1のループプライミング手法に代わる優れた方法を提供します。それでプログラマはなぜループをプライミングするのですか? Do breakステートメントには隠れた欠点がありますか?さて、答えはあなたの視点にかかっています。一部のプログラマは、ループ内のbreak文が混乱していると考えています。ステートメントからステートメントにジャンプすると、それらはめまいになり、1960年代から スパゲッティコード と呼ばれるものが思い出されます。 (スパゲッティのコードは、goto文を使ってある文から別の文にジャンプします。
Pascal by Example
の著者B. Burdは、 "gotoを使ったプログラミングは、下水道を通ってパリを回るようなものです。ショートカットはありますが、どれも取る価値はありません」)ループ内のbreak文は例外でありルールではありません。必要に応じてそれらを使用しますが、他の人のJavaコードでそれらの多くを見つけることは期待しないでください。Javaのcontinue文 リスト3は、プログラムのループ用の秘密のソースを提供します。 1から20までの3つの数字をランダムに生成するゲームを想像してください。ユーザーは数字を推測する5ターンを取る。ユーザーが正しい推測を入力すると、プログラムはユーザーを祝福します。 (「良い推測」とはプログラムを言います)。ユーザが間違った推測を入力すると、プログラムはフィードバックを提供しません。 リスト3にはすべてのことを実現するためのコードがいくつか含まれています。 リスト3 import static java。ラング。システム。でる; import java。 util。スキャナ; import java。 util。ランダム;パブリッククラスGuessAgainAndAgain {public static void main(String args []){スキャナのキーボード=新しいスキャナ(システム。 int inputNumber; int randNum1 = new Random()。 nextInt(20)+1; int randNum2 =新しいランダム()。 nextInt(20)+1; int randNum3 =新しいランダム()。 nextInt(20)+1;でる。 println( "************");でる。 println( "推測ゲームへようこそ");でる。 println( "************");でる。 println(); for(int i = 0; i <5; i ++){out。 print( "intを入力:"); inputNumber =キーボード。 nextInt();
if(inputNumber!= randNum1 &&
inputNumber!= randNum2 && inputNumber!= randNum3){ continue; } 。 println( "良い推測!");でる。 println();}出力します。 print( "数字は");でる。 print(randNum1 + "");でる。 print(randNum2 + "");でる。 print(randNum3 + "");キーボード。 close();}}
この図は、そのようなプログラムの実行を示しています。
Javaのcontinueステートメントは、ループ内の残りのステートメントを越えてジャンプするようにコンピュータに指示します。つまり、ループ内で残りのステートメントを実行する代わりに、ループの次の反復の開始に移ります。したがって、リスト3では、inputNumberがプログラムのランダムに生成された数値でない場合、コンピューターは「良い推測」コードを超えてジャンプし、ループ・カウンター(変数i)をインクリメントし、ユーザーに別の入力値を要求します。 (もちろん、ループ・カウンタが限界に達すると、コンピュータは別の反復を実行せず、ループの外に飛び出して、ループの後にある文を実行します。)
リスト3を簡単に書き直すことができますコードにはcontinueステートメントがありません。 if文の中に「良い推測」コードを置く必要がありますが、それは問題ありません。 continueステートメントは、リスト3プログラムの外観を改善するものではありません。しかし、if文の中にコードを入れ子にしたくない場合は、continue文が便利です。