「if文で星座を判定しよう」で星座を出力させるプログラムを書きましたが、これをメソッドを使って書き替えてます。
この章はメソッドの学習ですので、BufferedReaderについては「キーボードの入力の値を受け取ろう」の章で説明します。この例は星座の判定を judgeメソッドに任せています。
このように判定の部分をif文で長く書くのではなく、メソッド化することでコンパクトになりプログラムがすっきり書けます。
少しずつ分解しながら、説明していきます。
〇以下の箇所は「if文で星座を判定しよう」で説明したので、説明は省略します。
〇メソッドを呼び出しているのは以下の箇所です。
judge(month, birthDay);
judge(month, birthDay);の中のmonthのデータがjudgeメソッドの引数int monthに入り、birthDayのデータがint dayに入ります。
〇 judgeメソッド内のの要素は星座名で配列を作成しています。
この配列内の要素は山羊座から順番通りに並んでいます。
決して、適当に並んでいるわけではありません。
〇judgeメソッド内のには各星座の月の末日を配列に入れています。
judgeメソッド内のには1月から12月までの末日を配列に入れています。
〇次に以下の箇所の説明をします。 例えばmonthに1が入り、dayに19が入っているとします。
そうするとの部分はiが0の時にifの条件式がTRUEになりますので、以下の入れ子のif文の条件式の判定に入ります。 「day <= day1[i]」の中のdayには19が入り、1周目のにはday1の0番目の要素である19が入っていますので、条件式はTRUEになり、nameにはnames配列の0番目の要素であるやぎ座が入ります。
例えばdayに19ではなく23が入っていると仮定するとはFALSEになるので、の条件式の判定に入ります。
ここでにはday2の0番目の要素である31が入っていますのでTRUEになり、name には以下の条件に該当する星座が入ります。 この中のiには1周目では0が入っていますのでで余りを求めると1になりますのでとなり、みずがめ座が入ることになります。
の箇所の説明をしますと例えばmonthが1で、day が23の場合にはがになりFALSEになるので、else ifのブロックに入りますが、1月は やぎ座と水瓶座しかなく、やぎ座ではないのならば水瓶座しかないのでnames配列を1つ進めるためにで1を足しています。つまり、該当する以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。
〇もし、judgeメソッドのmonthに100、dayに100などif文の条件式にマッチしないデータを入れるとnameには何も入りません。
そうなった場合にはnameには初期値のカラ文字が入っているので、if文の条件式にマッチして「間違い」が出力されます。
staticについては「staticについて知ろう」の章で説明します。
次はmainメソッドの外で変数を宣言するとどうなるかについて説明します。
name変数はmainメソッドの外で宣言しているので、プログラムのどこからでも使用することが出来ます。
このような変数をグローバル変数と言います。
プログラム全体で変数を使いたい場合にはメソッドの外で宣言をしてください。
これまでメソッド内で使っていた変数はローカル変数と呼ばれています。
ローカル変数とはメソッド内で宣言して、メソッドの中に使用が限定されている変数です。
この例ではname変数を judgeメソッド内で使っているので、mainメソッド内でname変数の値を使うためにはグローバル変数にする必要があります。
〇最後にnameに入った星座を次の箇所で出力します。 結果の一例は以下の通りです。