第5講・STEP 01

if文って何?

今回はif文というのを使って、時刻によって「おはよう」とか「こんにちは」とか挨拶が変わるプログラム(class)を作ります。時刻と言っても、どこかから現在時刻のデータを取ってくるような本格的なものではないですが、とりあえずやってみましょう。

挨拶をするclass

まずはお決まりのclassの宣言とmainメソッドを書きます。挨拶するプログラムなのでclass名は「Greeting」にしました。現在時刻を示す変数timeを宣言します。

Greeting.java

public class Greeting {
    public static void main(String[] args) {
        int time;
    }
}

この変数timeに現在時刻を保持させます。int型なのでtimeには整数しか入りません。なので「何分」とかは気にしないように。変数timeが保持するのは「何時」だけです。

そしてこの時計は勝手に動いたりしないので時刻を変えたい時は直接、プログラムをいじらないといけません。手巻きならぬ手打ち時計です。そんなの時計じゃねぇという突っ込みは甘んじて受け止めますので、とりあえず変数timeが現在時刻を示していることをまずは飲み込んで下さい。w

とりあえず朝の8時に時計を合わせます。そして朝なので「おはようございます」と出力させましょう。

Greeting.java

public class Greeting {
    public static void main(String[] args) {
        int time = 8;
        System.out.println("おはようございます");
    }
}

これで、このclassを実行すると「おはようございます」と出力されるようになりました。

お気づきの方が多いと思いますが、この状態では変数timeの存在意義なしです。timeの存在感を出す為に挨拶の前に「只今の時刻は8時です」と出力するようにしてみましょう。

Greeting.java

public class Greeting {
    public static void main(String[] args) {
        int time = 8;
        System.out.println("只今の時刻は" + time + "時です");
        System.out.println("おはようございます");
    }
}

"只今の時刻は" + time + "時です"この足し算はなんとなく分かりますか?「+」は前回やった演算子ですが、文字列をつなげる働きもあります。
「数値+数値」は普通の足し算になるのですが、「文字列+文字列」の足し算は足したものが後ろにつながります。"ごみ" + "箱"は"ごみ箱"になるし、"3" + "2"は"32"になります("5"にはなりませんよ!これが数値と文字列の違いです。)。

この場合timeはint型なので文字列ではなく数値なので「文字列 + 数値 + 文字列」という変な計算式なんですが、この場合は数値は文字列として扱われて後ろに足されます。この辺はちゃんとした法則性があるので気になる方はこちらをどうぞ。→文字列と数値の足し算

これで実行してみましょう。

実行結果
只今の時刻は8時です
おはようございます

ちゃんと「只今の時刻は8時です」と出力されました。できたらintの値を自由に書き換えて実行しなおしてみて下さい。例えば「time = 20;」(20時)として実行してみます。

実行結果
只今の時刻は20時です
おはようございます

見ての通り現在時刻はちゃんと出力されていますが、残念ながら夜になっても挨拶は「おはようございます」のままですね。ここが時刻によって変わるようにif文を使ってやっていきます。

if文

挨拶は
4時~10時が「おはようございます」
11時~17時が「こんにちは」
18時が「こんばんは」
19時~3時が「おやすみなさい」
に変わるようにします。

ちょっと就寝時刻が早い気もしますが、諸事情により「こんばんは」は18時限定、19時には「おやすみなさい」ということにします。

まずは、4時になったら「おはようございます」と出力されるようにします。「4時になる」というのは、言い換えると「timeが4以上」ということですね。比較演算子を使って表現すると、「time >= 4」と書けます。

(mainメソッドの中のみ表記)

Greeting.java

int time = 8;
if (time >= 4) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("おはようございます");
}

ifの後ろの( )の中にある式「time>=4」のことを条件式と言います。条件式は、評価することでtrueかfalseに置き換わる式を入れないといけません。

この条件式「time >= 4」はtimeが4以上ならば「true」に置き換わります。逆にtimeが4未満ならば「false」に置き換わります。この場合はtimeは8なので、「true」になりますね。

if文というのはまず条件式が評価されて「true」ならばその後の{ }ブロックの中身を実行し、「false」ならば{ }ブロックの中身は実行されずにすっ飛ばされます。

これで、朝4時になると「おはようございます」と挨拶するようになりました。が、これでは4時以降ずっと「おはようございます」のままです。朝の挨拶は10時までにしたいので、条件式を「time >= 4」かつ「time <= 10」にします。「かつ」は論理演算子「&&」を使います。

(mainメソッドの中のみ表記)

Greeting.java

int time = 8;
if ((time >= 4) && (time <= 10)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("おはようございます");
}

条件式は、こんな風に少しややこしくなりました。

Greeting.java

((time >= 4) && (time <= 10))

この条件式は「timeが4以上10以下」ならばtrueと評価されます。この条件式が評価される過程がよく分からない人は、前回の「演算子って何?」の論理演算子の項を読んで下さい。これで4時から10時は、「おはようございます」と挨拶するようになりました。ちなみに、それ以外の時刻では何も出力されません。ぜひ試してみてください。

if-else-if構文

朝の挨拶はこれで完璧です。次は11時~17時になったらお昼の挨拶をするようにします。その為に、if-else-if構文を使って条件分岐を追加していきます。まずはif-else-if構文の形を見てください。さっきのブロックの最後「 } 」の後ろにさらに、

else if ( 条件式 ){ ブロック }

を追加します。

Greeting.java

if ((time >= 4) && (time <= 10)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("おはようございます");
} else if (条件式) {
    ブロック
}

まだ中身は入れていないですが、こんな形ですね。
以下のif-else-if構文の形と処理される仕組みは覚えてしまいましょう。

if (条件式1) {
    ブロック1
} else if (条件式2) {
    ブロック2
}
if-else-if構文の処理の流れ
評価する条件trueならfalseなら
条件式1ブロック1を実行して、このif文全体を抜けるブロック1を飛ばして、条件式2を評価する
条件式2ブロック2を実行して、このif文全体を抜けるブロック2を飛ばして、このif文全体を抜ける

条件式がtrueになってそのブロック内を実行した後は(次の条件式を評価せずに)if文を抜けてしまいます。なので条件式がいくつあろうとも選択されるのは多くても一つだけです。複数のブロックが実行されることは絶対にありません。
もしどの条件式もfalseだった場合、何もせずにif文を抜けてしまいます。
else ifはいくつでもつなげて書くことが出来ます。

では、実際に11時から17時に「こんにちは」と挨拶するように条件式とブロックの中を埋めます。

(mainメソッドの中のみ表記)

Greeting.java

int time = 8;
if ((time >= 4) && (time <= 10)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("おはようございます");
} else if ((time >= 11) && (time <= 17)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("こんにちは");
}

中身のプログラムは数字と挨拶を変えるだけですね。

次は「こんばんは」です。18時だけが「こんばんは」になるようにします。同じように後ろに「else if( ){ }」をつけ足します。

(mainメソッドの中のみ表記)

Greeting.java

int time = 8;
if ((time >= 4) && (time <= 10)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("おはようございます");
} else if ((time >= 11) && (time <= 17)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("こんにちは");
} else if (time == 18) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("こんばんは");
}

ここで注意が必要なのは、「time==18」の形です。「イコール」を意味する演算子は「=」ではなく「==」です。これは慣れないうちはよく間違うので注意して下さい。

では同じ要領でさらにもう一つ「else if」をつなげて19時から3時は「おやすみなさい」になるようにします。

(mainメソッドの中のみ表記)

Greeting.java

int time = 8;
if ((time >= 4) && (time <= 10)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("おはようございます");
} else if ((time >= 11) && (time <= 17)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("こんにちは");
} else if (time == 18) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("こんばんは");
} else if ((time >= 19) && (time <= 3)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("おやすみなさい");
}

このように「else if」をつなげていくことで、どんどん細かい条件分岐を作ることができます。

が、さらにif文の中にif文を入れ子にしたり他の条件分岐や繰り返し文なんかも入ってきたら、プログラム文が波かっこ「 { } 」だらけになって、非常に見にくくなりますので、こういう条件分岐の部分は特にインデント(字下げ)を揃えて、どこでどう枝分かれしているのか分かりやすいようにしておいて下さい。

・・ってちょっと待ったー!

あなたは誤りに気づきましたでしょうか??

19時から3時の分岐のところの条件式を見てください。

Greeting.java

(time >= 19) && (time <= 3)

timeが19以上かつ3以下になってます。そんな数字が存在するでしょうか?あり得ないですよね。

このまま実行すればこの条件式(time>=19 && time <=3)がtrueになることはないので20時であろうと2時であろうと「おやすみなさい」とは出力されません。人間が勝手に24時になったら0時に戻るなんて思っていてもコンピュータが認識しているのはただの数値です。その辺ももちろん人間が気を利かしてコンピュータにも処理できる状態でプログラムを書かなければなりません。当たり前です。 条件式をこう書き変えましょう。

Greeting.java

(time >= 19) || (time <= 3)

(timeが19以上)または(timeが3以下)という状態です。これなら20時や2時になるとこの条件式がtrueになりますね。
「または」という意味の「||」が出てきました。感覚的に「または」で分かると思いますが、ピンと来ない人は、前回の「演算子って何?」の論理演算子の項を読んで下さい。
さあ、これでやっとtimeに現在時刻を入れて実行すれば、その時刻に相応しい挨拶をしてくれるプログラムになりました。実行してみましょう。

【time = 2;】

実行結果
只今の時刻は2時です
おやすみなさい

【time = 8;】

実行結果
只今の時刻は8時です
おはようございます

【time = 12;】

実行結果
只今の時刻は12時です
こんにちは

【time = 18;】

実行結果
只今の時刻は18時です
こんばんは

【time = 20;】

実行結果
只今の時刻は20時です
おやすみなさい

if-else構文

これで完成と言いたいところなのですが、このままではこんな意地悪される可能性があります。

【time = -5;】

実行結果
只今の時刻は-5時です
おやすみなさい

【time = 500;】

実行結果
只今の時刻は500時です
おやすみなさい

バグってますよね。timeに-5や500を入れて実行するとこんなことになります。

手打ち時計にそんな数字を入れるな!と言えばそれまでですが、もしtimeの値をユーザーに入力してもらうようなプログラムを書こうと思えば、どんな値が入力されてもそれなりに対応しないといけません。その辺もしっかり作っておきましょう。もう一歩ですので完成に向けて頑張って下さい。

上記のバグっぽい実行結果では、-5時や500時で「おやすみなさい」となってます。なぜそうなるかと言うと、「おやすみなさい」の条件式、

Greeting.java

(time >= 19) || (time <= 3)

これが-5や500でもtrueになってしまうんですね。「19以上または3以下」ですから。19以上には500でも10000でも含まれるし、3以下には負の数も含まれてしまうわけです。

なので、まずはここを上は23まで下は0までにしてしまいましょう。

Greeting.java

(time >= 19 && time <= 23) || (time >= 0 && time <= 3)

これでtimeに-5や500を入力しても「おやすみなさい」とは出力されなくなりました。けど、何も出力されません。何もなしでは愛想ないので、もし変な数値を入れられたら「timeには0~23の値を入力してください」って感じで警告文を出してやりましょう(自分で入力してるのに笑)。

その為に使うのが「else」です。さっきの「else if」は続いて条件式を入れてさらに分岐させていましたが、「else」は「その他」です。なので条件式は要りません。さっきと同じように最後のブロックの終わりの「 } 」に続いて

else { ブロック }

をつけ足します。その他なので「if」も条件式も要りません。「else」の後に、その他の場合に実行されるブロックを足すだけです。では、実際に書き足します。

(mainメソッドの中のみ表記)

Greeting.java

int time = 8;
if ((time >= 4) && (time <= 10)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("おはようございます");
} else if ((time >= 11) && (time <= 17)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("こんにちは");
} else if (time == 18) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("こんばんは");
} else if ((time >= 19 && time <= 23) || (time >= 0 && time <= 3)) {
    System.out.println("只今の時刻は" + time + "時です");
    System.out.println("おやすみなさい");
} else {
    System.out.println("timeには0~23の値を入力してください");
}

これで変な数値を入れても、バグったようなメッセージが出ることはなくなりました。

このように、ifで条件を分けて、その条件に当てはまらない時に実行したいことがある時は「else」を使って実行させるようにしましょう。最後に「else」のブロックを入れることで、そのif文は絶対にどこかのブロック一つを実行する状態になりますね。

一応、timeに500を入れて実行してみます。

【time = 500;】

実行結果
timeには0~23の値を入力してください

お疲れ様でした。これで時刻によって挨拶が変わるプログラムの完成です。説明が下手なのでえらい長くなってしまいました。申し訳ないです。
if文の使い方をなんとなく掴んだら、ぜひ、自分で考えていろいろ書いてみてください。

次回は文字列を保持するStringを使って、今回作ったGreetingクラスをもうちょっとスマートに改造します。

今回作ったGreetingクラスの全コードを一応書いておきます。ちなみにtimeには8を入れてあります。

Greeting.java

public class Greeting {
    public static void main(String[] args) {
        int time = 8;
        if ((time >= 4) && (time <= 10)) {
            System.out.println("只今の時刻は" + time + "時です");
            System.out.println("おはようございます");
        } else if ((time >= 11) && (time <= 17)) {
            System.out.println("只今の時刻は" + time + "時です");
            System.out.println("こんにちは");
        } else if (time == 18) {
            System.out.println("只今の時刻は" + time + "時です");
            System.out.println("こんばんは");
        } else if ((time >= 19 && time <= 23) || (time <= 3 && time >= 0)) {
            System.out.println("只今の時刻は" + time + "時です");
            System.out.println("おやすみなさい");
        } else {
            System.out.println("timeには0~23の値を入力してください");
        }
    }
}

目次へ

質問・コメント

読み込み中

この記事についての質問や、学習して気づいたことをお寄せください。

コメントを書く

投稿フォームを準備しています。

コメントと一緒に公開される名前です。
3,000文字以内。パスワードなどの個人情報は書き込まないでください。

コメントは送信後すぐに公開されます。

この記事のコメント

旧サイトに寄せられたコメントも当時の投稿内容のまま掲載しています。現在の記事では変更している内容や、旧環境についてのやり取りも含まれます。

コメントを読み込んでいます。