2019/02/06
sponsored link
挨拶をするclass
今回はif文というのを使ってみます。時刻によって「おはよう」とか「こんにちは」とか挨拶が変わるプログラム(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時です」と出力されました。できたらintの値を自由に書き換えて実行しなおしてみて下さい。例えば「time = 20;」(20時)として実行してみます。
見ての通り現在時刻はちゃんと出力されていますが、残念ながら夜になっても挨拶は「おはようございます」のままですね。ここが時刻によって変わるようにif文を使ってやっていきます。
if文
挨拶は
4時~10時が「おはようございます」
11時~17時が「こんにちは」
18時が「こんばんは」
19時~3時が「おやすみなさい」
に変わるようにします。
ちょっと就寝時刻が早い気もしますが、諸事情により「こんばんは」は18時限定、19時には「おやすみなさい」ということにします。
まずは、4時を回ったら「おはようございます」と出力されるようにします。「4時を回る」というのは、言い換えると「timeが4以上」ということですね。比較演算子を使って表現すると、「time >= 4」と書けます。
(mainメソッドの中のみ表記)
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メソッドの中のみ表記)
int time = 8; if((time >= 4) && (time <= 10)){ System.out.println("只今の時刻は" + time + "時です"); System.out.println("おはようございます"); }
条件式は、こんな風に少しややこしくなりました。
((time >= 4) && (time <= 10))
この条件式は「timeが4以上10以下」ならばtrueと評価されます。この条件式が評価される過程がよく分からない人は、前回の「演算子って何?」の論理演算子の項を読んで下さい。これで4時から10時は、「おはようございます」と挨拶するようになりました。ちなみに、それ以外の時刻では何も出力されません。ぜひ試してみてください。
check point
- if文の基本形・・ if ( 条件式 ){ ブロック }
- 条件式にはtrueかfalseに置き換わる式を入れる
- まず条件式が評価される
- 条件式がtrueならばブロック内を実行する
- 条件式がfalseならばブロック内をすっ飛ばす
if-else-if構文
朝の挨拶はこれで完璧です。次は11時~17時になったらお昼の挨拶をするようにします。その為に、if-else-if構文を使って条件分岐を追加していきます。まずはif-else-if構文の形を見てください。さっきのブロックの最後「 } 」の後ろにさらに、
else if ( 条件式 ){ ブロック }
を追加します。
if((time >= 4) && (time <= 10)){ System.out.println("只今の時刻は" + time + "時です"); System.out.println("おはようございます"); }else if(条件式){ ブロック }
まだ中身は入れていないですが、こんな形ですね。
以下のif-else-if構文の形と処理される仕組みは覚えてしまいましょう。
if(条件式1){ ブロック1 }else if(条件式2){ ブロック2 }
↓
もし条件式1がtrueなら、ブロック1内が実行されてif文を抜ける
もし条件式1がfalseなら、ブロック1内をすっ飛ばして、条件式2を評価する
↓
もし条件式2がtrueなら、ブロック2が実行されてif文を抜ける
もし条件式2がfalseなら、ブロック2内をすっ飛ばす
条件式がtrueになってそのブロック内を実行した後は(次の条件式を評価せずに)if文を抜けてしまいます。なので条件式がいくつあろうとも選択されるのは一つだけです。複数のブロックが実行されることは絶対にありません。
もしどの条件式もfalseだった場合、何もせずにif文を抜けてしまいます。
else-if-else構文はいくつでもつなげて書くことが出来ます。
では、実際に11時から17時に「こんにちは」と挨拶するように条件式とブロックの中を埋めます。
(mainメソッドの中のみ表記)
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メソッドの中のみ表記)
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メソッドの中のみ表記)
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時の分岐のところの条件式を見てください。
(time >= 19) && (time <= 3)
timeが19以上かつ3以下になってます。そんな数字が存在するでしょうか?あり得ないですよね。
このまま実行すればこの条件式(time>=19 && time <=3)がtrueになることはないので20時であろうと2時であろうと「おやすみなさい」とは出力されません。人間が勝手に24時になったら0時に戻るなんて思っていてもコンピュータが認識しているのはただの数値です。その辺ももちろん人間が気を利かしてコンピュータにも処理できる状態でプログラムを書かなければなりません。当たり前です。 条件式をこう書き変えましょう。
(time >= 19) || (time <= 3)
(timeが19以上)または(timeが3以下)という状態です。これなら20時や2時になるとこの条件式がtrueになりますね。
「または」という意味の「||」が出てきました。感覚的に「または」で分かると思いますが、ピンと来ない人は、前回の「演算子って何?」の論理演算子の項を読んで下さい。
さあ、これでやっとtimeに現在時刻を入れて実行すれば、その時刻に相応しい挨拶をしてくれるプログラムになりました。実行してみましょう。
check point
- if-else-if構文の基本形
if (条件式1){ ブロック1 } else if (条件式2){ブロック2} - 条件式1がtrueならばブロック1内を実行してif文を抜ける
- 条件式1がfalseならばブロック1内をすっ飛ばして条件式2を評価する
- 条件式2がtrueならばブロック2内を実行してif文を抜ける
- 条件式2がfalseならばブロック2内をすっ飛ばす
- イコールを意味する演算子は「==」
if-else構文
これで完成と言いたいところなのですが、このままではこんな意地悪される可能性があります。
バグってますよね。timeに-5や500を入れて実行するとこんなことになります。
手打ち時計にそんな数字を入れるな!と言えばそれまでですが、もしtimeの値をユーザーに入力してもらうようなプログラムを書こうと思えば、どんな値が入力されてもそれなりに対応しないといけません。その辺もしっかり作っておきましょう。もう一歩ですので完成に向けて頑張って下さい。
上記のバグっぽい実行結果では、-5時や500時で「おやすみなさい」となってます。なぜそうなるかと言うと、「おやすみなさい」の条件式、
(time >= 19) || (time <= 3)
これが-5や500でもtrueになってしまうんですね。「19以上または3以下」ですから。19以上には500でも10000でも含まれるし、3以下には負の数も含まれてしまうわけです。
なので、まずはここを上は24まで下は0までにしてしまいましょう。
(time >= 19 && time <= 24) || (time >= 0 && time <= 3)
これでtimeに-5や500を入力しても「おやすみなさい」とは出力されなくなりました。けど、何も出力されません。何もなしでは愛想ないので、もし変な数値を入れられたら「timeには0~24の値を入力してください」って感じで警告文を出してやりましょう(自分で入力してるのに笑)。
その為に使うのが「else」です。さっきの「else if」は続いて条件式を入れてさらに分岐させていましたが、「else」は「その他」です。なので条件式は要りません。さっきと同じように最後のブロックの終わりの「 } 」に続いて
else { ブロック }
をつけ足します。その他なので「if」も条件式も要りません。「else」の後に、その他の場合に実行されるブロックを足すだけです。では、実際に書き足します。
(mainメソッドの中のみ表記)
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 <= 24) || (time >= 0 && time <= 3)){
System.out.println("只今の時刻は" + time + "時です");
System.out.println("おやすみなさい");
}else{
System.out.println("timeには0~24の値を入力してください");
}
これで変な数値を入れても、バグったようなメッセージが出ることはなくなりました。
このように、ifで条件を分けて、その条件に当てはまらない時に実行したいことがある時は「else」を使って実行させるようにしましょう。最後に「else」のブロックを入れることで、そのif文は絶対にどこかのブロック一つを実行する状態になりますね。
一応、timeに500を入れて実行してみます。
check point
- if-else構文の基本形
if (条件式1){ ブロック1 } else {ブロック2} - 条件式1がtrueならばブロック1内を実行してif文を抜ける
- 条件式1がfalseならばブロック1内をすっ飛ばしてelseのブロックを実行する
お疲れ様でした。これで時刻によって挨拶が変わるプログラムの完成です。説明が下手なのでえらい長くなってしまいました。申し訳ないです。
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 <= 24) || (time <= 3 && time >= 0)){ System.out.println("只今の時刻は" + time + "時です"); System.out.println("おやすみなさい"); }else{ System.out.println("timeには0~24の値を入力してください"); } } }
今だけ→転職できなければ全額返金の「エンジニア転職保証コース」
絶対エンジニアになる!→テックエキスパート
フリーランスエンジニアの収入例を見てみる→レバテックフリーランス
コメント
}else if((time >= 18 && time <= 24) || (time = 0){
ここの行 ) が抜けてエラー出てました><;
by Java初心者 2014/06/11 21:04
ご指摘ありがとうございます。
よくぞ気づいて頂きました。(汗)
修正いたしました。
ありがとうございます。
by Nobuo@管理人 2014/06/11 22:46
}else if(time == 18){
(中略)
}else if((time >= 18 && time <= 24) || (time = 0)){
条件が上のようにありますが、18という数字はどちらにも当てはまりますよね。
ならば下側の条件をtime >= 18 から time > 18 若しくは time >=19 にするべきでは?
敢えて18を被らせているのでしょうか?
by NoName 2014/06/25 11:38
ありがとうございます。
盛大に間違っておりました。ご指摘感謝いたします。
訂正いたしました。
by Nobuo@管理人 2014/06/26 11:21
上で指摘させていただいた者です。
迅速な対応ありがとうございます。
回りくどい言い方になっていたら申し訳ありません。
とても分かりやすい講座で助かっています。
これからもよろしくお願いします。
by NoName 2014/06/26 14:07
全然回りくどくないですよ。むしろ単刀直入ですw
ありがとうございます。こちらこそまた何か問題があればよろしくお願いします。
by Nobuo@管理人 2014/06/26 23:00
これで4時から10時は、「おはようございます」と挨拶するようになりました。ちなみに、それ時以外の時刻では何も出力されません。ぜひ試してみてください。→ちなみに、それ以外の時刻では
朝の挨拶はこれでは完璧です。→朝の挨拶はこれで完璧です。
でしょうか^^
by あさやん 2015/11/15 17:29
あさやんさんはコマンドプロンプトに最初からjavac Greeting.java って書いてるけどできてるのに、僕はdesktopって入力しないとできないんですけど、、この違いは何ですか?
by だだ 2016/12/06 16:18
失礼、名前違いますね・・
by だだ 2016/12/06 16:19
今更ながらコメントすると、https://nobuo-create.net/java-beginner-4/ にある、変数を使ってみるというところでC:¥Users¥owner配下でJavaファイルを作ってるからですね。
>>だだ
by Minato86 2018/06/15 22:40