ここでは、クラスメソッドを作成してみましょう。
クラスメソッドはインスタンス化せずに呼び出せるメソッドです、そのためクラスメソッド内から直接、自クラス内のインスタンス変数やインスタンスメソッドにアクセスすることができません。
なぜなら、実行した時にインスタンスがあるとは限らないからです。
次の章の「オブジェクトの利用」におけるインスタンスメソッドと比較してみてください。
以下のクラスをIDEにコピーして、プログラムを作成しなさい。
(以降の問題演習はこのクラスに追加変更を加えること。途中経過を別ファイルとして残す必要はない)
次のプログラムコードに、各設問の条件にあうメソッドを追加しなさい。
その後、そのメソッドが正しく動作することを検証するためのプログラムコードをmainメソッドの中に追加しなさい。
1 2 3 4 5 6 7 8 9 |
public class Practice { // ここにあなたがクラスメソッドを追加する public static void main(String[] args) { // ここに、あなたが追加したメソッドをテストするコードを追加する } } |
1.引数あり、戻り値あり
以下のクラスメソッドを作成しなさい。
(引数あり、戻り値あり)
メソッド名: getRectangularArea
引数列: double width, double height
戻り値の型: double
処理の内容: 幅が width、高さが height で表される長方形の面積を返す
2.引数なし、戻り値なし
以下のクラスメソッドを作成しなさい。
(引数なし、戻り値なし)
メソッド名: printE
引数列:なし
戻り値:なし
処理の内容: 自然対数の底e(≒2.718281828459045)の値を出力する
ヒント:
・自然対数の底eの値は Math クラスのクラス変数 E に格納されている。
・System.out.println(Math.E); で、この値を出力できる。
3.引数あり、戻り値なし
以下のクラスメソッドを作成しなさい。
(引数あり、戻り値なし)
メソッド名: sayHello
引数列: String name
戻り値:なし
処理の内容: 引数で渡されたnameに対して挨拶する
ヒント:メインメソッドは以下のようになる。
1 2 3 |
public static void main(String[] args) { sayHello("imai"); } |
4.引数あり、戻り値なし
以下のクラスメソッドを作成しなさい。
(引数あり、戻り値なし)
メソッド名: printSquareArea
引数列: double oneSide
戻り値:なし
処理の内容: 引数で渡された値を一辺とする正方形の面積を出力する
5.引数が複数、戻り値なし
以下のクラスメソッドを作成しなさい。
(引数が複数、戻り値なし)
メソッド名: printMessage
引数列: String message, int count
戻り値:なし
処理の内容: 文字列 message を、count の回数だけ繰り返し出力する
ヒント:
・printMessage(“Hello”, 5); とすると、”Hello” という文字が5回出力される
6.引数なし、戻り値あり
以下のクラスメソッドを作成しなさい。
(引数なし、戻り値あり)
メソッド名: getMessage
引数列:なし
戻り値の型: String
処理の内容: “I LOVE YOUxxx” という文字列を返す
7.実引数がメソッド
mainメソッドの中で5のprintMessageメソッドの第一引数を6のgetMessageメソッドにして実行してみる。
8.戻り値の型がboolean
メソッド名: isEvenNumber
引数列: int value
戻り値の型: boolean
処理の内容: 引数で渡された値が偶数の場合は true、そうでない場合は false を返す。
9.引数が複数、戻り値あり
以下のクラスメソッドを作成しなさい。
(引数が複数、戻り値あり)
メソッド名:getMinValue
引数列:double a, double b
戻り値の型:double
処理の内容: 引数で受け取る2の値のうち、小さい方の値を返す(三項演算子を使うこと)
10.引数が配列
以下のクラスメソッドを作成しなさい。
(引数が配列)
メソッド名: getAverage
引数列:double[] array
戻り値の型:double
処理の内容: 引数で受け取る配列の要素の平均値を返す
11.戻り値が配列
以下のクラスメソッドを作成しなさい。
(戻り値が配列)
メソッド名: getRandomNumbers
引数列:int num
戻り値の型:int[]
処理の内容: 引数で受け取った数の乱数が入った配列(の参照)を返す。ただし、乱数は0~10の範囲とする。
12.メソッドからメソッドを呼ぶ
以下のクラスメソッドを作成しなさい。
(メソッドからメソッドを呼ぶ)
メソッド名: sayHellos
引数列: String name, int count
戻り値:なし
処理の内容: 3で作成したsayHelloメソッドを、count の回数だけ繰り返し呼ぶ。
ヒント:sayHellos(“imai”, 5); などと呼び出す。
13.メソッドチェーン
メソッドチェーンを使った問題です。
6のgetMessage()を使って得られた文字列の文字数をlength()メソッドで取得し、コンソールに出力する処理を1行で記述しなさい。
14.再帰を使って階乗計算をする
以下のクラスメソッドを作成して階乗計算(※)をしなさい。
※階乗計算とは
非負整数 n の階乗 n ! は、1 から n までのすべての整数の積のこと。
例:6!=6×5×4×3×2×1=720
メソッド名: fact
引数列:int n
※ただし、nは正
戻り値の型:int
処理の内容: もしも、n が0なら1を返す。そうでなければ、n * fact(n – 1) を返す。
アウトプット例:
1 2 3 4 5 6 7 8 9 |
fact(1) = 1 fact(2) = 2 fact(3) = 6 fact(4) = 24 fact(5) = 120 fact(6) = 720 fact(7) = 5040 fact(8) = 40320 fact(9) = 362880 |
15.再帰を使ってフィボナッチ数列を表示する
以下のクラスメソッドを作成してフィボナッチ数列(※)を表示しなさい。
※フィボナッチ数列とは
例:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,…
のように最初の二項は 0, 1 であり、以後どの項もその直前の2つの項の和となっている数列のこと。
メソッド名: fib
引数列:int n
※ただし、nは0または正
戻り値の型:int
処理の内容: もしも、n が0または1なら1を返す。そうでなければ、fib(n – 1) + fib(n – 2) を返す。
アウトプット例:
1 2 3 4 5 6 7 8 9 10 |
fib(0) = 1 fib(1) = 1 fib(2) = 2 fib(3) = 3 fib(4) = 5 fib(5) = 8 fib(6) = 13 fib(7) = 21 fib(8) = 34 fib(9) = 55 |
16.再帰を使ってハノイの塔の円盤の操作を表示する
以下のクラスメソッドを作成してハノイの塔(※)の円盤の操作を表示しなさい。
※ハノイの塔とは(Wikipedia参照)
パズルの一種。
以下のルールに従ってすべての円盤を右端の杭に移動させられれば完成。
- 3本の杭と、中央に穴の開いた大きさの異なる複数の円盤から構成される。
- 最初はすべての円盤が左端の杭に小さいものが上になるように順に積み重ねられている。
- 円盤を一回に一枚ずつどれかの杭に移動させることができるが、小さな円盤の上に大きな円盤を乗せることはできない。
メソッド名: hanoi()
引数列:char x, char y, char z, int n
※ただし、x,y,zは杭の名前、nは円盤の枚数
戻り値の型:void
処理の内容: 各自で考えること。
アウトプット例:hanoi(‘A’, ‘B’, ‘C’, 3)
From A to C
From A to B
From C to B
From A to C
From B to A
From B to C
From A to C
※伝説では64枚の円盤の移し替えが終わったときに、世界は崩壊し終焉を迎えるそうです。試してみてください。
17.メソッドの切り出し
あなたは、テスト結果を管理するJavaプログラムを作成した。
プログラムの目的は合計点数と平均点数、平均年齢を求めることである。
出力例を以下に示す。
合計点数:968
平均点数:101
平均年齢:26.31578947368421
あなたが最初に書いたソースコードは以下の通りである。
ところが、処理が重複して書かれていることに気づいた。
合計を求める処理をメソッドに切り出しなさい。
なお、必要に応じてメソッド名やローカル変数名を自由につけること。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public class SumAvgBad { public static void main(String[] args) { int[] scores = {60, 53, 5, 68, 82, 70, 83, 12, 3, 72, 38, 68, 92, 15, 92, 48, 13, 14, 80}; int[] ages = {22, 29, 28, 29, 26, 23, 30, 23, 27, 23, 28, 28, 26, 27, 26, 28, 30, 25, 22}; int sum = 0; double avg = 0; for (int i = 0; i < scores.length; i++) { sum += scores[i]; } System.out.println("合計点数:" + sum); for (int i = 0; i < scores.length; i++) { sum += scores[i]; } System.out.println("平均点数:" + sum / scores.length); for (int i = 0; i < ages.length; i++) { avg += ages[i]; } avg = avg / ages.length; System.out.println("平均年齢:" + avg); } } |
18.メソッドのオーバーロード
以下のプログラムは成績の合計と体重の合計を求めるプログラムである。
成績は整数で体重は小数点以下第一位の実数で与えられる。
体重の合計を正しく求めるためのメソッドを作成しなさい。
<アウトプット例>
スコア合計:968
体重合計:1492.9999999999998
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class Sum { public static void main(String[] args) { int[] scores = {60, 53, 5, 68, 82, 70, 83, 12, 3, 72, 38, 68, 92, 15, 92, 48, 13, 14, 80}; double[] weights = {54.7, 86.1, 82.5, 65.4, 98.9, 75.2, 81.9, 58.9, 94.4, 91.9, 90.9, 88.3, 76.8, 57.3, 68.1, 69.7, 58.6, 99.5, 93.9}; int sumI = 0; double sumD = 0.0; System.out.println("スコア合計:" + sum(scores, sumI)); System.out.println("体重合計:" + sum(weights, sumD)); } public static int sum(int[] scores, int sum) { for (int i = 0; i < scores.length; i++) { sum += scores[i]; } return sum; } //ここにdouble型に対応したメソッドを書く } |
19.ローカル変数
以下のプログラムを実行したら何が出力されるか?また、それはなぜか説明しなさい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Sample { public static void main(String[] args) { int num = 1; System.out.println(num); local(); System.out.println(num); } static void local() { int num = 2; System.out.println(num); } } |
20.エラーの見方(おまけ)
以下のソースコードでは、3つのメソッドABCがあり、AからBをBからCを呼んでいる。
このプログラムを実行して、コンソールに表示されるエラーを読み解き、そこからエラーが出た際に我々はどこを見るべきかという一般原則を導き出しなさい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class ExceptionTest { private static void methodA(int num1, int num2) { methodB(num1, num2); } private static void methodB(int num1, int num2) { methodC(num1, num2); } private static void methodC(int num1, int num2) { System.out.println(num1 / num2); } public static void main(String[] args) { methodA(5, 0); } } |
21.オリジナル問題作成