これまで for文と while 文そして do ~ while 文の3つのループ構文について説明しました。
繰り返しの簡単な処理についてはこれらの構文でプログラムを記述することができますが、実際の実務上ではもっと細かい条件を提示してプログラムを記述していく場面が多くあります。
今回は様々な制御のための処理について説明したいと思います。
for 文に関してはこちらを参考にしてください。
while 文に関してはこちらを参考にしてください。
ループ処理の中断
ループの処理を中断する「 break 」
▶ break でループの処理を強制終了できる
この break 文の役割はループの処理を中断するためのものです。
break 文は switch 文の中にも出てきました。基本的な役割は同じです。
switch 文に関してはこちらを参考にしてください。
このプログラムは1~10まで足し算をしてその結果を出力するというプログラムです。
その足し算の途中でなんらかの条件を満たした場合、それ以上ループさせずに中断する。
というプログラムです。
sum > 20 つまり sum が20を超えた場合ループから抜けるというものです。
1から10まで足していってその和が20を超えた時点でそれ以上の繰り返し処理を中断して終了させるというプログラムです。
- int sum = 0 ;
- for ( int i = 1 ; i <= 10 ; i ++ ) {
- sum += i ;
- System . out . println ( i + ” を足しました “) ;
- if ( sum > 20 ) {
- System . out . println ( ” 合計が20を超えました “) ;
- break ;
- }
- }
- System . out . println ( ” 合計は ” + sum ) ;
for( ) の中に条件式を記述します。
そして入れ子構造で if 文を記述していきます。変数 sum の値が20を超えているかどうかを判断する条件分岐をおこないます。
その条件を満たした場合「合計が20を超えました」を出力して break 文で強制的に for 文から抜けます。
最後にその時点での合計を出力する命令文で終了となります。
- class Break {
- public static void main ( String [ ] args ) {
- int sum = 0 ;
- for ( int i = 1 ; i <= 10 ; i ++ ) {
- sum += i ;
- System . out . println ( i + ” を足しました “ ) ;
- if ( sum > 20 ) {
- System . out . println ( ” 合計が20を超えました “ ) ;
- break ;
- }
- }
- System . out . println ( ” 合計は ” + sum ) ;
- }
- }
出力結果は
1を足しました
2を足しました
3を足しました
4を足しました
5を足しました
6を足しました
合計が20を超えました
合計は21
となります。
1~6までが普通のループ処理です。変数 i が6まで加算代入で変数 sum に代入しました。
合計が20を超えた時点で、命令文「合計が20を超えました」を出力しループ処理を抜けます。
i = 6 の時点で break 文によって強制終了となりました。
このように通常のループ処理で何らかの条件を満たした場合残りの処理をすべて飛ばし、ループから抜けるという処理をおこなう場合は break 文で制御します。
ループ内の処理をスキップする「 continue 」
▶continue でブロック内の残りの命令文をスキップできる
continue は名前のとおりループ内の処理をスキップして、次の処理から続けてくださいという意味です。
このプログラムは1~10までの足し算を行うプログラムですがすべての数字を足すのではなく「奇数だけ」を足していくプログラムです。つまり、偶数は足さずにスキップするというプログラムです。
- int sum = 0 ;
- for ( int i = 1 ; i <= 10 ; i ++ ) {
- if ( i % 2 == 0 ) {
- continue ;
- }
- sum += i ;
- System . out . println ( i + ” を足しました “) ;
- }
- System . out . println ( ” 合計は ” + sum ) ;
for 文の設定まではさきほどの break 文と同じですが、for 文の中身の命令文で次の sum += i (加算代入)するかどうかの判断を入れています。
if 文の中身は i % 2 == 0
変数 i を2で割って余りが0であるかどうか、つまり偶数かどうかを判断しています。
そしてその条件が満たされた場合、つまり偶数である場合次の2行である加算代入と出力の命令文をスキップして for 文を続けて回すという流れになります。
変数 i は最初は1が代入されています。if 文の条件である2で割ったときに余りが0になるという条件を満たさないので加算代入して「1を足しました」が出力される。
インクリメントで次の条件が2となります。
2は if 文の条件を満たしてしまうので continue 文が実行されます。
実行の結果加算代入と次の命令文が飛ばされ for 文へ戻る。
という処理が繰り返されるというものです。
- class Continue {
- public static void main ( String [ ] args ) {
- int sum = 0 ;
- for ( int i = 1 ; i <= 10 ; i ++ ) {
- if ( i % 2 == 0 ) {
- continue ;
- }
- sum += i ;
- System . out . println ( i + ” を足しました “ ) ;
- }
- System . out . println ( ” 合計は ” + sum ) ;
- }
- }
出力結果は
1を足しました
3を足しました
5を足しました
7を足しました
9を足しました
合計は25
となります。
もし偶数だけの足し算をしたい場合は i % 2 == 1 とすると奇数が飛ばされ偶数だけの足し算ループをおこなうことができます。
配列と for 文
for 文や while 文などは配列と非常に相性が良い構文です。
ループ構文を使用せずに配列の中身の処理を一気にするのは非常に面倒です。なのでfor 文や while 文などを使用することで簡単にたくさんの配列の中身の処理がおこなえるというわけです。
配列に関してはこちらを参考にしてください。
- 配列を示す変数に「 . length 」をつける
- ▶配列 score の長さ(下のコードの場合は5)が得られる
- class Array {
- public static void main ( String [ ] args ) {
- //配列の宣言
- int [ ] score = ( 50, 30, 70, 85, 90 ) ;
- //配列の中身を出力
- for ( int i = 0 ; i < score . length ; i ++ ) {
- System . out . println ( score [ i ] ) ;
- }
- }
- }
まず配列の宣言と初期化をおこないます。
int [ ] score = ( 50, 30, 70, 85, 90 ) ; で整数型の score という配列を宣言して{ }の中に5つの数字を代入します。
そしてその中身を出力させるというプログラムです。
もし for 文を使用せずに配列の中身を参照する場合は
score [ 0 ]
score [ 1 ]
score [ 2 ]
・
・
・
と複数行の記述が必要ですが for 文を使うとたったの3行で出力の命令を記述することができます。
for ( int i = 0 ; i < score . length ; i ++ ) この条件式を見てみましょう。
int i = 0 で整数型の i に0を代入します。
条件式は上記の score という配列の要素数よりも i が小さい場合。となり次にインクリメントを記述します。
出力の命令は score の各要素を出力するというものです。
i が0の場合は1番目の要素の中身を取り出し、i が1の場合は2番目の要素の中身を取り出します。
これを要素数の数だけ繰り返すというプログラムです。
- class Array {
- public static void main ( String [ ] args ) {
- // 配列の宣言,初期化
- int [ ] scores = { 50, 30, 70, 85, 90 } ;
- // 配列の中身を出力
- for ( int i = 0 ; i < score . length ; i ++ ) {
- System . out . println ( score [ i ] ) ;
- }
- }
- }
出力結果は
50
30
70
85
90
となります。
もし for 文を使用せずに配列の中身を参照しようとすると
- System . out . println ( score [ 0 ] ) ;
- System . out . println ( score [ 1 ] ) ;
- System . out . println ( score [ 2 ] ) ;
- System . out . println ( score [ 3 ] ) ;
- System . out . println ( score [ 4 ] ) ;
このように5回も命令文を記述する必要があります。
要素数が膨大になると for 文を利用すると容易に配列を扱うことができます。
要素数がいくつであっても . length で配列の中身の要素数が検出できます。
無限ループ
デクリメントや実行後の処理を記述しないと「無限ループ」が発生してしまいます。
while 文の中で「無限ループ」についての説明をしました。
while 文に関してはこちらを参考にしてください。
- 永遠にループが終わらない
- ▶カウンタ変数や条件文のミスなど
- ▶極まれに意図的なケースも
- ▶CTRL+C(CTRL+Z) で強制終了
- int i = 0 ;
- while ( i < 10 ; ) {
- System . out . println ( ” 飛んで飛んで飛んで飛んで飛んで♪回って回って回って回る♪ “) ;
- }
このように実行後の処理、例えば i ++ ; などを記述しないと無限ループが発生してしまいます。
※プログラムコードの例は載せないでおきます。
まとめ
for文と while 文そして do ~ while 文の3つのループ構文が使いこなせるようになると、面倒なプログラムも楽に記述できるようになります。また配列を組み合わせることによって膨大な量のデータを扱ってプログラムを記述していくこともできるようになります。その際に注意するべき無限ループですが、慌てずに速やかに強制終了できればコンピューターへの負担が少なくて済みます。