問題1-13
mainメソッドはすでに完成しています。(変更は禁止です)
mainメソッド内で呼び出している、第一引数と第二引数の値を、第三引数の種類によって計算するcalcメソッドを定義してください。
ただし、3つの引数の型はすべてint型とし、第三引数の値が0のときは足し算、1のときは引き算、2のときは掛け算、3のときは割り算とします。
第三引数の値が0〜3以外の場合は、第一・第二引数の値にかかわらず0を返してください。
また、条件分岐には必ずswitch文を使用してください。
注意
今回は0による除算の対応は不要とします。
【実行結果】
足し算:24 引き算:12 掛け算:108 割り算:3
【MethodBasicPractice2.java】
public class MethodBasicPractice2 { public static void main(String[] args) { int a = 18; int b = 6; // calcメソッドの呼び出し System.out.println("足し算:" + calc(a, b, 0)); System.out.println("引き算:" + calc(a, b, 1)); System.out.println("掛け算:" + calc(a, b, 2)); System.out.println("割り算:" + calc(a, b, 3)); } // ここにcalcメソッドを定義してください }
解答例
【MethodBasicPractice2.java】
public class MethodBasicPractice2 { public static void main(String[] args) { int a = 18; int b = 6; // calcメソッドの呼び出し System.out.println("足し算:" + calc(a, b, 0)); System.out.println("引き算:" + calc(a, b, 1)); System.out.println("掛け算:" + calc(a, b, 2)); System.out.println("割り算:" + calc(a, b, 3)); } // ここにcalcメソッドを定義してください public static int calc(int value1, int value2, int type) { // 戻り値格納用変数の宣言と初期化 int result = 0; // 演算タイプによる分岐 switch(type) { // 足し算の場合 case 0: result = value1 + value2; break; // 引き算の場合 case 1: result = value1 - value2; break; // 掛け算の場合 case 2: result = value1 * value2; break; // 割り算の場合 case 3: result = value1 / value2; break; // 不正なタイプの場合(特に何もしない) default: } return result; } }
解説
四則演算を行うオーソドックスなメソッド定義の問題です。
今回はswitch文を使用しなければならない縛りがありますが、しっかり完成出来たでしょうか。
シンプルな問題ですが、うまくコンパイルが通らない人もいるかもしれません。
次のようなコーディングをした人はいるでしょうか。
public static void cals(int value1, int value2, int type) { switch(type) { case 0: System.out.println(value1 + value2); break; case 1: System.out.println(value1 - value2); break; case 2: System.out.println(value1 * value2); break; case 3: System.out.println(value1 / value2); break; default: System.out.println(0); } }
このミスは、プログラミング初学者に結構多いです。
間違えた人は、この後の解説をしっかりと読んでください。
Javaプログラミングというのは、連続的なメソッド呼び出しで処理が行われます。
「メソッドを呼び出す」というのは、仕事に必要なデータを渡し、仕事をしてもらい、仕事の成果であるデータを受け取ると言うことです。
そして、仕事に必要なデータのことを「引数」といい、仕事の成果であるデータのことを「戻り値」といいます。
今回のcalcメソッドの定義の問題、戻り値に関しては特に何も指示がありませんでしたが、少なくともvoid(戻り値なし)では絶対にありません。
なぜなら、mainメソッドのcalcメソッド呼び出しの記述は、
System.out.println("足し算:" + calc(a, b, 0));
となっていて、calcメソッドの戻り値を文字列連結演算子+で結合するという前提になっているからです。
「メソッドが戻り値を返す」というのは、メソッド呼び出し元にデータそのものを返すことであって、System.out.printlnメソッドを使って画面にデータを出力するのとは全く異なります。
この違いをしっかり理解しましょう。
今回のcalcメソッドは、整数の四則演算の結果を戻り値として返すので、戻り値の型はint型が適切です。
他に、次のようなコードを記述した人がいるかもしれません。
public static int calc(int value1, int value2, int type) { switch(type) { case 0: return value1 + value2; case 1: return value1 - value2; case 2: return value1 * value2; case 3: return value1 / value2; default: return 0; } }
特に間違っているというわけではないのですが、あまりオススメしません。
1つのメソッドに多くのreturn文を書いて出口を複数にしてしまっているからです。
ベテランプログラマの中には、このような記述を嫌う人が少なくありません。
return文は戻り値を返すメソッドの最後に1行だけ書くのが一番シンプルで良いと考えます。
解答例とほとんど同じプログラムなのにコンパイルが通らない人もいるかもしれません。
そのよう場合はきっと「変数は初期化されていない可能性があります」というコンパイルエラーメッセージが出ていると思います。
今回の解答例、第三引数typeの値が0〜3以外の場合、ローカル変数resultの初期値である0が返されます。
もし、ローカル変数resultの宣言時に初期値0を代入しないと、初期値は「何もなし」になります。
この「何もなし」というのは、「0」とは全く違います。
「0」はちゃんとしたデータであり、たとえるなら「何もなし」は真空と同じです。
まだ何も値が入っていない変数を使用しようとすると、コンパイルエラーになることをぜひ覚えておいてください。
その解決策は非常に簡単で、ローカル変数を宣言する場合は、とりあえず初期値も必ず代入するようにしておくことです。
参考図書
LINE公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】