第14_2週目課題

下準備

テストドライバの導入

第14_2回目 (秋学期01_2回目) 分のテストドライバを導入する。以下の手順で行う。

  1. ダウンロード のページを開く (ここをクリック)
  2. プロジェクト「java2007」にある「test」の左側の「+」をクリック
  3. ツリーが展開されるので「install-libraries.xml」を右クリック
  4. 「実行(R)」にマウスカーソルを合わせる
  5. 「1 Ant ビルド」をクリック
  6. 「コンソール」タブに"BUILD SUCCESSFUL"と表示されれば成功
  7. eclipseの画面でプロジェクト「java2007」を右クリック
  8. メニューが表示されるので、「最新表示」をクリック
  9. "week14_2.zip" をデスクトップなどにダウンロード
  10. eclipseの画面でプロジェクト「java2007」を右クリック
  11. メニューから「インポート(I)」を選択
  12. 「インポート」ウィンドウが表示されるので、「Zip ファイル」を選択
  13. 「次へ(N)」をクリック
  14. 宛先フォルダー(L): が「java2007」になっていることを確認
  15. From archive file: の右側にある 「ブラウズ(R)...」あるいは「参照(R)...」をクリック
  16. ファイルダイアログが表示されるので、ダイアログ内に表示されたダウンロードしたファイルをダブルクリック
  17. 前の画面に戻るので、From archive file: のエリアに正しいパスが入力されていることを確認
  18. フォルダ「/」の左にチェックがついていることを確認 (ついていなければチェックボックスをクリック)
  19. 「Overwrite existing resources without warning」にチェックがついていることを確認 (上書きしたくないファイルがある場合はチェックを外す)
  20. 「終了 (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);
    }
}

手順

  1. パッケージ j2.lesson01_2 にクラス ExamRecord を作成
  2. 上記の空欄を埋めてクラス ExamRecordAction1 を作成

課題1422

講義資料の ExamRecordAction3 を作成し、実行結果を確認しなさい。

手順

指定された箇所で必ずテストを行うこと。

  1. パッケージ j2.lesson01_2 にクラス ExamRecordAction3 を作成

課題1423

ExamRecordAction3 を書き直して以下の表を扱うプログラム ExamRecordAction3a を作成しなさい。

名前数学国語英語
Taro5090100
Hanako703080
Kenji605070
Aya4010090
Jiro605040

実行結果は以下のようになる。

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

手順

指定した箇所で必ずテストを行うこと。

  1. パッケージ j2.lesson01_2 にクラス ExamRecordAction3a を作成

課題1424

講義資料の ExamRecordAction4 を作成し、実行結果を確認しなさい。

手順

指定した箇所で必ずテストを行うこと。

  1. パッケージ j2.lesson01_2 にクラス ExamRecordAction4 を作成

課題1425 (Optional)

ExamRecordAction5というプログラムでは以下のようなメソッドを追加している。

これらの役割をよく考え、出力例も参考にして、空欄を埋め、プログラムを完成させよ。

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のメソッドのうち

を以下のように変更したプログラムをExamRecordAction6とする。

この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){
        // 省略
    }
}