この章では「繰り返し処理」について焦点を当てて説明します
何かの処理を繰り返し実行したいことがよくあり、for文
、while文
、do~while文
を使うことにより、繰り返し処理を記述することができます
for文
for文は決まった回数だけ処理を繰り返すときに用います
構文は以下の通りです
for(初期化式 ; 条件式 ; 変化式){
命令文;
}
iが1から5までの間繰り返すサンプルを以下に示します。このサンプルをfor文の構文と比較しながら見ていきましょう
for( int i=1; i<=5; i++){
System.out.plintln("i=" + i);
}
実行結果
i=1
i=2
i=3
i=4
i=5
①初期化式
int i=1;
初期化式は代入演算子を使い、定義した変数を初期化します
②条件式
i<=5;
条件式はこの式が真の間繰り返すという意味です
条件式の評価が偽の場合、繰り返し処理を抜けます
このサンプルでは、変数iが5以下の間続けるということを表しています
③命令文
System.out.plintln("i=" + i);
画面に変数iの値を出力します
④変化式
i++;
ループのたびに変数iの値を変化させます
命令文を処理した後に実行されます
変化式を適切に設定しないと条件式がいつまでも偽にならず無限に繰り返しが実行されますので注意しましょう
変化式は以下のようにいろいろな値をとることが可能です
i = i + 1 … i++と等しく変数の値を1増加させます
i += 2 … 変数の値を2増加させます( i= i +2 とも書くことができる)
i– … 変数の値を1減少させます( i = i-1 とも書くことができる)
i -= 3 … 変数の値を3減少させます(i=i-3とも書くことができる)
⑤繰り返し
②の処理へ戻ります

for文の処理の流れを表しています
以下は、for文を用いて、1から100までの整数の和を計算するサンプルプログラムです
public class Sample{
public static void main(String []args){
int sum = 0;
for(int i=1;i<=100;i++){
sum = sum + i;
}
System.out.println(sum);
}
}
実行結果
5050
分岐や繰り返し処理などの制御構造は、その中に制御構造を含むことができます
これをネスト
と呼びます
以下は、0から9の数値のうち、偶数を表示するサンプルプログラムです
public class Sample{
public static void main(String []args){
for(int i=0;i<10;i++){
if(i%2==0){
System.out.println("i="+i);
}
}
}
}
実行結果
i=0
i=2
i=4
i=6
i=8
for(int i=0;i<10;i++){
if(i%2==0){
for文の中にif文のブロックを記述しています
`i%2==0’はiを2で割った余りが0かどうかを判定しています
以下は、for文の二重ループを使用したサンプルプログラムです
外側のループのiが0,1,2のとき、内側のループが実行され、iとjの和を計算しています
public class Sample{
public static void main(String []args){
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
int x = i+j;
System.out.println(i + "+" + j + "=" + x);
}
}
}
}
実行結果
0+0=0 → i=0のとき
0+1=1
0+2=2
1+0=1 → i=1のとき
1+1=2
1+2=3
2+0=2 → i=0のとき
2+1=3
2+2=4
【演習問題】
- for文を⽤いて、1から100までの整数のうち偶数の和を計算し結果を表⽰するプログラムを作成しましょう
実⾏結果
1から100までの和は2550
- for文の中にfor文を入れる⼆重にループを⽤いて、以下のように表⽰させるプログラムを作成しましょう
※1から9までの九九の表を表しています
実⾏結果
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
while文
while文は指定した条件式が真の間はずっと繰り返し処理を行いたいときに利用します
構文は以下の通りです
while(条件式){
命令文;
}
for文と異なり、初期化式および変化式は指定しません
そのため、while文の前で変数の初期化を行い、命令文の中で変化式を記述する必要があります
以下は、1から順に加算し加算結果が5未満のとき繰り返し実行するサンプルプログラムです
public class Sample{
public static void main(String []args){
int i = 1;
int sum = 0;
while(sum<5){
System.out.println("i="+i + ":sum=" + sum);
sum = sum + i;
i++;
}
}
}
実行結果
i=1:sum=0
i=2:sum=1
i=3:sum=3
では、ソースコードの処理を順に追っていきます
①変数の初期化
while文の中で使用する変数を定義し初期化します
int i = 1;
int sum = 0;
②条件式
while(sum<5)
条件式の評価が偽の場合、繰り返し処理を抜けます
このサンプルでは、変数sumが5より小さい間繰り返し処理を続けるということを表しています
③命令文
System.out.println("i="+i + ":sum=" + sum);
sum = sum + i;
i++;
命令文の中で、実行する処理と変化式を記述します
変化式を記載しないと、②の条件式が偽になることがなく無限ループになってしまいます
④繰り返し
②の処理へ戻ります

while文の処理の流れを表しています
for文も while文も共に繰り返し処理の制御を行います
一般に for文は「○回処理を繰り返す」ときに使用し、while文は「~の間処理を繰り返す」ときに使用することが多いです
ただし、while文を用いても「○回処理を繰り返す」という制御は可能です
以下は、for文で作成したソースコードをwhile文で記載したサンプルです
public class Sample{
public static void main(String []args){
int i=1;
while( i <= 5){
System.out.println("i="+i);
i++;
}
}
}
実行結果
i=1
i=2
i=3
i=4
i=5
for文の初期化式の処理をwhile文の前に記述し、変化式は命令文の中に記載しています
【演習問題】
- while文を⽤いて、1から100までの整数の和を計算し結果を表⽰するプログラムを作成してみましょう
実⾏結果
1から100までの和は5050
- while文を⽤いて、1から100までの整数のうち奇数の和を計算し結果を表⽰するプログラムを作成してみましょう
実⾏結果
1から100までの奇数の和:2500
- while文を⽤いて、1から9までの整数を乱数で発⽣させ、9が⽣成された時点で終了するプログラムを作成してみましょう
※ただし、break⽂は使⽤しないこととします
実⾏結果
⽣成した値:1
⽣成した値:2
⽣成した値:9
終了します
do-while文
do-while⽂はwhile⽂と同じく、指定した条件式が真の間はずっと繰り返し処理を行いたいときに利用します
while文との違いは、命令文を実行後、条件式の判定を行うことです
そのため、while文では一回も命令文が実行されない場合がありますが、do-while文では、最低一回は命令文を実行します
構文は以下の通りです
do(
命令文
} while(条件式) ;
※while(条件式)の後には、;(セミコロン)を必ず記述しなければなりません
以下は、while文でも記述したサンプル「変数sumが5より小さい間繰り返し処理を続ける」をdo-while文で書き換えたサンプルプログラムです
public class Sample{
public static void main(String []args){
int i=1;
int sum=0;
do{
System.out.println("i=" + i + ":sum=" + sum);
sum = sum + i;
i++;
} while(sum<5);
}
}

このプログラムの流れを図に表しています
while文では一回も命令文が実行されませんが、do-while文では1回は命令文が実行される例を以下に示します
・while文
public class Sample{
public static void main(String []args){
int i=0;
while(i>0){
System.out.println("i="+i);
i--;
}
}
}
実行結果
(出力なし)
・do-while文
public class Sample{
public static void main(String []args){
int i=0;
do{
System.out.println("i="+i);
i--;
} while(i>0);
}
}
実行結果
i=0;
do-while文は、繰り返し処理を実行する際、「最低1回は命令文を実行する」場合に便利です
【演習問題】
- do-while文を⽤いて、1から100までの整数の和を計算し結果を表⽰するプログラムを作成してみましょう
実⾏結果
1から100までの和:5050
- do-while文を⽤いて、1から100までの整数のうち偶数の和を計算し結果を表⽰するプログラムを作成してみましょう
実⾏結果
1から100までの偶数の和:2550
- do-while文を⽤いて、1から9までの整数を乱数で発⽣させ、9が⽣成された時点で終了するプログラムを作成してみましょう
※ただし、break⽂は使⽤しないこととします
実⾏結果
⽣成した値:1
⽣成した値:2
⽣成した値:9
終了します
ループ処理の流れの変更
ループ処理中に、ある条件下ではループを中断したり、ある条件以降の処理をスキップするなど、ループ中に処理の流れを変えることがあります
ある条件下でループを中断するにはbreak
を、ある条件以降の処理をスキップするにはcontinue
を使用します
continue文
繰り返し処理の中で使用します
if文と併用され、if文の条件によりそれに続く命令文をスキップし、繰り返し処理を継続するときに使用します
以下はfor⽂を利⽤し変数iの値が偶数である場合にのみ処理をスキップするサンプルプログラムです
public class Sample{
public static void main(String []args){
for (int i = 1; i < 10; i++) {
if (i % 2 == 0) {
continue;
}
System.out.println(i);
}
}
}
実行結果
1
3
5
7
9
if (i % 2 == 0)が真のとき以降の処理はスキップし、次の繰り返し処理に移ります
そのため、実行結果では、iが偶数のときの出力処理は実行されていません

このプログラムの流れを図に表しています
【演習問題】
- for⽂を⽤いて、1から100までの和を計算するプログラムを作成してみましょう
ただし、3で割り切れる数のときはスキップするものとします
実⾏結果
1から100までの和;3367
break文
break文はswitch-case文では、ブロックから脱出するために使用していましたが、繰り返し処理の中で使用することもできます
繰り返し処理から強制的に脱出するときに使用し、if文と併用して用いることが多いです
以下は、while⽂を利⽤し、1から順に和を計算し和の値が20よりも大きくなった場合、ループを強制終了するサンプルプログラムです
public class Sample{
public static void main(String []args){
int i = 1;
int sum = 0;
while (i<100) {
System.out.print("(" + i + ")" + sum + "→");
if (sum > 20) {
break;
}
sum = sum + i;
i++;
System.out.println("(" + i + ")" + sum);
}
System.out.println("");
System.out.println("1から" + i + "までの和は" + sum + "です");
}
}
実行結果
(1)0⇒(2)1
(2)1⇒(3)3
(3)3⇒(4)6
(4)6⇒(5)10
(5)10⇒(6)15
(6)15⇒(7)21
(7)21⇒
1から7までの和は21です
i,sumを加算する前後でそれぞれの値を出力してみると、if (sum > 20)の条件が真になったとき強制終了しwhile文を脱出しているため、強制終了後の処理が実行されていないことがわかります

このプログラムの流れを図に表しています
【演習問題】
- while文とbreakを⽤いて1から順に加算し、加算した値が20を超えた時点で終了するプログラムを作成してみましょう
実⾏結果
1を加えました。合計は1
2を加えました。合計は3
3を加えました。合計は6
4を加えました。合計は10
5を加えました。合計は15
6を加えました。合計は21
合計が20を超えました
- whileの無限ループを作成し、0から10までの乱数を発⽣させて表⽰させ、0が発⽣したら終了するプログラムをbreak文を使用して作成してみましょう
実⾏結果
3
5
6
0
終了します
コメント