プログラムの基本、繰り返し(ループ文)です。
1.while文
繰り返し文、まず最初に覚えて欲しいのが、while文。
まずは構文から。
構文
while (条件式){
処理文; //式がtrueの時のみ実行
}
※構文の条件式は boolean を返すものでなければならない。
ex)
int num = 0;
while (num < 5 ){
system.out.println(num);
num++; //ここでインクリメントしないと無限ループするバグ!
}
上記例文だと、numが0から始まり5未満の場合表示されてからインクリメントするシステムになる。
出力結果は・・・
0 1 2 3 4
になります。
ちなみに・・・
while (true) という書き方は・・・OK!
→要は無限ループさせたいだけで、breakすれば良いのでコンパイルも実行も問題なし!
while (false)という書き方は・・・NG!
→while以下を絶対に通らない制御になるので、コンパイルエラー!
2.do – while 文
whileと書き方は違うけどだいたい同じです。
do-while文の特徴は、最初に必ず1回は実行することです。
それ以外はwhile文と一緒です。
構文
do {
処理文; //最初の一回は必ず実行&それ以降、式がtrueの時のみ実行
} while (条件式)
簡単ですね。
ex)
int num = 0;
do{
system.out.println(num);
num++;
}while (num < 5 );
上記例文だと、whileの例文と同じくnumが0から始まり5未満の場合表示されてからインクリメントするシステムになる。
出力結果は・・・
0 1 2 3 4
になります。
では下記例文だと・・・
int num = 5;
do{
system.out.println(num);
num++;
}while (num < 5 );
実行結果は・・・
5
になります。
まず、int num = 5 で system.out.println(num); となっているので、5が表示されます。その後に while (num < 5 ) の記載がある為、その判定式がtrueだろうが、falseだろうが、最初の処理文は実行されるのです。
お分かりいただけたところで次に行きましょう。
3. for文
繰り返し文で、実際に最も使われるのがこのfor文!
while,do-while文よりも条件文に色々書けること。慣れれば一目で処理内容がわかる為、覚えるのに苦労しますがしっかり暗記しましょう。
構文
for (式1 ; 式2 ; 式3){
処理文; //式2がtrueなら実行!
}
<構文補足>
式1→カウンタの宣言と初期化。 ex)num = 0 ※この式の実行は初回のみ。
式2→条件式 ex)num < 5
式3→カウンタの更新の方法 ex)num++
構文を見てもよく分からないですよね。
早速例文。
ex)
for ( int num = 0 ; num < 5 ; num++){
System.out.println(num);
}
上記例文
式1→ int num = 0 //変数宣言
式2→ num < 5 //条件式
式3→ num++ //変数の更新(※ここではインクリメント)
これにより、while文、do-while文と同じシステムが出来ました。
簡単でしょう?
※for文の注意点
for文は、いろいろと省略できます。
分かりずらいのですが、しっかりテストに出るので覚えましょう!
◇省略できるもの その1
①式1 (変数宣言)
事前に変数宣言を行うことにより省略可能。
②式2 (条件式)
省略すると条件が常にtrueとなり無限ループする。
③式3 (処理文)
for文の{ }内(スコープ内) に処理文を入れることにより省略可能。
ex)式1と式3を省略した例文
int num = 0; //事前に変数宣言(※式1を省略する為)
for(; num < 5 ; ) { //式1と式3を省略
System.out.print(num++); //変数の更新(※式3を省略する為)
}
上記例文で、式1と式3を省略できました。
出力結果は・・・
0 1 2 3 4
◇省略できるもの その2
①{}
式だけでなく{}も省略できます。
ex)
for ( int num = 0 ; num < 5 ; num++ )
System.out.println(num);
この書き方でもOK。
注意したいのが・・・{}を省略した場合for文に対する処理文は、for文直下の1行のみです。
4. 拡張for文
拡張for文は配列の中身を回すのに便利です。
構文
for (変数宣言 : 参照変数名) { //:コロンであることに注意!
処理文;
}
拡張for文の一番の便利ポイントは、配列の要素数分だけ勝手に回してくれること。添え字をきにしなくても良いのがGoodです。
構文だけだとサッパリわからないと思います。例文を暗記してしまってください。
ex)
int[] val = {10,20,30}; //配列宣言
for (int num : val){ //型を揃えて参照
System.out.println(num);
}
実行結果は・・・
10 20 30
簡単ですね。
※ちなみに・・・拡張for文の際、変数宣言と参照変数型を揃えないとコンパイルエラー!また、変数宣言を拡張for文内でやらないとコンパイルエラー!!
例文だと、
変数宣言 → int num
参照変数型 → int[] val = {10,20,30}
となっているためint型で揃っているため問題ありません。
例えば、
変数宣言 → byte num
参照変数型 → int[] val = {10,20,30}
上記の場合、型が合っていないのでコンパイルエラーになるということです。見落としやすいところなのでしっかり覚えて次に行きましょう。
逆(int num/byte[] val)ならうまくいくのですが、それは後の章でご説明します。
5. ネスト (入れ子)
制御文の中に制御文を書くこと。かなり一般的です。
ex)
for(int i = 1 ; i < 10 ; i++){
if((i % 4) == 0){ //iを4で割って余りが0の場合true
System.out.println(i + “は4の倍数”);
}
}
上記例文で10以下の数字で4の倍数を洗い出すことができます。
実行結果は・・・
4は4の倍数 8は4の倍数
6. break と continue と ラベル
break と continue と ラベルは、ループのなかで抜けたり、スキップしたりする制御です。似ているようでそれぞれ違うものなので、頑張って覚えて下さい。
①break
breakは「途中で抜ける」
②continue
continueは「そのループの中をスキップして先頭に戻る」
③ラベル
先に説明したbreakとcontinueは内側の繰り返し文しか抜けることはできません。
しかし、このラベルを使うと繰り返し文のなかの繰り返し文から一気に外側まで抜けることができます。どういうことかわからない方は下の図を見て下さい。
図のように2重ループを抜ける際にラベルは便利なのです。
例文を見てみましょう。
ex)ラベルを使ったbreak文
label1 : //ラベル名 ※:コロンであることに注意!
for (int count1=0; count1 < 3; count1++){
for (int count2=0; count2 < 3; count2++){
System.out.println(count1+” “+count2);
if (count1== 1 && count2 == 1){
System.out.println(“break!”);
break label1;
}
}
}
iとj、どちらも1の場合、”break!”が表示され、label1まで抜けられるので、
結果は・・・
0 0 0 1 0 2 1 0 1 1 break!
では、ラベルを使ったcontinue文だとどうなるでしょう。
上の例文をcontinueに変えるだけです。
ex)ラベルを使ったcontinue文
label1: //ラベル名 ※:(コロン)であることに注意!
for (int count=0; count1 < 3; count1++){
for (int count2=0; count2 < 3; count2++){
System.out.println(count1+” “+count2);
if (count1== 1 && count2 == 1){
System.out.println(“continue!”);
continue label1;
}
}
}
結果は・・・
0 0 0 1 0 2 1 0 1 1 continue! 2 0 2 1 2 2
breakと違い、ループから抜けるわけではないので、処理を続けます。
外側のループも処理をスキップするので・・・
count1++が実行され
count1=2になり、
count2が初期化されるので、count2=0になる。
なので、continue以降は・・・
2 0 からのスタートということになります。
※変数のスコープ
for文を使う際に気をつけたいこと。
for文の式1で宣言した変数は、そのfor文内でしか使えません!
早速例文。
ex)
for (int i = 0; i < 5; i++){ //式1の変数iはこのfor文の中でのみ有効
System.out.println( i ); //for文内での処理文なのでOK!
}
System.out.println( i ); //変数iは上のfor文でのみ有効の為、NG!
このように上記例文だと、4行目の青字の変数 i が見つからずコンパイルエラーとなってしまいます。