【文系でもわかるJavaプログラミング】3.制御文
第2章までのプログラムは上から下に処理が進んでいくだけの単純なプログラムでした。
しかし、プログラムを作っていくうえでただ単に一方通行の処理をだけというわけにはいきません。ある条件の時だけ処理が動くことにしたり、同じ処理を何回も繰り返したり、そういった処理を組み合わせて大きなプログラムを作っていきます。
このような処理を制御文といいます。
Javaの制御文は大きく分けると「選択構造」と「繰り返し構造」の2つがあります。ここではこの2つの制御文の構文について解説をしています。
【PR】プログラミングスクール【PR】独学で挫折しそう、やっぱり難しい、手早く学びたい。そんな人にはやはりプログラミングスクールがお勧めです。
【プログラミングスクールを利用するメリット】
JavaはWebアプリケーションなどを作ることができるプログラミング言語です。しかし、独学だと基本事項からなかなか抜け出せず、アプリを作るイメージができずに挫折してしまう人も多いです。紹介する二つのプログラミングスクールのJavaコースはWebアプリケーションを作ることを前提にカリキュラムが組まれていますので、より実用的な内容を学ぶことができます。
おすすめ1▶TechAcademy
Javaコース
おすすめ1▶CodeCamp
Javaマスターコース
選択構造
選択構造はYesかNoで答えられる条件があり、それに従って分岐をさせる処理を指します。
Javaでは条件文といわれるif文かswitch文を使用して記述します。どちらを使用するかはその場合によって選択します。
if文
if文は条件式がtrueになった場合に処理を行い、falseの場合は処理を行わないという制御文です。
構文「if文」if(条件式){
処理文 //条件式がtrueのときに実行
}
次のプログラムはif文を使い、20歳以上か未満かを見分けるプログラムを作りました。制御文が使えると少しプログラムっぽくなってくるので名前を付けましょう。if文で使うプログラムは「年齢分けプログラム」です。
「条件式」の部分はtrueかfalseにならなくてはいけません。ここでは変数ageが20未満でtrue、20以上でfaleseになるようになっています。そして、trueの場合は{ }の中の処理が実行され、falseの場合は実行されません。
まずは、条件式がtrueの場合を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 |
class Test1{ public static void main(String[]args) { int age = 19; if(age<20) { System.out.println("20歳未満です。お酒は売れません。"); } System.out.println("処理終了"); } } |
処理終了
falseの場合も見てみましょう。20は20以上なのでfalseとなります。
1 2 3 4 5 6 7 8 9 10 11 |
class Test1{ public static void main(String[]args) { int age = 20; if(age<20) { System.out.println("20歳未満です。お酒は売れません。"); } System.out.println("処理終了"); } } |
実行結果処理終了
if-else文
if文の場合はtrueの時のみ実行される処理を記述しています。if文の進化系であるif-else文ではtrue文のみ実行される処理に加えてfalseの時のみ実行される処理も書くことができます。
構文「if-else文」if(条件式){
処理文 // 条件式がtrueのときに実行
} else {
処理文 // 条件式がfalseのときに実行
}
例文を見てみましょう。trueの場合はif文の時と同じ実行結果となりますので、falseのみ見てみます。
if文の場合はtrueでもfalseでも実行される処理である「処理終了」が出るだけですが、今回はfalseのみ実行される処理も表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Test1{ public static void main(String[]args) { int age = 20; if(age<20) { System.out.println("20歳未満です。お酒は売れません"); }else { System.out.println("20歳以上です。お酒を売れます"); } System.out.println("処理終了"); } } |
処理終了
else-if文
if文ではtrueのみの処理を、if-else文ではtrueとfalseの2分岐の処理を書くことができました。しかし、if-else文では3分岐の処理を書くことができません。
たとえば、20歳以上にはお酒を売りますが、60歳以上は割引価格で売ること場合、20歳未満・20歳以上60歳未満・60歳以上の3分岐となります。こういった場合に使うのが、else-if文です。これを使うと3分岐以上、4分岐・5分岐も何分岐でも書くことができるようになります。
構文「else-if文」if(条件式1){
処理文1; //条件式1がtrueの時実行
} else if(条件式2){
処理文2;//条件式1がfalse、条件式2がtrueの時実行
} else {
処理文3;//条件式1、2ともにfalseの時実行
}
それでは、プログラム例を見てみましょう。変数ageを様々な数字にして試してみてください。この例は新しく作った60歳以上の場合です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Test1{ public static void main(String[]args) { int age = 60; if(age<20) { System.out.println("20歳未満です。お酒は売れません。"); }else if(age<60) { System.out.println("20歳以上です。お酒を売れます。"); }else { System.out.println("60歳以上です。割引価格です。"); } System.out.println("処理終了"); } } |
実行結果60歳以上です。割引価格です。
処理終了
switch文
switch文は式と定数を比較し、一致したときにcaseの後の処理を実行する制御文です。
構文「switch文」switch(式){
case 定数1:
処理文1;//式の結果と定数1が一致したとき実行
break;
case 定数2 :
処理文2;//式の結果と定数2が一致したとき実行
break;
(caseいくつでも書ける)
default :
処理文n; //どのcaseにも一致しなかった場合実行
}
それでは、プログラムの例を見てみましょう。このプログラムは「名物紹介プログラム」です。変数kenに入った県が「群馬」「栃木」「茨城」のとき、それぞれ「こんにゃくが有名です」「餃子が有名です」「納豆が有名です」という名物紹介が出てきます。そのほかの県を入れると「その県は知りません」と出てきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Test1{ public static void main(String[]args) { String ken = "群馬"; switch(ken) { case "群馬" : System.out.println("こんにゃくが有名です"); break; case "栃木" : System.out.println("餃子が有名です"); break; case "茨城" : System.out.println("納豆が有名です"); break; default : System.out.println("その県は知りません"); } } } |
実行結果こんにゃくが有名です
ここでswitch文の構文に「break;」を入れることにしていますが、このbreakがない場合、breakがあるところのcaseまで出力され続けるので注意しましょう。試しに「群馬」のところの「break」を外してみたプログラムがこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class Test1{ public static void main(String[]args) { String ken = "群馬"; switch(ken) { case "群馬" : System.out.println("こんにゃくが有名です"); case "栃木" : System.out.println("餃子が有名です"); break; case "茨城" : System.out.println("納豆が有名です"); break; default : System.out.println("その県は知りません"); } } } |
餃子が有名です
これでは誤りですよね。breakが一切ないと、defaultまで全て出力されてしまいます。
また、このswich文はbyte型、short型、int型、char型、enum型、String型でしか使うことができないことも注意しましょう。
繰り返し構造
選択構造はyes、noで分岐を作っていく構文でした。もう一つ、プログラムで重要な構文は繰り返し構造です。10回、20回、1000回、10000回とたくさん同じことを繰り返すのはコンピュータが得意とするものです。この構文を使うことにより、もっとコンピュータを有効に活用するプログラムを作ることができます。
繰り返しの構文にはwhile文とfor文があります。
while文
while文は条件式がtrueの間、同じ処理を繰り返す構造です。
構文「while文」while(条件式){
処理文; //条件式がtrueの間実行され続ける
}
例とするプログラムは変数numが9以下の場合、変数numに8をかけていくプログラムです。つまり、8の段を表すプログラムになっています。
1 2 3 4 5 6 7 8 9 10 11 12 |
class Test1{ public static void main(String[]args) { int num = 1; while(num <= 9) { int hachinodan = num*8; System.out.println(hachinodan); ++num; } } } |
16
24
32
40
48
56
64
72
まず、最初は変数num=1が条件式に入ります。そこで「1<=9」なのでtrueとなり、{ }内が実行されます。num*8により、1*8となり、それが変数hachinodanに格納され、printlnメソッドによって、8が出力されます。
その後、++numによりnumが1プラスされ、2となり、また条件式に入ります。「2<=9」なのでtrueとなり、2*8となり、printllnメソッドで16が出力されます。そして、++numによりnumが3となり、条件式に入ります。
それを繰り返し、10となったときに、「10<=9」でfalseとなりwhile文を抜けて終了します。
気を付けないといけないのは、++numを書かないと永遠にnumが1のままのため、無限ループとなってしまうことです。while文の場合は、無限ループに注意をしましょう。
for文
while文に比べるとfor文はやや複雑です。for文にはカウンタ変数と呼ばれる変数が用意され、これにより決まった回数の処理ができるように工夫されています。
構文「for文」for(式1;式2;式3){
処理文
}
※式1:カウンタ変数宣言と初期化
※式2:条件式
※式3:カウンタ変数の初期化
for文で8の段プログラムを書くとこのようになります。
1 2 3 4 5 6 7 8 9 |
class Test1{ public static void main(String[]args) { for (int num=1;num<=9; ++num) { int hachinodan = num*8; System.out.println(hachinodan); } } } |
16
24
32
40
48
56
64
72
まずfor文の中の最初の式「int num = 1」で初期設定をします。次の式「num<=9」が条件式となり、ここがtrueの場合{ }内の処理が実行されます。最初は初期値であるnum=1が代入されて実行されます。処理が1回終わると式の3つ目の「++num」でnumが一つ増え(カウンタ変数の更新)、2*8、3*8と続いていきます。
for文は式1から式3まであるのが基本ですが、いずれかを書かない式も実行可能です。ただし、例えばこの8の段プログラムの場合、式3がないとずっと8*1が続いて無限ループとなりますので、注意しましょう。
配列とfor文
for文は配列の要素を取り出すときに使うことが多いです。最初はちょっと複雑に感じるかもしれませんが、よく使われるので理解しておきましょう。
8の段プログラムの配列バージョンを使います。まず、どんなことをするのか比較しやすいように第2章で使ったプログラムを紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Test1 { public static void main(String[] args) { int[] hachinodan = {8,16,24,32,40,48,56,64,72}; //省略記法 //配列を出力 System.out.println(hachinodan[0]); System.out.println(hachinodan[1]); System.out.println(hachinodan[2]); System.out.println(hachinodan[3]); System.out.println(hachinodan[4]); System.out.println(hachinodan[5]); System.out.println(hachinodan[6]); System.out.println(hachinodan[7]); System.out.println(hachinodan[8]); } } |
こちらが第2章の配列で使った8の段プログラムです。配列の値を取り出すのに「hachinodan[0] 」「hachinodan[1]」・・・と9行もの行数を費やしています。9行程度ならまだいいものの、これがもっと多くなったら大変ですよね。これをまとめることができるのがfor文です。
次のように記述します。
1 2 3 4 5 6 7 8 9 |
class Test1{ public static void main(String[]args) { int[] hachinodan = {8,16,24,32,40,48,56,64,72}; for(int count=0;count<9;count++) { System.out.println(hachinodan[count]); } } } |
16
24
32
40
48
56
64
72
まず、for文の式1にカウント変数countを用意して、初期値を0にします。式2では「count<9」が条件となっており、最初は0なのでtrueとなり、処理に入ります。処理文はprintlnメソッドの中に「hachinodan[count]」が入っています。ここにcount=0が代入されて、「hachinodan[0]」となり、配列の「8」が取り出されます。そして式3の「++count」により変数countが「1」になり、また条件式「count<9」でtrueとなり・・・
こうして配列の最後まで取り出されて終了します。
このように、配列のすべてを取り出す場合、カウント変数の初期値は0となり、条件式は「カウント変数<配列の要素数」の形になります。
拡張for文
for文で配列の要素を取り出す方法を紹介しましたが、実は配列専用のfor文も用意されています。これを拡張for文といいます。
構文「拡張for文」for(変数宣言:参照変数名){
処理文;
}
それでは、プログラム例を見てみましょう。
1 2 3 4 5 6 7 8 9 |
class Test1{ public static void main(String[]args) { int[] hachinodan = {8,16,24,32,40,48,56,64,72}; for(int num : hachinodan) { System.out.println(num); } } } |
16
24
32
40
48
56
64
72
まず変数宣言として、拡張for文の中で使う変数を宣言します。参照変数名では配列名を指定します。ここでは配列名hachinodanを記述すると、配列hachinodanにある配列が一つずつ変数numに格納されていき、printlnメソッドで出力されます。
まとめ
第3章では制御文を見てきました。制御文が書けるようになるとだいぶプログラムらしい処理を行うことができます。
応用版となりますが、Scanerクラスというものを使って少しだけプログラムを変えると、キーボードからの処理を受けるつけることができるようになります。サンプルプログラムをコピーして実行してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.util.Scanner; class Test1{ public static void main(String[]args) { System.out.println("群馬、栃木、茨城のいずれかを入力してください"); Scanner scan = new Scanner(System.in); String ken = scan.next(); switch(ken) { case "群馬" : System.out.println("こんにゃくが有名です"); break; case "栃木" : System.out.println("餃子が有名です"); break; case "茨城" : System.out.println("納豆が有名です"); break; default : System.out.println("その県は知りません"); } } } |
このプログラムを実行するとコンソールに「群馬、栃木、茨城のいずれかを入力してください」と表示されます。その下にキーボードから入力できるようになっているので群馬、栃木、茨城のいずれか、またはそのほかの文字列を入力してみてください。
このようにすると少しアプリっぽくなりますよね。
制御文は奥深く、多くのプログラムはこれらの構造を組み合わせて作られています。制御文を組み合わせて思ったような処理を書くことをアルゴリズムといいます。このアルゴリズムが文系プログラマーの大きな壁となるのですが、まずは単純な制御文の構造をしっかり押さえて使いこなせるようになれるように頑張っていきましょう。
おすすめ書籍
ディスカッション
コメント一覧
まだ、コメントがありません