はじめに
構造化プログラミング言語では処理順次
、分岐
、反復
という3つの基本構造があります。通常はmain()メソッドから開始し、上から順番に実行されます(順次)
この章では主に、分岐
と反復
について学習していきます。
目次
- 制御文とは
- 分岐(条件分岐)
- 反復(繰り返し)
- 多重ループ(ネスト)
- break文
- continue文
- 章のまとめ
目標
- 制御文について利用できるようにすること
- break文とcontinue文について理解すること
制御文とは
java言語は、一番最初にmain()メソッドを起点として上から下へ向かって1行づつ実行されます。ある条件によって実行したい処理が分かれる場合(分岐(条件分岐))や、繰り返ししたい処理がある場合(反復(繰り返し))には、制御文を利用します。
制御文には以下の種類かあります。
分岐(条件分岐)は、プログラムに指定された条件が成立するかしないか
の判定により、各条件に応じた処理を行うことができます。それにより平坦な処理を、より柔軟で実用性のある処理にすることができます。
分岐(条件分岐)の構文としては、以下のとおりです。
- if文
- else-if文
- switch文
プログラム内で、一連の処理を繰り返すことができる文を反復(繰り返し文)
といいます。繰り返し文の利用により柔軟で読みやすいプログラムを記述することができます。また繰り返し文のことをループ文
ともいいます。
反復(繰り返し文)の構文としては、以下のとおりです。
- while文
- do-while文
- for文
分岐(条件分岐)
if文
if文(条件分岐)は「もしも〜なら」という意味で、if文の条件に該当する場合には{ }内の処理を実行するだけのとてもシンプルな構文です。
[if文の構文]if(条件){
条件が成立(true)時に実行したい処理
}
例題(if文)
以下をコーディングし、実行結果を確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | IfExec01 |
package chapter4; |
コンパイル例:> javac chapter4¥IfExec01.java
実行例:> java chapter4.IfExec01 3
3は5未満です。
else if文
if-else文(条件分岐)は「もしも〜ならA、それ以外はB」というように条件を2通りの処理から一つを選ぶ構文です。
[構文]if(条件){
条件が成立(true)時に実行したい処理
}else{
条件が成立しなかった(false)時に実行したい処理
}
例題(if-else文)
以下をコーディングし、実行結果を確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | IfExec02 |
package chapter4; |
コンパイル例:> javac chapter4¥IfExec02.java
実行例:> java chapter4.IfExec02 3
3は5未満です。
> java chapter4.IfExec02 10
10は5以上です。
if-else if文
if文は条件がtrueの時とfalseの時の2通りにしか場合分けできません。3つ以上のケースに分けて処理しなければならない場合にはif-else if文を使用します。
if-else if文の構文は以下です。
[構文]if(条件1){
条件1が成立(true)時に実行したい処理
}else if(条件2){
条件2が成立(true)時に実行したい処理
}else{
条件1も2も成立しなかった(false)時に実行したい処理
}
例題(if-else if文)
以下をコーディングし、実行結果を確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | IfExec03 |
package chapter4; |
コンパイル例:> javac chapter4¥IfExec03.java
実行例:> java chapter4.IfExec03 -1
3はは0より小さいです。
> java chapter4.IfExec03 5
5は0〜15の間です。
> java chapter4.IfExec03 20
20は15よりも大きいです。
{ }の省略
if文では条件分岐の内容を{}
の間に書いていましたが、じょう処理が1つの場合
には{}
を省力することができます。
例題({ }の省略)
先ほど記述したプログラムからif文の{}
を削除してください。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | IfExec03 |
package chapter4; |
コンパイル例:> javac chapter4¥IfExec03.java
実行例:> java chapter4.IfExec03 -1
3はは0より小さいです。
> java chapter4.IfExec03 5
5は0〜15の間です。
> java chapter4.IfExec03 20
20は15よりも大きいです。
※ 実行結果は先ほどと同じです。
switch文
switch文は else if文と同じように複数条件を指定することができます。また、複数条件がある場合は、switch文を使用することによって、else if文をいくつも記述するより読みやすいプログラムを作成することができます。
switch文は1つの式を持ちます。この式には定数または変数を指定することができます。ただし、指定できるデータ型はbyte型、short型、int型、char型、String型、列挙型(enum)のみです。
処理は、式とcaseの定数値を評価し、一致する処理を実行します。どの case にも該当しない場合は、defaultの処理を実行します。(defaultの記載は省略可能です。)
尚、break
はswitch文の{ }
の外へ抜ける命令です。
(switch文が実行されるとswitch文の処理が終了
します。)
[構文]switch (式){
case 定数1:
実行する文1;
実行する文2;
break;
case 定数2:
実行する文1;
実行する文2;
break;
}
例題(switch文)
以下をコーディングし、実行結果を確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | SwitchExec01 |
package chapter4; |
コンパイル例:> javac chapter4¥SwitchExec01.java
実行例:> java chapter4.SwitchExec01 1
1です。
> java chapter4.SwitchExec01 2
2です。
> java chapter4.SwitchExec01 3
3です。
> java chapter4.SwitchExec01 4
1、2、3以外です。
例題(switch文(break文がない場合))
以下をコーディングし、break文がない場合の処理も確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | SwitchExec02 |
package chapter4; |
コンパイル例:> javac chapter4¥SwitchExec02.java
実行例:> java chapter4.SwitchExec02 1
1です。
2です。
3です。
1、2、3以外です。
> java chapter4.SwitchExec02 2
2です。
3です。
1、2、3以外です。
> java chapter4.SwitchExec02 3
3です。
1、2、3以外です。
> java chapter4.SwitchExec01 4
1、2、3以外です。
例題(switch文(複数のcase指定))
switch文のcaseを複数指定することも可能です。
以下をコーディングし、実行結果を確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | SwitchExec03 |
package chapter4; |
コンパイル例:> javac chapter4¥SwitchExec03.java
実行例:> java chapter4.SwitchExec03 AA
入力された文字列はAAかBBです。
> java chapter4.SwitchExec03 BB
入力された文字列はAAかBBです。
> java chapter4.SwitchExec03 CC
入力された文字列はCCです。
> java chapter4.SwitchExec03 DD
入力された文字列はAA、BB、CC以外です。
while文
while文(繰り返し文)は条件式の結果がtrueの間だけ { } 内の処理が実行され、
条件式の結果がfalseになったら処理が終了する文です。
[構文]while (条件式) {
条件式の結果がtrueの時の処理
}
例題(条件演算子)
以下をコーディングし、実行結果を確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | whileExec01 |
package chapter4; |
コンパイル例:> javac chapter4¥whileExec01.java
実行例:> java chapter4.whileExec01 5
あと5回
あと4回
あと3回
あと2回
あと1回
while文で注意すること
while文では条件式の書き方には注意が必要です。
例えば以下のソースコードでは無限ループに成ってしまいます。
package chapter4; |
上記の場合、条件式にtrue
が指定されており、ずっと条件式がtrueのままになります。
条件式を指定する場合には無限ループ
にならないように注意しましょう。
また、while文では繰り返ししたい内容を{ }
の間に書いていましたが、繰り返したい処理が1つの場合
には{ }
を省力することができます。
package chapter4; |
上記の場合、コンパイルエラーにはならず、実行はできます。(上記の場合、条件式がtrueですので実行すると無限ループが発生しますが、実行することは可能です。)
do-while文
whileを使うもう一つの構文としてdo文があります。do-while文
は一度条件式を実行した後で条件をチェックします。
少なくとも1回は「繰り返し実行したい処理」を実行するところが、while文と異なります。
[構文]do {
繰り返したい処理
} while(条件);
※ do-while文
の最後はセミコロン( ; )
が付きます。
例題(do-while文)
以下をコーディングし、実行結果を確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | whileExec02 |
package chapter4; |
コンパイル例:> javac chapter4¥whileExec02.java
実行例:> java chapter4.whileExec02
-5
-4
-3
-2
-1
0
ローカル変数の有効範囲について
変数には宣言される場所によって扱える範囲が異なります。
上記の場合、変数n
はdo文で宣言している為、do文内{}(ブロック文)
の範囲内でのみ使用できます。{}(ブロック文)
の外では利用できないのでエラーになります。
尚、変数が使える範囲(有効範囲)をスコープ
といいます。またメソッド内で宣言している変数は一般的にローカル変数
といいます。ローカル変数
は変数宣言したブロック内で有効です。
do-while文の{ }の省略
do-while文も 繰り返したい処理が1つの場合
には{}
を省力することができます。
例題(do-while文の{ }の省略)
以下をコーディングし、実行結果を確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | whileExec03 |
package chapter4; |
コンパイル例:> javac chapter4¥whileExec03.java
実行例:> java chapter4.whileExec03
-4
for文
for文とは反復処理の一種で、条件に一致した処理を繰り返し実行したい時に使用します。
for文の基本的な構文は以下です。
for(式1 ; 式2 ; 式3) { |
for文の処理の流れは、以下のとおりです。
「式1」でカウンタ変数の初期化が行われる。
「式2」で条件判定が行われる。判定が「true」の場合には次の処理に進み、「false」の場合にはfor文は終了する
2.での判定が「true」の場合、{ から } までの処理が実行される。
3.の処理の実行後、「式3」でカウンタ変数に対して増減が行われ、その後再び「式2」の条件判定が行われる。
「式2」の条件が「true」の間、2.から4.までの処理が繰り返される。
例題(for文)
以下をコーディングし、実行結果を確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | ForExec |
package chapter4; |
コンパイル例:> javac chapter4¥ForExec.java
実行例:> java chapter4.ForExec
0
1
2
3
4
{ }を書かないfor文
for文では、繰り返し実行したい内容を{ }
の間に書いていました。{ }
はブロック
といい、複数の文を一つの文にまとめる働きがあります。繰り返したい処理が一行の場合には{ }
を省力することもできます。
例題({ }を書かないfor文)
先ほど作成した「ForExec」クラスのfor文のブロック({ })を消して
実行してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | ForExec |
package chapter4; |
コンパイル例:> javac chapter4¥ForExec.java
実行例:> java chapter4.ForExec
0
1
2
3
4
配列の要素の出力方法
配列の要素を出力する時はよく、先ほど学習したfor文を利用すると便利です。
例題(配列の要素をfor文で出力)
以下をコーディングし、実行結果を確認してみましょう。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | ArrayForExec1 |
package chapter4; |
コンパイル例:> javac chapter4¥ArrayForExec1.java
実行例:> java chapter4.ArrayForExec1
10
20
30
40
50
上記のfor文の式1で定義したカウンタ変数a
は、0
、1
、2
、3
、4
、5
と変わります。for文内でintArray[a]
と指定することで効率よく配列intArray
へアクセスすることができます。
先ほど使用したfor文の反復条件をa < 5
からa < intArray.length
へ変更してください。
package chapter4; |
コンパイル例:> javac chapter4¥ArrayForExec1.java
実行例:> java chapter4.ArrayForExec1
10
20
30
40
50
先ほどと同じ結果がコンソールに表示されたと思います。配列名 + .length
とすると、指定した配列の要素数を取得
することができます。
for文の構文(応用)
最後にforの構文について復習も兼ねてもう一度解説します。
for文は初期設定
、反復条件
、後条件
の3つの要素から出来ています。カウンタ変数の値を毎回決まった量だけ変化させながら反復処理を実行し、ループ制御変数があらかじめ決めておいた範囲を超えたときに反復を止めるという仕組みです。
初期設定
for文の開始にあたって1度だけ実行されます。ループ変数の初期値(最初の値)を設定します。
反復条件
「繰り返し実行したい処理」を実行する直前に、成立しているかどうか検査される条件でこの条件が満たされていなければfor文の繰り返しを止めます。
後条件
「繰り返し実行したい処理」を実行した直後に、無条件に実行される処理です。ループ変数の値を1づつ増やしたり、2つづつ増やしたり、減らしたり自由に増減することができます。
例題(for文の様々なパターン例)
//aが1つづつ増加するパターン |
aが1つづつ減少するパターンfor(int a = 9; a > 0; a--){
System.out.println(a);
}
aが2つづ増加するパターン
for(int a = 0; a < 10; a+=2){ |
状況に応じて使い分けられるように理解できるようにしてください。
拡張for文
拡張for文とはJava5.0から導入されたfor文で、配列ですべての要素を取り出す時のみ利用できる書き方です。
拡張for文は先頭から順番にアクセスできるのが特徴です。カウンター変数を使わないので、特定の要素にだけアクセスすることはできませんが、簡単に書ける利点があります。
ArrayForExec1
クラスを以下のように修正してください。
ArrayForExec1.javapackage chapter4;
/**
* 実行するためのクラス
* @version 1.0
* @author Yamamoto
*/
public class ArrayForExec1 {
/**
* mainメソッド
*/
public static void main(String[] args) {
int[] intArray = {10,20,30,40,50};
for(int a : intArray){
System.out.println(a);
}
}
}
コンパイル例:> javac chapter4¥ArrayForExec1.java
実行例:> java chapter4.ArrayForExec1
10
20
30
40
50
break文
break
をforやwhileの中で使うと、繰り返しを停止する
命令になります。
breakはひとつのブロック文({ }で囲まれた範囲)から、外側へ強制脱出する働きがあります。
for(int i = 0 ; i < 10 ; i++){ |
while(条件式){ |
例題(Break文(for))
新たにBreakExec01
クラスを作成し、実際に以下を入力し実行してみてください。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | BreakExec01 |
package chapter4; |
コンパイル例:> javac chapter4¥BreakExec01.java
実行例:> java chapter4.BreakExec01
iは0です。
iは1です。
iは2です。
iは3です。
iは4です。
for文を終了しました。
例題(break文(while文))
新たにBreakExec02
クラスを作成し、実際に以下を入力し実行してみてください。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | BreakExec02 |
package chapter4; |
コンパイル例:> javac chapter4¥BreakExec02.java
実行例:> java chapter4.BreakExec02
iは1です。
iは2です。
iは3です。
iは4です。
while文を終了しました。
多重ループ
for文の中にさらにwhile文やfor文がある構造を多重ループ
(またはネスティング
やネスト
)といいます。
多重ループを利用することによって、より高度な繰り返し処理を行うことができます。
例題(多重ループ(for文の中にfor文の場合))
新たにNestExec01
クラスを作成し、以下を入力し実行してみてください。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | NestExec01 |
package chapter4; |
コンパイル例:> javac chapter4¥NestExec01.java
実行例:> java chapter4.NestExec01
iは 0 jは 0
iは 0 jは 1
iは 0 jは 2
--------------
iは 1 jは 0
iは 1 jは 1
iは 1 jは 2
--------------
iは 2 jは 0
iは 2 jは 1
iは 2 jは 2
--------------
各ループの処理が終了しました。
例題(多重ループ(while文の中にfor文の場合))
新たにNestExec02
クラスを作成し、以下を入力し実行してみてください。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | NestExec02 |
package chapter4; |
コンパイル例:> javac chapter4¥NestExec02.java
実行例:> java chapter4.NestExec02
iは 0 jは 0
iは 0 jは 1
iは 0 jは 2
iは 0 jは 3
iは 0 jは 4
--------------
iは 1 jは 0
iは 1 jは 1
iは 1 jは 2
iは 1 jは 3
iは 1 jは 4
--------------
iは 2 jは 0
iは 2 jは 1
iは 2 jは 2
iは 2 jは 3
iは 2 jは 4
--------------
例題(多重ループ(while文の中にfor文の場合(break)))
for文やwhile文のブロック内でbreak文が実行されるとブロックを抜けて次の処理へ移りますが、多重ループ
になっている場合にbreak文が実行された場合にどうなるのかを確認します。
新たにNestExec03
クラスを作成し、以下を入力し実行してみてください。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | NestExec03 |
package chapter4; |
コンパイル例:> javac chapter4¥NestExec03.java
実行例:> java chapter4.NestExec03
3の行開始
3*1=3
3*2=6
3*3=9
3の行終了
4の行開始
4*1=4
4*2=8
4の行終了
5の行開始
5*1=5
5の行終了
計算終了
上記はfor文の中にfor文が記述されています。そして内側のfor文の中にbreak文が記述されています。この場合、for文が実行されると、for文を含んでいる一番内側の繰り返し処理だけを抜けて次の処理へ移ります。その為、break文が実行されたfor文の外にあるfor文の処理の流れには影響を及ぼしません。
ラベル付きbreak文
break文が実行されるとbreak文を含む一番内側のブロックを抜けますが、ラベル付きのbreak文にすることで任意のブロックを抜けることができます。
例題(ラベル付きbreak文)
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | NestExec04 |
package chapter4; |
コンパイル例:> javac chapter4¥NestExec04.java
実行例:> java chapter4.NestExec04
i=1 j=1i + j=2
i=1 j=2i + j=3
i=1 j=3i + j=4
i=1 j=4i + j=5
i=2 j=1i + j=3
i=2 j=2i + j=4
i=2 j=3i + j=5
break
ラベル付きbreak文が実行されると、指定されたラベルが付けられたブロックを抜けます。よって上記の場合はif文の条件式がtrueになると一番外側のfor文を抜けます。
continue文
continue文はforやwhileなどの中だけに使用することができます。continue文は処理をスキップしたい場合に使用します。
例題(continue文)
新たにNestExec05
クラスを作成し、実際に以下を入力してください。
項目 | 名前 |
---|---|
プロジェクト | alj_study |
パッケージ | chapter4 |
クラス | NestExec05 |
package chapter4; |
コンパイル例:> javac chapter4¥NestExec05.java
実行例:> java chapter4.NestExec05
iは1です。
iは2です。
iは3です。
iは4です。
iは6です。
iは7です。
iは8です。
while文を抜けました。
iが5の時は「System.out.println(“iは” + i + “です。”);」が実行されず、処理がスキップされています。
章のまとめ
以下の要点を理解できたら次の章へ進んでください。
制御文とは
- 制御文には
分岐(条件分岐)
と反復(繰り返し)
がある - 制御文を組み合わせることで、
柔軟
で実用性のある処理
にすることができる - 分岐(条件分岐)には
if文
、else-if文
、switch文
がある - 反復(繰り返し)には
while文
、do-while文
、for文
がある
分岐(条件分岐)
if文(else文がない場合)
条件式の結果
によって処理を分岐
させたい場合に使用する構文である- 条件式が
true
の場合はif文のブロック内の処理
を実行する
if文(else文がある場合)
- 条件式の結果が
true
の場合はif文のブロック内の処理
を実行する - 条件式の結果が
false
の場合はelse文のブロック内の処理
を実行する
else if文
- 条件式が
false
の場合に別の条件式
を指定することができる - else if文は
多分岐
を行うことができ、それぞれの条件に応じた処理
を行うことができる
switch文
- switch文は1つの
式
を指定し、定数によって処理を分岐
する - 式は
定数
または変数
を指定する(byte型、short型、int型、char型、String型、列挙型のみ) - 処理は、式とcaseの定数値を評価し、
一致する処理を実行
する - どのcaseにも該当しない場合、
default
の処理を実行する(defaultの記述は省略可能
)
反復(繰り返し)
while文
- while文は
条件式
がtrue
の場合は、while文のブロック内の処理が実行される - 処理が終了したのち、再び
条件判定
が行われ、条件式がfalse
になるまで繰り返し処理される
do-while文
- do-while文も
while文と同様
に、繰り返し処理を行うことができる - while文との違いは、繰り返し処理を実行した
後
に条件判定
が行われる - do-while文の
末尾
には; (セミコロン)
が必要である
for文
- for文は3つの式を持ち、式1に
初期値
の設定、式2に条件判定
、式3に再初期化の設定
をする - 式1で
カウンタ変数の初期化
が行われる - 式2で
条件判定
が行われ、true
の場合for文のブロック内の処理が実行
される - ブロック内の処理が実行された後、式3で
再初期化の設定処理
が行われる
拡張for文
配列
やコレクション
の全要素の値を参照
する際には、拡張for文
を利用する変数宣言の型
は、配列の要素の型
を指定する- 変数宣言と配列名(コレクション)の間は
:(コロン)
で区切る
多重ループ(ネスト)
多重ループ(ネスト)
は制御文を入れ子
にして使用する機能のこと- for文やwhile文、do-while文などの各文を入れ子にすることで
高機能な繰り返し
が可能
break文
break文
は、現在実行中の繰り返し処理
から抜け、繰り返し処理の次の実行文に制御を移す
- while文、do-while文、for文、拡張for文などの
繰り返し部分に記述
すると、繰り返しから抜けることができる switch文のcase内に記述
することでswitch文から抜ける
ことができるラベル付きのbreak文
にすることで、任意のブロックを抜ける
ことができる- ラベルを設定する場合は
ラベル名 :(コロン)
を指定する - ラベル付きのbreak文を実行したい場合は、
break ラベル名 ;
を指定する
continue文
- continue文は、現在実行中の繰り返し処理から抜けず、最も内側の繰り返し処理の構文の最後に制御を移し、繰り返し処理を継続する
- while文、do-while文、for文、拡張for文などの
繰り返し部分に記述
することができる