今回の練習問題は第4章の継承(4-9)とオーバーライド(4-10)の内容となっています。
examフォルダ内にファイルは保存してください。(階層→c:\work\exam)
継承、オーバーライド 練習問題
【Java】継承およびオーバーライド 練習問題
以下の指示に従ってプログラミングを行ってください。また、プログラム内にもコメントで指示がありますので、コメントの下にプログラミングを行ってください。examフォルダ内に「Test07.java」「Test07Super.java」「Exam1007.java」で保存してください。
なお、Test07クラスはTest07Superクラスを継承して記述して下さい。
保存後、「Exam1007.java」をコンパイルおよび実行を行ってください。
指示1 Test07Superクラスのメンバ指示
クラス名 | ||||
---|---|---|---|---|
Test07Super | ||||
アクセス修飾子 | メソッド名 | 戻り値の型 | 引数 | 処理内容 |
なし | search | int | String[] array, int start, String data |
第一引数の配列内に第三引数の文字列が含まれているかどうかをチェックする
第二引数は検索をスタートする配列番号の位置 検索にヒットした場合は配列番号を、検索にヒットしなかった場合は-1を戻り値として返す |
指示2 Test07クラスのメンバ指示
search()メソッドはオーバーライドで作成しています。
クラス名 | ||||
---|---|---|---|---|
Test07 | ||||
アクセス修飾子 | メソッド名 | 戻り値の型 | 引数 | 処理内容 |
なし | search | int | String[] array, int start, String data |
第一引数の配列内に第三引数の文字列が含まれているかどうかをチェックする
第二引数は検索をスタートする配列番号の位置 ただし、親クラスのsearch()と違い、重複データも考慮する為、戻り値は以下のように変更する 検索にヒットした場合はヒットした件数を、検索にヒットしなかった場合は0を戻り値として返す |
指示3 Exam1007.javaは以下のように記述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Exam1007{ public static void main(String[] args){ String[] array = {"営業","システム","人事","総務","管理","営業"}; /* 以下のプログラミングを記述してください ①Test07クラスからインスタンスを生成してください (インスタンス名は任意) ②①で作成したインスタンスを利用してsearch()メソッドを以下のように実行する インスタンス名.search(array,0,args[0]) ③②の戻り値は変数に保存してください ④③の変数を利用して検索結果を表示してください */ //例)親クラスであるTest07Superは重複データは考慮せず、配列番号および-1が取得できる Test07Super t07s = new Test07Super(); int point = t07s.search(array,0,args[0]); System.out.println(point + "番目にありました"); } } |
Test07Super.javaのヒント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Test07Super{ /* 引数で指定された文字列が配列内にあるかどうかをチェックする 第一引数は配列、第二引数は検索のスタート位置、第三引数は検索文字列 見つかった場合は配列番号を、見つからなかった場合は-1を返す */ xxx search(xxxxxx, xxxxxx, xxxxxx){ for(int i = start; i < array.length; i++){ //配列内のデータと第三引数の文字列を比較し、一緒であれば配列番号をリターン if(xxxxxx){ return i; } } return -1; } } |
Test07.javaのヒント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Test07 extends Test07Super{ /* 引数で指定された文字列が配列内にあるかどうかをチェックする 第一引数は配列、第二引数は検索のスタート位置、第三引数は検索文字列 ただし、引数内データは重複を考慮し、配列番号ではなく見つかった件数を返す 見つからなかった場合は、0を返す */ xxx search(xxxxxxx, xxxxxxx, xxxxxxx){ int count = 0; int point = super.search(xxxxxxx,xxxxxxx,xxxxxxx); //pointが-1以外の時にループを回す while(xxxxxxx){ count++; start = point + 1; point = super.search(array,start,data); } return count; } } |
実行結果
1件ヒットしました
1番目にありました
2件ヒットしました
0番目にありました
※1行目の表示はTest07のsearch()メソッドの結果となっており検索結果を出力。2行目の表示はTest07Superのsearch()メソッドの結果となっており見つかった配列番号を出力。
※営業を検索した際の2行目の表示は重複を考慮していないため、最初にヒットした0番目だけ表示されます。
【Java】継承 練習問題
以下の指示に従ってプログラミングを行ってください。examフォルダ内に「Test08.java」「Test08Super.java」「Exam1008.java」で保存してください。
なお、Test08クラスはTest08Superクラスを継承して記述して下さい。
保存後、「Exam1008.java」をコンパイルおよび実行を行ってください。
指示1 Test08Superクラスのメンバ指示
クラス名 | ||||
---|---|---|---|---|
Test08Super | ||||
アクセス修飾子 | メソッド名 | 戻り値の型 | 引数 | 処理内容 |
なし | power | double | double number, int count |
第一引数の数値を第二引数の回数分で乗算する
乗算した結果を戻り値で返す |
指示2 Test08クラスのメンバ指示
クラス名 | ||||
---|---|---|---|---|
Test08 | ||||
アクセス修飾子 | メソッド名 | 戻り値の型 | 引数 | 処理内容 |
なし | execute | double | int number, int count |
第一引数の数値(%)を第二引数分繰り返したときに、何パーセントの確率で当選するかを戻り値で返す
例えば、30(%)を3回繰り返すと、65.7(%)がリターンされる |
指示3 Exam1008.javaは以下のように記述
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Exam1008{ public static void main(String[] args){ /* 以下のプログラミングを記述してください 30%の確率を10回まで繰り返したときの確率を表示します ※独立試行の確率 */ int number = 30; Test08 t08 = new Test08(); for(int i = 1; i <= 10; i++){ double result = t08.execute(number,i); System.out.println(number + "%で" + i + "回抽選すると"); System.out.println("当たる確率は[" + result + "]%です"); } } } |
実行結果
C:\work\exam>javac Exam1008.java
C:\work\exam>java Exam1008
30%で1回抽選すると
当たる確率は[30.000000000000004]%です
30%で2回抽選すると
当たる確率は[51.0]%です
30%で3回抽選すると
当たる確率は[65.7]%です
30%で4回抽選すると
当たる確率は[75.99000000000001]%です
30%で5回抽選すると
当たる確率は[83.19300000000001]%です
30%で6回抽選すると
当たる確率は[88.23510000000002]%です
30%で7回抽選すると
当たる確率は[91.76457]%です
30%で8回抽選すると
当たる確率は[94.23519900000001]%です
30%で9回抽選すると
当たる確率は[95.9646393]%です
30%で10回抽選すると
当たる確率は[97.17524751]%です
Test08.javaのexecute()メソッドヒント
※変数bのデータを算出する計算式は、計算する際の型に注意
1 2 3 4 5 6 7 8 9 |
double execute(int number, int count){ //numberはパーセントになっているため、100で割る(ただし計算の仕方に注意) double b = xxxxxxxx; //継承したpower()メソッドを利用して乗算を行う double c = power(1 - b,xxxxxx); //cの結果は当選しない確率なので、1から引く //また、パーセントでリターンする為、100をかける return xxxxxx; } |
1 2 3 4 5 6 7 8 |
double power(double a, int count){ double result = 1; //count分繰り返す for(xxxxxxx){ result *= a; } return result; } |