下準備
テストドライバの導入
第14_2回目 (秋学期01_2回目) 分のテストドライバを導入する。以下の手順で行う。
- ダウンロード のページを開く (ここをクリック)
- プロジェクト「java2007」にある「test」の左側の「+」をクリック
- ツリーが展開されるので「install-libraries.xml」を右クリック
- 「実行(R)」にマウスカーソルを合わせる
- 「1 Ant ビルド」をクリック
- 「コンソール」タブに"BUILD SUCCESSFUL"と表示されれば成功
- eclipseの画面でプロジェクト「java2007」を右クリック
- メニューが表示されるので、「最新表示」をクリック
- "week14_2.zip" をデスクトップなどにダウンロード
- eclipseの画面でプロジェクト「java2007」を右クリック
- メニューから「インポート(I)」を選択
- 「インポート」ウィンドウが表示されるので、「Zip ファイル」を選択
- 「次へ(N)」をクリック
- 宛先フォルダー(L): が「java2007」になっていることを確認
- From archive file: の右側にある 「ブラウズ(R)...」あるいは「参照(R)...」をクリック
- ファイルダイアログが表示されるので、ダイアログ内に表示されたダウンロードしたファイルをダブルクリック
- 前の画面に戻るので、From archive file: のエリアに正しいパスが入力されていることを確認
- フォルダ「/」の左にチェックがついていることを確認 (ついていなければチェックボックスをクリック)
- 「Overwrite existing resources without warning」にチェックがついていることを確認 (上書きしたくないファイルがある場合はチェックを外す)
- 「終了 (F)」をクリック
第14_2週目テストドライバの導入に成功すると、java2007 プロジェクトの test フォルダに j2.lesson01_2.xml というファイルが作成される。
パッケージの作成
過去の演習を参考にして、「j2.lesson01_2」というパッケージを作成する。
課題1421
次のプログラムは講義資料のExamRecordActionを書き直したものである。ExamRecordのインスタンスを生成し、各フィールドの値はコンソールから入力するものとする。空欄を埋めてプログラムを完成しなさい。
package j2.lesson01_2; import java.io.*; public class ExamRecordAction1 { public static void main(String[] args) throws IOException{ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); ExamRecord p; p = ________________; System.out.print("名前を入力: "); p.name = reader.readLine(); System.out.print("数学の点数を入力: "); p.math = __________________________; System.out.print("国語の点数を入力: "); p.japanese = _________________________; System.out.print("英語の点数を入力: "); p.english = _________________________; System.out.println(p.name + "さんの数学の成績 = " + p.math); System.out.println(p.name + "さんの国語の成績 = " + p.japanese); System.out.println(p.name + "さんの英語の成績 = " + p.english); } }
手順
- パッケージ j2.lesson01_2 にクラス ExamRecord を作成
- 上記の空欄を埋めてクラス ExamRecordAction1 を作成
課題1422
講義資料の ExamRecordAction3 を作成し、実行結果を確認しなさい。
手順
指定された箇所で必ずテストを行うこと。
- パッケージ j2.lesson01_2 にクラス ExamRecordAction3 を作成
課題1423
ExamRecordAction3 を書き直して以下の表を扱うプログラム ExamRecordAction3a を作成しなさい。
名前 | 数学 | 国語 | 英語 |
---|---|---|---|
Taro | 50 | 90 | 100 |
Hanako | 70 | 30 | 80 |
Kenji | 60 | 50 | 70 |
Aya | 40 | 100 | 90 |
Jiro | 60 | 50 | 40 |
実行結果は以下のようになる。
Taro, 数学 = 50, 国語 = 90, 英語 = 100, 3科目の平均 = 80.0 Hanako, 数学 = 70, 国語 = 30, 英語 = 80, 3科目の平均 = 60.0 Kenji, 数学 = 60, 国語 = 50, 英語 = 70, 3科目の平均 = 60.0 Aya, 数学 = 40, 国語 = 100, 英語 = 90, 3科目の平均 = 76.66666666666667 Jiro, 数学 = 60, 国語 = 50, 英語 = 40, 3科目の平均 = 50.0
手順
指定した箇所で必ずテストを行うこと。
- パッケージ j2.lesson01_2 にクラス ExamRecordAction3a を作成
課題1424
講義資料の ExamRecordAction4 を作成し、実行結果を確認しなさい。
手順
指定した箇所で必ずテストを行うこと。
- パッケージ j2.lesson01_2 にクラス ExamRecordAction4 を作成
課題1425 (Optional)
ExamRecordAction5というプログラムでは以下のようなメソッドを追加している。
- public static double getAverage(ExamRecord r)
- public static void sortByMath(ExamRecord[] ra)
- public static void sortByAverage(ExamRecord[] ra)
これらの役割をよく考え、出力例も参考にして、空欄を埋め、プログラムを完成させよ。
package j2.lesson01_2; public class ExamRecordAction5 { public static void main(String[] args) { ExamRecord[] rec = new ExamRecord[4]; rec[0] = createExamRecord("Taro", 50, 90, 100); rec[1] = createExamRecord("Hanako", 70, 30, 80); rec[2] = createExamRecord("Kenji", 60, 50, 70); rec[3] = createExamRecord("Aya", 40, 100, 90); showExamRecords(rec); System.out.println("===数学の点数順に並べると==="); sortByMath(rec); showExamRecords(rec); System.out.println("===3科目平均点の順に並べると==="); sortByAverage(rec); showExamRecords(rec); } public static ExamRecord createExamRecord(String name, // 省略 } public static void showExamRecord(ExamRecord r) { // 省略 } // ExamRecord型配列の表示。1レコードを1行に表示。 public static void showExamRecords(ExamRecord[] ra){ for(int i=0; i<ra.length; i++){ // showExamRecord(ExamRecord)を利用 ____________________________ ; } } public static double averageMath(ExamRecord[] ra){ // 省略 } public static double averageJapanese(ExamRecord[] ra){ // 省略 } public static double averageEnglish(ExamRecord[] ra){ // 省略 } // 3科目の個人平均を計算する public static double getAverage(ExamRecord r){ ____________________________________________ ; } // ExamRecord型の配列を数学の点数で降順にソートする public static void sortByMath(ExamRecord[] ra){ // バブルソートで実装 boolean changed = true; while(changed){ changed = false; for(int i=0; i<=ra.length-2; i++){ // 隣接するレコードで後ろのレコードの数学の点数が高ければ // 入れ替える if(__________________________){ ExamRecord temp = _________; _______________; _______________; changed = true; } } } } // ExamRecord型の配列を3科目平均点で降順にソートする public static void sortByAverage(ExamRecord[] ra){ // バブルソートで実装 boolean changed = true; while(changed){ changed = false; for(int i=0; i<=ra.length-2; i++){ // 隣接するレコードで後ろのレコードの平均点が高ければ // 入れ替える if(_____________________________________){ ExamRecord temp = ____________; ________________; ________________; changed = true; } } } } }
出力結果は以下のようになる。
Taro, 数学 = 50, 国語 = 90, 英語 = 100, 3科目の平均 = 80.0 Hanako, 数学 = 70, 国語 = 30, 英語 = 80, 3科目の平均 = 60.0 Kenji, 数学 = 60, 国語 = 50, 英語 = 70, 3科目の平均 = 60.0 Aya, 数学 = 40, 国語 = 100, 英語 = 90, 3科目の平均 = 76.66666666666667 ===数学の点数順に並べると=== Hanako, 数学 = 70, 国語 = 30, 英語 = 80, 3科目の平均 = 60.0 Kenji, 数学 = 60, 国語 = 50, 英語 = 70, 3科目の平均 = 60.0 Taro, 数学 = 50, 国語 = 90, 英語 = 100, 3科目の平均 = 80.0 Aya, 数学 = 40, 国語 = 100, 英語 = 90, 3科目の平均 = 76.66666666666667 ===3科目平均点の順に並べると=== Taro, 数学 = 50, 国語 = 90, 英語 = 100, 3科目の平均 = 80.0 Aya, 数学 = 40, 国語 = 100, 英語 = 90, 3科目の平均 = 76.66666666666667 Hanako, 数学 = 70, 国語 = 30, 英語 = 80, 3科目の平均 = 60.0 Kenji, 数学 = 60, 国語 = 50, 英語 = 70, 3科目の平均 = 60.0
課題1426 (Optional)
ExamRecordAction5のメソッドのうち
- public static void sortByMath(ExamRecord[] ra)
- public static void sortByAverage(ExamRecord[] ra)
を以下のように変更したプログラムをExamRecordAction6とする。
- public static ExamRecord[] sortByMath(ExamRecord[] ra)
- public static ExamRecord[] sortByAverage(ExamRecord[] ra)
この2つの変更されたメソッドはソート済みの結果を新しい配列に格納して返す。
package j2.lesson01_2; public class ExamRecordAction6 { public static void main(String[] args) { ExamRecord[] rec = new ExamRecord[4]; rec[0] = createExamRecord("Taro", 50, 90, 100); rec[1] = createExamRecord("Hanako", 70, 30, 80); rec[2] = createExamRecord("Kenji", 60, 50, 70); rec[3] = createExamRecord("Aya", 40, 100, 90); showExamRecords(rec); System.out.println("===数学の点数順に並べると==="); ____________ sortedByMath = sortByMath(rec); showExamRecords(sortedByMath); System.out.println("===3科目平均点の順に並べると==="); ____________ sortedByAverage = sortByAverage(rec); showExamRecords(sortedByAverage); System.out.println("===ソート前の順の確認==="); showExamRecords(rec); } public static ExamRecord createExamRecord(String name, // 省略 } public static void showExamRecord(ExamRecord r) { // 省略 } public static void showExamRecords(ExamRecord[] ra){ // 省略 } public static double getAverage(ExamRecord r){ // 省略 } public static ExamRecord[] sortByMath(ExamRecord[] ra){ // 引数で渡された配列と別の配列を用意する ExamRecord[] result = new ExamRecord[ra.length]; // raからresultへ1レコードずつコピーして行く // コピー済みの記録が必要 boolean[] copied = new boolean[ra.length]; for(int i=0; i<copied.length; i++) copied[i] = false; for(int i=0; i<result.length; i++){ // 未コピーのデータで最大のものを探す int maxValue = -1; int index = -1; for(int j=0; j<ra.length; j++){ if(!copied[j] && ________________________){ maxValue = ______________; index = ____; } } // indexは未コピーのデータの中で最大のものを指す result[i] = ____________; copied[index] = ________; } return result; } public static ExamRecord[] sortByAverage(ExamRecord[] ra){ // 省略 } }