Java-3 ?>

Java-3

演算子と制御文

Java3からは演算子制御文というものを学習していきます。この演算子と制御文の考え方は、プログラミングをする上では欠かせない基礎知識となっています。特に、制御文をマスターすると、あらゆる条件をカバーしたプログラムが実装可能になっていきます。前章までは、プログラム中に記述された様々な処理を、その順番とおり実行するだけのものでした。このような処理の流れを順次処理といい、下図の左側がそのフローチャートになります。

しかし、プログラムというものは単調な処理だけでは成り立ちません。開発するシステムの機能毎に、様々な仕様(プログラムの処理内容、求められる結果を決めたもの)があり、それらは複雑な条件によってプログラムの動きを変えていく必要が出てきます。そのようにプログラムの動きを変えながら実行していく処理は、分岐処理といい、下図の右側のフローチャートになります。

課題を進めながら少しずつ理解していきましょう。

スクリーンショット 2017-03-21 午前9.20.48

Javaプロジェクトを作成しよう

Java3のプロジェクトを作成します。
プロジェクト名に章の名前「Java3」を入力し、作成してください。

Javaプロジェクトの作成

各種演算子の使用

Java1で四則演算について少し学習しましたが、ここではより詳細なJava演算子をみていきましょう。

演算子とは

Java言語で足し算や掛け算など何かしらの計算を行う場合には、演算子を使用します。他のプログラミング言語同様に、Javaにも様々な演算子が用意されています。下記の一覧表を一通り確認しておきましょう。

種類 演算子 結合規則
単項演算子 ++ – + - 〜 ! (キャスト) 右結合
算術演算子 * / % + - 左結合
シフト演算子 << >> >>> 左結合
関係演算子 < > <= >= instanceof == != 左結合
ビット演算子 & ^ | 左結合
論理演算子 && || 左結合
3項演算子 ?: 右結合
代入演算子 = *= /= %= += -= <<= >>= >>>= &= ^= |= 右結合

 

演算子の優先順位

演算子には優先度結合規則というものがあります
優先度とは・・・1行の式の中に複数の演算子があった場合、どの演算子から計算するかという順序づけのことです。(上記の一覧表では、上から順に優先度が高くなっています。)
結合規則とは・・・優先度が同じ演算子がある場合に、左から右へ計算する左結合と、右から左へ計算する右結合のことです。

課題:演算子の動きを確認してみよう

四則演算

Java3のプロジェクトにRenshu1.javaを作成して、四則演算の処理を実装してみましょう。
ソースコードはコピーせずに、一つずつ自分で書いていくようにしてください。

作成したJavaファイルを実行して、動作確認を行ってください。

スクリーンショット 2017-03-18 午後5.27.41

インクリメント、デクリメント演算子

Java3のプロジェクトにRenshu2.javaを作成して、インクリメント演算子とデクリメント演算子の前置型・後置型それぞれを実装していきましょう。

作成したJavaファイルを実行して、動作確認を行ってください。インクリメント演算子、デクリメント演算子は、それぞれで処理の結果が全く異なってきますので、コードを実行しながら内容を確かめるようにしてください。ここの理解がおろそかになってしまうと、思わぬバグを発生させてしまうこともあります。

スクリーンショット 2017-03-18 午後5.43.39

その他演算子まとめ
http://www.javadrive.jp/start/ope/

上記のサイトで紹介されているサンプルコードなども、一通り確認しておきましょう。

制御文とは

プログラムは通常、記述した順番通りにしか処理を行いません。しかし、システムを構築する上では、条件によって処理を変えたり(条件判定)、同じ処理を繰り返したい(ループ処理)場合があります。このような状況で使用するものが制御文です。
制御文を活用することによって、単調なプログラムの流れを柔軟にコントロールして、様々な処理を実現できます。Java言語には条件文繰り返し文繰り返し制御文の3種類の制御文があります。

条件文ってなんだろう?(初心者向けコラム)

プログラミング言語に慣れている人からしたら条件文という言葉はおなじみだと思います。しかし、プログラミング初心者の方にはあまり聞き慣れない難しい言葉のように思いますね。でも意外と、普段の生活の中でも条件文にそった行動を人はしています。

例えば、条件文が使わるのは以下のような場面です。
①友人との休日の予定を決める時、天気予報を見て休日の天気を確認したとします。
もし、休日の天気が雨なら、映画館に行くなど室内でも楽しめることを企画します。
もし、休日の天気が晴れなら、外でサイクリングやバーベキューをするなど、外で楽しむことを企画します。

上記の思考の流れは、まさに条件文の考え方です。普段から物事の条件文を意識して、もし○○ならパターンAの選択肢で、もし☓☓ならパターンBの選択肢で、などと色々な選択肢を予め考えておくということを普段の生活の中でもされていると思います。その考え方をプログラミングにも応用できるように、普段から意識的に物事の条件文を考えるようにしてみましょう。

 

Java言語の条件文

Java言語の条件文には大きく分けてif文とswitch文の2種類あります。それぞれの特徴と使用方法について解説していきます。

if, if/else文

if文

if文とはある条件式をもっていて、その条件を評価した結果に応じた処理を行う場合に使用します。評価した条件の結果は、boolean値(true, false)で判定されます。

if文の構文は次のようになります。

ifの後の()には、条件式を記述します。条件式は、boolean値(true, false)を返す式でなければなりません。条件判定の結果がtrueだった場合、{ } で囲まれた処理文(ifブロック)が実行されます。これは通常のプログラムが単調に順序どおりに実行されたのに比べて大きく異る部分です。

課題:条件文の動きを確認してみよう

Java3のプロジェクトにRenshu3.javaを作成して、条件分岐処理を実装してみましょう。

上記のプログラムは、コンソールから数値入力を促して、その入力された数値が10以上かそ10未満かで処理を分岐させ、System.out.println(); メソッドで文字を出力しています。

コンソールから入力された値が10以上の場合は、if文内のメッセージが表示されます。

if文①

コンソールから入力された値が10より小さい数値の場合は、else文内のメッセージが表示されます。

if文②

作成したJavaファイルを実行して、動作確認を行ってください。

コンソールからの数値入力

上記のプログラムの中にはコンソールから数値の入力を受け付けるコードが記述されています。以下のサイトにて、コンソールからの数値入力の方法を確認しておきましょう。
http://www.javadrive.jp/start/scanner/index2.html

switch文

比較する条件式が少ない場合は、上記で紹介したif文で基本的にはプログラムの制御を行っていきます。しかし、条件の数が多い時には、switch文を使った方が、コードを簡潔にすることができます。しかし、switch文の条件には整数しか使えず、関係式も使用することができません。
switch文の式の結果は、データ型としてbytecahrshortintenumString のいずれかの値である必要があります。一つのcaseには一つの定数のみ指定し、最後に「」(コロン)を記述します。
switch文は式を評価した結果とcaseで指定した定数とを比較し、一致した場合にそのcase以降に記述した処理文を実行します。(処理文は複数記述することができます)
比較して一致しなかった場合は、次のcaseの定数との比較に移ります。どのcaseにも一致しない場合の処理は、default: を指定した後に処理文を記述します。default: はswitch内のどこに記述してもかまいません。default: の記述は任意で、省略することも可能です。

課題:switch文の動きを確認してみよう

Java3のプロジェクトにRenshu4.javaを作成して、switch文の処理を実装してみましょう。

上記のプログラムは、コンソールから数値入力を促して、1~5それぞれの数値が入力された場合は対応する数値のcase文が実行され、それ以外の数値が入力された場合はdefault:文が実行されるようになっています。

作成したJavaファイルを実行して、動作確認を行ってください。数値の3を入力した場合は以下のような実行結果となります。

スクリーンショット 2017-03-18 午後6.18.10

ループ文(繰り返し文、繰り返し制御文)

次に繰り返しの制御文を説明していきます。プログラム(コンピュータ)は同じことを繰り返し処理する事を得意とし、ほぼ全てのシステムにはこの繰り返し処理が使われています。プログラムの要となる部分なので、課題をこなしながらプログラムの動きをその都度確認して、それぞれの制御文の相違点をしっかりと理解していきましょう。幾つかのループ文を柔軟に使いこなす事が出来ると、プログラミングの幅はかなり広がってきます。

while文

while文は指定された条件が成立する間、繰り返し処理を行う文です。条件が成立しなくなったところで繰り返し処理を終了します。このため、回数が決まっていない繰り返し処理を行う場合に使います。while文は以下のような記述をします。

課題:while文の動きを確認してみよう

Java3のプロジェクトにRenshu5.javaを作成して、処理を実装してみましょう。

作成したJavaファイルを実行して、動作確認を行ってください。

スクリーンショット 2017-03-18 午後6.27.20

do-while文

do-while文はwhile文と同様に、指定された条件が成立する間(条件式がtrue)、繰り返し処理を行います。while文との違いは、while文は最初に条件式があり、先に条件判定を行ってから繰り返し処理に入るのに対し、do-while文は、まず一度繰り返し処理を行って、それから条件判定が行われるという点です。
do-while文は以下のような記述をします。

課題:do-while文の動きを確認してみよう

Java3のプロジェクトにRenshu6.javaを作成して、処理を実装してみましょう。

作成したJavaファイルを実行して、動作確認を行ってください。whileの条件は成立しない式となっていますが、doブロックが一回は実行されることが確認できます。

スクリーンショット 2017-03-18 午後6.36.49

for文および拡張for文

for文

指定した回数だけ特定の処理を繰り返す場合は、for文を使います。これまでのwhile文やdo-while文では()内に条件式のみを記述していましたが、for文では、()内に繰り返した回数を数えるための変数やその更新処理なども記述します
for構文は以下のようになります。

式1では、カウンタ変数の宣言とその初期化を行います。カウンタ変数は、処理を繰り返した回数を数えるための変数です。式2には、条件式を記述します。この条件式がtrueを返している間、forブロック内の処理が実行されます。そのため、条件式は他の繰り返し処理と同様に、boolean値を返す式にする必要があります。式3には、カウンタ変数の値を更新する式を記述します。

課題:for文の動きを確認してみよう

Java3のプロジェクトにRenshu7.javaを作成して、繰り返し処理を実装してみましょう。

作成したJavaファイルを実行して、動作確認を行ってください。

スクリーンショット 2017-03-18 午後9.39.23

拡張for文

Java言語では、for文の拡張版として拡張for文が用意されています。拡張for文では配列を操作する際に、カウンター変数を省略することができます。for文の式の中で配列の要素を代入する変数を新たに宣言して繰り返し処理を実現します。そのため、for文に比べて記述が簡素化されています。

拡張for文の構文は以下のようになります。

拡張for文参照変数名で指定した配列などがもつ要素の数だけ、処理が繰り返されます。そのためfor文のように式の中でカウンタ変数を宣言したりカウンタ変数をインクリメントする必要がありません。()内で指定した参照変数から順に要素を取り出し、変数宣言で宣言した変数へ代入します。このため、変数宣言で宣言する変数のデータ型を、取り出される要素のデータ型に合わせる必要があります。

課題:拡張for文の動きを確認してみよう

Java3のプロジェクトにRenshu8.javaを作成して、拡張for文を実装してみましょう。

作成したJavaファイルを実行して、動作確認を行ってください。
スクリーンショット 2017-03-18 午後9.55.53

【Java】for文と拡張for文の違い
http://qiita.com/Mocacamo/items/290457f9d378ad80ddba

繰り返し制御文(break文とcontainue文)

これまで紹介してきた繰り返し文は、条件式の判定結果がtrueである間、処理が繰り返されていました。しかし、プログラムの流れによっては、「基本的には条件判定がtrueの間は繰り返し処理を行いたいが、ある特定の条件が発生した場合には、例外的に繰り返しから抜けるようにしたい」という場合もあります。そのような制御を行うには、繰り返し制御文を使用します。繰り返し制御文には、break文continue文の2種類あります。break文とcontinue文を使うことで、ループ処理を自在に操ることができるようになります。

break文

break文は、現在実行中の繰り返し処理を中断して抜け出す時に使用します。繰り返し文の無限ループから抜け出す場合にも使用されます。ループから抜けた後は、その繰り返し処理の次の実行文に制御が移ります。break文は通常、if文の中に記述します。これによって、if文を含むループ処理から強制的に外側へ抜け出させることができます。

上記のように記述すると、条件式が成立した場合にforやwhileによるループ処理を終了します。break文をif文の中に記述するのは、特定の条件が成立した場合にだけループ処理を終了させるためです。if文を用いずに直接、ループ処理を行うブロック内に記述してしまうと、ループ処理を行う前にbreakの箇所で処理が終了してしまいます。

課題:break文の動きを確認してみよう

Java3のプロジェクトにRenshu9.javaを作成して、break文の処理を実装してみましょう。

このプログラムは、5回以内に”ITブートキャンプ”と入力をすると、ループ処理が終わる前に処理が終了します。このように、ある特定の条件下の時に繰り返し処理を制御して、そのbreakが属するブロックを抜けることが可能となります。このような制御が出来ると、繰り返し処理の扱いの幅がかなり増えてきます。

作成したJavaファイルを実行して、動作確認を行ってください。
ループ回数が終わる前に条件を満たすと、処理が終了されます。

スクリーンショット 2017-03-19 午後5.12.23

条件が満たされなければ、ループ処理の回数分、通常通り処理が実行されます。

スクリーンショット 2017-03-19 午後5.13.52

continue文

continue文は、現在実行中の繰り返し処理を中断するのではなく、ブロック内の残りの処理をスキップして条件式に制御を移し、さらに繰り返し処理を続けたいときに使用します。continue文は、while文やfor文などの繰り返し文内で使用することができます。continue文は通常、if文の中に記述します。これによって、continueが記述された位置以降の処理をスキップして再びループ処理の先頭に移ります。

continue文は以下のように記述します。

breakは指定した条件が成立した時点でループ処理を打ち切るのに対し、continueは指定した条件が成立した時点で次のループ処理に移ります。

課題:continue文の動きを確認してみよう

Java3のプロジェクトにRenshu10.javaを作成して、break文continue文を実装してみましょう。それぞれの違いが理解できてくると思います。

作成したJavaファイルを実行して、動作確認を行ってください。

スクリーンショット 2017-03-21 午前10.08.24

制御文のネスト

Java言語では、制御文の中に制御文を記述することができます。これをネスト(入れ子)と呼びます。たとえば、while文の中にfor文を記述したり、if文の中にwhile文を記述したりできます。
ネストの深さに制限はありませんが、入れ子にしすぎると処理の流れが複雑になり、コードの可読性が低下するので、あまり好ましくはありません。

たとえば、以下のようにfor文の中にfor文を記述したコードを書くことが出来ます。

以下の参考サイトも確認しておきましょう。

【Java】繰り返し制御文であるbreakとcontinueの違いとラベルの使い方
http://www.task-notes.com/entry/20140825/1408943053

ラベル

繰り返し文がネストしている場合、内側の繰り返し文の中に記述したbreak文やcontinue文は、その内側の繰り返し文からしか抜けたりスキップしたりできません。外側の繰り返し文からも抜けたりスキップしたりするには、ラベルを使用します。ラベルは、break文やcontinue文で対象となる繰り返し文につける名前です。
ラベルは、繰り返し文の先頭につけます。ラベルを指定されたbreak文やcontinue文は、そのラベルがついた繰り返し文まで抜けたりスキップしたりします。ラベル名は、識別子の規則に添って任意に指定できます。また、ラベルの最後には「:(コロン)」をつけます。

まずは、ラベルなしのサンプルコードを見てみましょう。Java3のプロジェクトにRenshu11.javaを作成して、ラベルなしのサンプルコードを実装していきましょう。
作成したJavaファイルを実行して、実行結果を確認してください。

このプログラムの実行結果は以下のようになったかと思います。プログラムで使用されているbreak文はi=2の時に動作します。なので、演算結果は、1*1~5の結果と3*1~5の結果のみ表示されます。

Break文

次に、ラベル付きのbreak文を記述したコードの動作を確認していきましょう。Java3のプロジェクトにRenshu12.javaを作成して、ラベル付きのサンプルコードを実装していきましょう。

先程のプログラム同様に、i=2の時にbreak文が実行されますが、ネストされている外側のfor文にラベルを付与しているため、break文が実行されると外側のfor文まで一気に抜けることになります。このプログラムの演算結果としては、1*1~5の結果のみ表示されることになります。

Break文2

ラベルがある場合とない場合で、繰り返し処理の結果は全く変わってきます。繰り返し制御文をさらに柔軟に使う手法なので、是非覚えておきましょう。

課題で紹介したコードは以下のリンクからダウンロードできます

Java3課題プログラムダウンロード
http://i-b-c.jp/java/wp-content/uploads/2017/03/Java3.zip

演習問題

問題1

int 型の変数 x、y にそれぞれ数値を入力し、x が y より大きい場合にはxはyより大きい、x が y より小さい場合にはxはyより小さい、x と y が等しい場合にはxとyは等しいと表示するプログラムを作成して下さい。

以下のクラスを作成して問題を解いてください。

問題2

正の整数値を入力し、それが偶数か奇数かを判定するプログラムを作成して下さい。入力された数値が偶数の場合には偶数です。、奇数の場合には奇数です。”と表示するプログラムを作成して下さい。
※ 奇数、偶数の判定には剰余を利用します。

以下のクラスを作成して問題を解いてください。

問題3

繰り返しと条件分岐を使ってFizzBuzz問題を解くプログラムを作成してください。
FizzBuzz問題とは、FizzBuzzという英語圏の遊びを使った問題のことです。FizzBuzzのルールは次のとおりです。

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 を数の代わりに発言しなければならない。

このルールになぞらえて、次のようなプログラムを考えます。

  • 1から100までの数字を順に出力する。
  • ただし、3で割り切れる場合は数字の代わりに「Fizz」と出力する。
  • 5で割り切れる場合は数字の代わりに「Buzz」と出力する。
  • 両者で割り切れる場合は数字の代わりに「FizzBuzz」と出力する。

実行結果は、次のようになります。

スクリーンショット 2017-03-21 午前11.14.06

以下のクラスを作成して問題を解いてください。

 

問題4

月を表す数値を入力し、その月の日数を表示するプログラムを作成して下さい2 月は 28 日としますまた、1 ~ 12 以外の数値が入力された場合に、入力が間違っていますと表示して下さい
※分岐処理にはswitch文を使用して下さい。

以下のクラスを作成して問題を解いてください。

 

数値入力の実装方法について

数値入力を行う処理にはscannerクラスのメソッドを使用しています。下記の参考サイトとAPIの解説を確認しておくようにしましょう。
http://www.javadrive.jp/start/scanner/index2.html
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html

解答:a-3