下準備
テストドライバの導入
第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){
// 省略
}
}