3. 制御文
3.1. 基本構造
一般に,プログラムは以下の3通りの基本構造を組み合わせて作成されています。
順次構造: プログラムが書かれている順番(上から下)に処理が行われる構造です。
選択構造: 複数の処理を用意しておき,状況に応じて実行する処理を選択する構造です。
反復構造:同じ処理を複数回繰り返す時に用いる構造です。
次項から、これらの構造を構築するための制御文の説明を行います。
3.2. if、else、return
(1) if
if
(もしも…ならば)は、「ある条件が成り立つ場合に、ある処理を実行」する為の制御文です。
これを利用することにより、基本構造の一つである選択構造を実現します。
ifの基本構文
if(条件){ 条件が成り立つ場合に実行する処理 }
「条件」が成り立つ場合には、「条件が成り立つ場合に実行する処理」を実行します。
ifのサンプル
class IfTest{ public static void main(String[] args){ int i = 10; if(i == 10){ System.out.println("iは10です。"); } } }
(2) else
else
(さもなければ)は、「ある条件が成り立たない場合に、次の手段として、ある処理を実行」する為の制御文です。If
文の後ろに付加します。
if elseの基本構文
if(条件){ 条件が成り立つ場合に実行する処理 } else { 条件が成り立たない場合に実行する処理 }
「条件」が成り立つ場合には、「条件が成り立つ場合に実行する処理」を実行します。
「条件」が成り立たない場合には、「条件が成り立たない場合に実行する処理」を実行します。
if elseのサンプル
class IfTest2{ public static void main(String[] args){ int i = 10; if(i == 10){ System.out.println("iは10です。"); }else{ System.out.println("iは10ではありません。"); } } }
ここでもし、「条件が成り立たない場合に実行する処理」に対しても、何らかの条件が成り立った場合にのみ実行するように設定したい場合は、else
の後ろにif
文を記述することになります。
if else ifの基本構文
if(条件1){ 条件1が成り立つ場合に実行する処理 } else if(条件2){ 条件2が成り立つ場合に実行する処理 }
「条件1」が成り立つ場合には、「条件1が成り立つ場合に実行する処理」を実行します。
「条件1」が成り立たないが、「条件2」が成り立つ場合には、「条件2が成り立つ場合に実行する処理」を実行します。
「条件1」と「条件2」の両方の条件が成り立つ場合でも、先に記述されている「条件1」の方が優先されるため、「条件1が成り立つ場合に実行する処理」が実行されることになります。
if else ifのサンプル
class IfTest3{ public static void main(String[] args){ int i = 10; if(i == 10){ System.out.println("iは10です。"); }else if(i == 5){ System.out.println("iは5です。"); } } }
(3) return
return
(戻る)は、「現在の処理を完了して呼び出し元に処理を返す」為の制御文です。
returnの構文の例
先に実行される処理() { 呼び出し先を実行する(); } 呼び出し先() { if(条件){ return; } 条件が成り立たない場合に実行する処理 }
ここでは、「先に実行される処理」から「呼び出し先」を呼び出しています。
「条件」が成り立つ場合には、return
により、呼び出し元である「先に実行される処理」に処理を戻します。
もし、「条件」が成り立たない場合には、「条件が成り立たない場合に実行する処理」を実行してから、呼び出し元である「先に実行される処理」に処理を戻します。
returnのサンプル
class IfTest4{ public static void main(String[] args){ System.out.println("main処理を開始します。"); sub(); System.out.println("main処理が最後まで実行されました。"); } private static void sub(){ int i = 10; if(i == 10){ System.out.println("returnが行われます。"); return; } System.out.println("sub処理が最後まで実行されました。"); } }
3.3. switch
switch
(変える)は、「計算を行い、その計算結果に応じた処理を実行」する為の制御文です。
これを利用することにより、if
文と同様に、基本構造の一つである選択構造を実現します。
switchの基本構文
switch(計算式){ case 値1: 計算結果が値1だった場合に実行する内容 break; case 値2: 計算結果が値2だった場合に実行する内容 break; default: 計算結果が値1でも値2でも無かった場合に実行する内容 }
「計算式」の計算結果が「値1」だった場合は、「計算結果が値1だった場合に実行する内容」を実行します。
「計算式」の計算結果が「値2」だった場合は、「計算結果が値2だった場合に実行する内容」を実行します。
「計算式」の計算結果が「値1」でも「値2」でも無かった場合は、「計算結果が値1でも値2でも無かった場合に実行する内容」を実行します。
switchのサンプル
class SwitchTest{ public static void main(String[] args){ int i = 5; switch(i-3){ case 1: System.out.println("i-3は1です。"); break; case 2: System.out.println("i-3は2です。"); break; case 3: System.out.println("i-3は3です。"); break; default: System.out.println("i-3は1、2、3以外です。"); } } }
「計算式」の計算結果と「値」は、整数型か文字型(char)になる必要があります。
構文の下部の、default
の記述は省略する事が可能です。省略すると、計算の結果に対応する値が無い場合に、何も実行されなくなります。
case
のそれぞれの処理の最後に、break
(やめさせる)が記述されています。これは、switch
処理から抜け出す事を表しています。
この記述を行わないと、switch
処理を抜け出さずに、次のcase
の処理を実行することになります。
switchの間違った構文
switch(計算式){ case 値1: 計算結果が値1だった場合に実行する内容 case 値2: 計算結果が値2だった場合に実行する内容 default: 計算結果が値1でも値2でも無かった場合に実行する内容 }
このように記述すると、「計算式」の計算結果が「値1」だった場合に、「計算結果が値1だった場合に実行する内容」、「計算結果が値2だった場合に実行する内容」、「計算結果が値1でも値2でも無かった場合に実行する内容」を実行してしまいます。
また、「計算式」の計算結果が「値2」だった場合に、「計算結果が値2だった場合に実行する内容」、「計算結果が値1でも値2でも無かった場合に実行する内容」を実行してしまいます。
処理を正確に終わらせるために、break
を忘れずに記述する必要があります。
3.4. while
while
(…する間)は、「ある条件が成り立っている間は、ある処理の実行を繰り返す」為の制御文です。
これを利用することにより、基本構造の一つである反復構造を実現します。
whileの基本構文
while(条件){ 条件が成り立つ場合に実行する処理 }
「条件」が成り立っている間は、「条件が成り立つ場合に実行する処理」を繰り返します。
whileのサンプル
class WhileTest{ public static void main(String[] args){ int i = 0; while(i<10){ System.out.println("iは" + i + "です。"); i = i + 1; } } }
この繰り返し処理から抜けるには、条件が成り立たないようにするか、break
を使用します。
breakの構文の例
while(条件1){ 条件1が成り立つ場合に実行する処理 if(条件2){ break; } }
「条件1」が成り立っている間は、「条件2が成り立つ場合に実行する処理」を繰り返します。
「条件2」が成り立つ場合は、break
により繰り返し処理から抜け出します。
breakのサンプル
class WhileTest2{ public static void main(String[] args){ int i = 0; while(i<10){ System.out.println("iは" + i + "です。"); i = i + 1; if(i==5){ System.out.println("iが" + i + "の為、breakを行います。"); break; } } } }
while
文では、「条件」が成り立っている間は、「条件が成り立つ場合に実行する処理」を繰り返しました。それは、処理の最初の時点で「条件」が成り立たなかった場合は、「条件が成り立つ場合に実行する処理」が一度も実行されずに次の処理に進むことを意味します。
次のdo while
文では、処理を一度は実行したい時に使用します。
do whileの基本構文
do { 処理 } while (処理をもう一度、実行するかを判断する条件);
最初に「処理」を行います。
そして、「処理を再び実行するかを判断する条件」が成り立った場合は「処理」の実行に戻ります。
do whileのサンプル
class DoWhileTest{ public static void main(String[] args){ int i = 5; do { System.out.println("iは" + i + "です。"); } while (i < 3); } }
3.5. for
for
(…の間)は、while
文と同様に、「ある条件が成り立っている間は、ある処理の実行を繰り返す」為の制御文です。
これを利用することにより、基本構造の一つである反復構造を実現します。
forの基本構文
for(初期設定; 条件; 繰り返しを一回終了するごとに実行する処理){ 条件が成り立つ場合に実行する処理 }
最初に初期設定を行います。
「条件」が成り立つ場合は、「条件が成り立つ場合に実行する処理」、「繰り返しを一回終了するごとに実行する処理」を行った後、「条件」が成り立つかを判別する処理に戻ります。
「条件」が成り立たない場合は、繰り返し処理を抜けます。
forのサンプル
class ForTest{ public static void main(String[] args){ for(int i = 0; i<10; i++){ System.out.println("iは" + i + "です。"); } } }
while
文と違うのは、「条件が成り立つ場合に実行する処理」に本来の業務処理を記述し、「条件が成り立つ場合に実行する処理の後に、実行する処理」に条件が成り立つかを制御する処理を記述する事によって、二つの処理を明確に分ける事ができる点になります。
while
文と同じように、break
を使用することで繰り返し処理を抜けることが可能です。
breakの構文
for(初期設定; 条件1; 繰り返しを一回終了するごとに実行する処理){ 条件1が成り立つ場合に実行する処理 if(条件2){ break; } }
breakのサンプル
class ForTest2{ public static void main(String[] args){ for(int i = 0; i<10; i++){ System.out.println("iは" + i + "です。"); if(i==5){ System.out.println("iが" + i + "の為、breakを行います。"); break; } } } }
while
文、for
文のような繰り返し処理を補佐するものとして、continue
(続ける)が用意されています。
これを実行することで、繰り返し処理の残りを飛ばして、次の繰り返し処理を開始することになります。
continueの構文の例
while(条件1){ 条件1が成り立つ場合に実行する処理 if(条件2){ continue; } 繰り返しの最後に行う処理 }
最初に、「条件1」が成り立ち、「条件1が成り立つ場合に実行する処理」を実行したとします。
そして、「条件2」が成り立つ場合は、continue
により、繰り返し処理の残りである「繰り返しの最後に行う処理」を飛ばして、「条件1」が成り立つかを判別する処理に戻ります。
その時、「条件2」が成り立たない場合は、「繰り返しの最後に行う処理」を行った後、「条件1」が成り立つかを判別する処理に戻ります。
continueのサンプル
class ForTest3{ public static void main(String[] args){ for(int i = 0; i<10; i++){ System.out.println("iは" + i + "です。"); if(i==5){ System.out.println("iが" + i + "の為、continueします。"); continue; } System.out.println("iが" + i + "の場合の、処理の残りです。"); } } }
3.6. ネスト構造
3.4while
の項目と3.5 for
の項目で、break
やcontinue
の処理を実現するにあたって、for
文の中にif
文を埋め込んだり、while
文の中にif
文を埋め込んだりしています。
このように構造の中に構造を埋め込む構造を、ネスト構造といいます。
ネストの構文の例
if(条件1){ 条件1が成り立つ場合に実行する処理 if(条件2){ 条件1と、条件2が成り立つ場合に実行する処理 } }
「条件1」が成り立つ場合には、「条件1が成り立つ場合に実行する処理」を実行します。
「条件1」と「条件2」が成り立つ場合には、「条件1と、条件2が成り立つ場合に実行する処理」を実行します。
ネストのサンプル
class NestTest{ public static void main(String[] args){ for(int i = 1; i<20; i++){ if(i%2==0){ System.out.println(i + "は偶数です。"); if(i%3==0){ System.out.println(i + "は3で割り切ることもできます。"); } } } } }
順次構造、選択構造、反復構造に、ネスト構造を組み合わせる事によって、さまざまなプログラムを作成することになります。
3.7. 演習問題
(1) if文問題
演習問題サンプル
public class MondaiForIf { public static void main(String[] args) { String s = args[0]; // 画面から入力された数値を、変数scoreにセットします。 int score =Integer.valueOf(s).intValue(); // 画面に出力する文字をセットするための変数textを宣言します。 String text = ""; ? // 変数textの値を画面に出力します。 System.out.println(text); } }
上のサンプルは、0
から100
の値の入力を受け取り、その値が70点以上ならば「合格
」と出力し、70点未満ならば「不合格
」と出力するためのプログラムです。
?の部分にif文を使った処理を追加し、プログラムを完成させてください。
(2) switch文問題
演習問題サンプル
public class MondaiForSwitch{ public static void main(String[] args) { String s = args[0]; // 画面から入力された数値を、変数scoreにセットします。 int number =Integer.valueOf(s).intValue(); // 画面に出力する文字をセットするための変数textを宣言します。 String text = ""; ? // 変数textの値を画面に出力します。 System.out.println(text); } }
上のサンプルは、0
から9
の値の入力を受け取り、その値を英語で出力するためのプログラムです。
?の部分にswitch文を使った処理を追加し、プログラムを完成させてください。
(3) while文問題
演習問題サンプル
class MondaiForWhile{ public static void main(String[] args) { String s = args[0]; // 画面から入力された数値を、変数numberにセットします。 int number =Integer.valueOf(s).intValue(); ? // 変数numberの値を画面に出力します。 System.out.println(number); } }
上のサンプルは、1
から9
の値の入力を受け取り、その値が1000
以上になるまで、値を2倍するプログラムです。
?の部分にwhile文を使った処理を追加し、プログラムを完成させてください。
(4) for文問題
演習問題サンプル
public class MondaiForFor{ public static void main(String[] args) { String s = args[0]; // 画面から入力された数値を、変数numberにセットします。 int number =Integer.valueOf(s).intValue(); ? // この処理は変数numberの数だけ実行されます。 System.out.println("このメッセージは" + number + "回出力されます。"); ? } }
上のサンプルは、0
から9
の値の入力を受け取り、その値の数だけprintln
の処理を行うプログラムです。
二つの?の部分にfor文を使った処理を追加し、プログラムを完成させてください。
(5) ネスト構造問題
演習問題サンプル
public class MondaiForNest{ public static void main(String[] args) { String s = args[0]; // 画面から入力された数値を、変数numberにセットします。 int number =Integer.valueOf(s).intValue(); ? // この処理は変数numberが5でも6でも割り切れる場合に実行されます。 System.out.println("この値は5でも6でも割り切れます。"); ? } }
上のサンプルは、0
から100
の値の入力を受け取り、その値が5でも6でも割り切れる場合にprintln
の処理を行うプログラムです。
二つの?の部分にネスト文を使った処理を追加し、プログラムを完成させてください。