【Javaプログラミング超入門 #11】条件分岐(2)

 

みのる
こんにちは。笑顔で感謝!✨ みのるコーチです。
今回も、ご覧いただき、ありがとうございます。

今回は

Java超入門 #11
条件分岐(2)

というテーマでお送りします。

彩香
今回も頑張ります。よろしくお願いします。
剛留
前回の条件分岐(1)で
プログラムの幅が広がった気がしました。

今回も、ガッツリ勉強していきますよ~。
よろしくお願いします。

みのる
それでは 早速 いってみましょう。Let’s Go!

【Youtube版】

Youtubeでもお伝えしていますので
是非チェックしてくださいね。

【1】3種類の if 構文

前回のお話で、条件分岐を考える時に
基本になる形を勉強しましたね。

まず、条件式があって true かfalseかを判定します。

trueであれば、trueの時ののブロックを実行します。
if (条件式) の後のブロックです。

そして falseであれば、falseの時のブロックを実行します。
キーワード else の後のブロックです。

基本的に、このイメージを持ちましょうというお話をしましたね。

これが、基本になります。

if – else の構文です。

そして、今回は まず
if のバリエーションを 見ていきましょう。

1つが if のみの構文。

もう1つが if – else if – else の構文です。

また、後半では 文字列の比較についても
見ていきますので、こちらも 要チェックですよ。

【2】if のみ

① フローチャート

まずは、ifのみの フローチャートからです。

前の処理からは、順次で進んできます。

そして、ひし形の中には条件式を書きます。

条件式の結果は true と false の
どちらかになりますので、分岐します。

下側が true 右側が false です。

if のみの構文は、trueの時の処理は 行いますが
falseの時の処理は 行いません。

そして、その後に、分岐した2本の線は
元の1本に合流します。ここ、ポイントですね。

1本に合流する事で
次の処理を 順次で進めていく事ができます。

1本の線で入ってきて、1本の線で抜けていく
という書き方、if – else のと時と考え方は同じですね。

②Javaの書き方

Javaでの書き方を 見ていきましょう。

if のみの構文は、if () の中に条件式を書いて
ブロックを書きます。

そして、このブロックの中には
条件式が true の時の処理を記述します。

フローチャートとの対応を見てみましょう。
左側がフローチャートで、右側が Java の if のみ構文です。

条件式を書いた条件分岐の記号が
if (条件式) に相当。

そして、trueの時の処理は if(条件)の後の
ブロックに相当します。

条件式が true の時だけ処理したい、という場合に
この構文を使うことになります。

フローチャートのイメージを 持っておきましょうね。

【3】if – else if – else

①フローチャート

こちらも、まずフローチャートからです。

条件がいくつか出てきますが、順に見ていきましょう。

前の処理からは、順次で進んできます。

最初のひし形の中には1番目の条件式を書きます。

この条件式1 がtrueの場合には、
下に行って、条件式1がtrueの処理を行います。

そして、条件式1 が false の場合に
右側に進んで、条件式2 を判断する事になります。

この 条件式2 がtrueの場合には
下に行って、条件式2 が true の処理を行います。

そして、条件式2 が false の場合に
右側に進んで、条件式3 を判断する事になります。

この 条件式3 が true の場合には、
下に行って、条件式3 が true の処理を行います。

そして、条件式3 が false の場合には
false の処理を行います。

最後に、分岐した全ての線は
元の1本に合流します。ここ、ポイントですね。

1本の線で入ってきて、1本の線で抜けていく
という書き方、全ての if構文で共通です。

ここで大切なことは
順に条件式を見て true/false を判断していく。という事と…

どれか1つが実行されることです。

このイメージを押さえておきましょうね。

彩香
順に条件式を見て、true / false を判断していく事と
どれか1つのブロックが実行されること。

…しっかりインプットしました。

②Javaの書き方

Javaでの書き方を 見ていきましょう。

if – else if – else の構文は
if () の中に 条件式1 を書いて、ブロックを書きます。

そして、このブロックの中には
条件式1が true の時の処理を記述します。

そして、このブロックの後に、else if 丸括弧
この丸括弧の中に 条件式2 を書きます。

Java の場合には、この else と if の
間に スペースを入れます。

そして、その後にブロックを書きますが
ここには、条件式2 が true の時の処理を記述します。

更に、このブロックの後に、else if 丸括弧
この丸括弧の中に 条件式3 を書きます。

次に、条件式3が true の時の処理のブロックが続きます。

最後に else を書いて最終ブロックです。
これは、どの条件も false だった時の処理のブロックです。

フローチャートとの対応を見てみましょう。

左側がフローチャートで
右側が Java の if – else if – else 構文です。

条件式1~3が 各条件式 に相当します。

そして、各条件が true の時の処理が
条件を指定した後のブロックに相当します。

どの条件にも 合致しない処理は
最後の else のブロックに相当しますね。

また、ここでは、条件1~条件3を示してありますが
条件2まででもOKですし…

条件4・条件5…と 続けて書いても大丈夫です。

そして、最後の false の処理がない場合には
else と その後のブロックは 省略することもできます。

このイメージを 持っておきましょうね。

剛留
if のみの構文をやってみたんですが
うまく行かないんです。
String subject;

System.out.print(“得意な教科は? > “);
subject = new java.util.Scanner(System.in).nextLine();

if (subject == “英語”) {
    System.out.println(“僕と同じですね。”);
}

剛留
最初に 文字列 subject を宣言しています。

得意な教科は?。と表示してから。

1行入力を受付けます。

そして、入力された文字列が。英語だったら…。

僕と同じですね。と表示しようと思って…。

でも、英語と入力しても。
僕と同じですね、が表示されないんです。

彩香
剛留くん、英語が得意だっけ?
見栄を張っているから、表示されないんじゃないの?
剛留
どきっ、えっ?。
Javaは、そこまで、感知してるの?
剛留
ダメだー。「体育」にしたけど ダメだった…。
みのる
剛留くん、色々と試してみるのは良いですね。
Good、Good です。

そして、プログラムを見てみましょう。

この中で、思い通りに行っていないのは
この部分の、文字列の比較なんです。

この部分は、次のコーナーで 見ていきましょう。

String subject;

System.out.print(“得意な教科は? > “);
subject = new java.util.Scanner(System.in).nextLine();

if (subject == “英語”) {
    System.out.println(“僕と同じですね。”);
}

【4】文字列の比較

先ほどの、剛留くんのプログラムの中で
入力された文字列が “英語” だったら… の比較で

if (subject == “英語”) {

…を使用していましたね。

ここで、subject は String型変数で
データ型の大分類では、参照型でしたね…。

第6回データ型でお話した、データの大分類
基本データ型と参照型を覚えていますか?

基本データ型と参照型については、この記事でお伝えしています。
こちらも、参考にしてくださいね。

【Javaプログラミング超入門 #06】データ型

ここでも、簡単に復習しましょう。

データ型は大きく分けて
基本データ型と参照型に分けられます。

そして、その両者の大きな違いは
変数の値の持ち方にあります。

変数は、値を格納する箱ですが、基本データ型では
20、true などのデータそのものを値として格納します。

一方の参照型の変数の場合、実際のデータは 別の領域に確保され
どこに存在するかの 番地の情報を 値として持つこととなります。

この番地の情報を「参照値」といい、参照値を持つので
参照型というのでした。

そして、今回の文字列の比較の話です。

String型などの参照型の場合、関係演算子 == は
参照値(メモリー上の番地)を比較する事になります。

例として、入力した文字列をString型変数 subjectに代入すると
文字列自体は、コンピュータ内のある部分に確保されます。

例えば、その先頭が100番地だったとします。

String型の変数 subject は、参照値 100番地 を値として
持つことになります。

一方の比較対象の “英語” は文字列リテラルですね。

これは、プログラムで別の領域に準備されています。
例えば、その先頭が 50番地 だったとします。

この場合、== で比較すると、この100番地と50番地を
比較することになるのです。

もちろん、結果は false になりますね。

剛留
なるほど、わかりました。それで、文字列の比較をしたい場合には
どうしたら、いいんでしょ~?
みのる
そうですね。文字列の比較をしたい場合ですね。

それは、このように書きます。

String型変数.equals(比較対象)

この比較対象は、リテラルや変数・定数が指定できます。

今回の例で書くと

subject.equals(“英語”)

そして、この全体の結果が true または false となります。

この書き方は、良く使われるので覚えておきましょうね。

ということで、今回のプログラムは
このように修正すると、思い通りに動くことになります。

String subject;

System.out.print(“得意な教科は? > “);
subject = new java.util.Scanner(System.in).nextLine();

if (subject.equals(“英語”)) { // 修正
    System.out.println(“僕と同じですね。”);
}

剛留
できました! 思い通りに動きました! やった~!
彩香
何だか、段々と本格的になってきた気がします。

とっても充実感があります!
更に、頑張っていきます。

剛留
文字列の比較のところは、もう完璧です。
また、一歩 前進しましたよ~!

【まとめ】

【Java超入門 #11】条件分岐(2)

【1】3種類の if構文
・ if – else
・ if のみ
・ if – else if – else
【2】if のみ構文
・ 1つの if(条件式) とブロック
  のみの構文です。

・ 条件式が true の時にだけ
  何かを実行したい場合に使用。

【3】if - else if - else
・ if – else 構文で
  else の時に 次の条件を指定して
  分岐を行っていく構文。

・ 条件を順に評価していく。
  (順番が大切)

・ どれか1つのブロックが実行される。

・ 最後の else {} は省略可能。

【4】文字列の比較
・ String型変数.equals(比較対象)
  を使用する。

・ 比較対象は、リテラルや
  変数・定数が指定できる。

・ 全体が true / false に置き換わる。