第14週目演習

下準備

テストドライバの導入

春学期分のデータが残っていない場合はダウンロードページからJTAFをダウンロードしてくること。別のプロジェクトを用意してもかまわないが、その場合は以降プロジェクト名を作成したプロジェクト名に読み替えること。

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

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

第14週目テストドライバの導入に成功すると、java2007 プロジェクトの test フォルダに j2.lesson01.xml というファイルが作成される。

パッケージの作成

過去の演習を参考にして、「j2.lesson01」というパッケージを作成する。

長方形を表すクラス

長方形を表すクラスを作成する。

長方形とは四つの内角がすべて直角であるような四角形を指す。

インスタンスフィールドの抽出

長方形インスタンスが持つ属性を考える。代表的なものとして、以下のものを使用することにする。

どちらも double 型として宣言することにする。

骨格の作成

クラスの作成

以下の手順で、パッケージ「j2.lesson01」に「Rectangle」クラスを作成する。

  1. 先ほど作成したパッケージ 「j2.lesson01」の上で右クリック
  2. マウスカーソルを「新規」に合わせる
  3. 「クラス」をクリック
  4. クラス名は Rectangle とする

インスタンスフィールドの作成

Rectangleクラス内にインスタンスフィールドを作成する。

package j2.lesson01;

public class Rectangle {
    
    // 高さ
    double height;
    
    // 底辺の長さ (幅)
    double width;
}

骨格テスト

ここまでの作業をCtrl+Sを押して保存し、コンパイルを行う (保存時に自動で行われる)。ここでエラーが発生していたら文法エラーなので見直す。

「Rectangleに対する骨格テスト」 を実行する。

骨格テストを行った際に緑のバーが表示されれば、外側から見たプログラムの骨格は正しくなっている。

赤いバーが表示された場合、メッセージを元にプログラムを見直すこと。修正を行い、Ctrl+Sで保存した後に「Run」ボタンをクリックする。

メッセージ 詳細
(クラス名), existence j2.lesson01 に対象のクラスが存在していない。パッケージやクラス名を確認
(フィールド名), existence 対象の名前を持つフィールドが存在していない
(フィールド名), type <T> メソッドを作る際に戻り値の型を間違えている (正しくは <T>)

長方形の面積を計算するプログラム

クラスやインスタンスを使用する練習として、長方形の面積を計算するプログラムを考える。長方形は先ほどの演習で作成した Rectangle クラスを用いることにする。

擬似コードの作成

「プログラム全体」の擬似コード

プログラム全体の擬似コードは以下のようにする。

プログラム全体
    rectangle = 新しい長方形インスタンス
    print "高さを入力:"
    rectangle の高さ = 入力された値 (double)
    print "幅を入力:"
    rectangle の幅 = 入力された値 (double)
    print "面積は" + area-of(rectangle)

area-of(rectangle) は与えられた rectangle の面積を計算するプログラムである。次の項で詳細化する。

「area-of」の擬似コード

長方形の面積は「底辺 × 高さ」で計算できる。よって、area-of(rectangle) は次のような擬似コードで表すことができる。

area-of(rectangle)
    return rectangle の底辺 * rectangle の高さ

骨格の作成

クラスの作成

以下の手順で、パッケージ「j2.lesson01」に「RectangleAction」クラスを作成する。

  1. 先ほど作成したパッケージ 「j2.lesson01」の上で右クリック
  2. マウスカーソルを「新規」に合わせる
  3. 「クラス」をクリック
  4. クラス名は RectangleAction とする

擬似コードの貼り付け (骨格のみ)

作成したクラスに、各擬似コードの名前を貼り付ける。ただし、「プログラム全体」ではコンソールからの入力を行っていたため、import java.io.*; も追加する。

package j2.lesson01;

import java.io.*;

public class RectangleAction {
    // プログラム全体
    // area-of(rectangle)
}

mainメソッドの作成 (骨格のみ)

擬似コード「プログラム全体」に合わせて、クラス「RectangleAction」内にpublic static void main(String[] args) から始まるメソッドを作成する。ただし、擬似コード「プログラム全体」ではコンソールからの入力を行っていたので、throws IOExceptionをつける。

areaOf メソッドの作成 (骨格のみ)

擬似コード「area-of」に合わせて、クラス「RectangleAction」内に「areaOf」という名前を持ち、仮引数に (Rectangle) を取るメソッドを作成する。また、メソッドの戻り値は面積を返すため、戻り値型は double とする。骨格だけでよいのでメソッドの中身は return 0.0; とでも書いておく。

仮引数の名前は何でもよいが、ここでは擬似コードに合わせて rectangle としておく。

全体の骨格

ここまでのプログラムの骨格は以下のようになる。

package j2.lesson01;

public class RectangleAction {

    // プログラム全体
    public static void main(String[] args) {
    }

    // area-of(rectangle)
    public static double areaOf(Rectangle rectangle) {
        return 0.0;
    }
}

骨格テスト

ここまでの作業をCtrl+Sを押して保存し、コンパイルを行う (保存時に自動で行われる)。ここでエラーが発生していたら文法エラーなので見直す。

「RectangleActionに対する骨格テスト」 を実行する。

骨格テストを行った際に緑のバーが表示されれば、外側から見たプログラムの骨格は正しくなっている。

赤いバーが表示された場合、メッセージを元にプログラムを見直すこと。修正を行い、Ctrl+Sで保存した後に「Run」ボタンをクリックする。

メッセージ 詳細
(クラス名), existence j2.lesson01 に対象のクラスが存在していない。パッケージやクラス名を確認
(メソッド名), existence 指定されたメソッドが存在しない
(メソッド名), public メソッドを作る際に public が抜けている
(メソッド名), static メソッドを作る際に static が抜けている
(メソッド名), type <T> メソッドを作る際に戻り値の型を間違えている (正しくは <T>)
(メソッド名), throws java.io.IOException メソッドを作る際に throws IOException が抜けている

プログラムへの変換

areaOf メソッドの実装

メソッド areaOf の中身を記述する。

まずは擬似コードをコメントとして貼り付ける

// area-of(rectangle)
public static double areaOf(Rectangle rectangle) {
    // return rectangle の底辺 * rectangle の高さ
    return 0.0;
}

これを元にプログラムを作成する。書き終わったら最後に入れていたダミーの return 文はいらないので削除する。

// area-of(rectangle)
public static double areaOf(Rectangle rectangle) {
    // return rectangle の底辺 * rectangle の高さ
    return rectangle.width * rectangle.height;
}

areaOf メソッドのテスト

余裕があれば、area-of に対する単体テストを作成せよ。もし時間が無い場合は、次のようにmainメソッド内にテスト用のコードを書いて実行してみること。

public static void main(String[] args) throws IOException {
    Rectangle r = new Rectangle();
    r.height = 2.0;
    r.width = 3.0;
    System.out.println(areaOf(r));
}

main メソッドの実装

続けて、先ほど作成した RectangleAction クラスの main メソッドの中身を記述する。

まずは擬似コードをコメントとして貼り付ける。

// プログラム全体
public static void main(String[] args) throws IOException {
    // rectangle = 新しい長方形インスタンス
    // print "高さを入力:"
    // rectangle の高さ = 入力された値 (double)
    // print "幅を入力:"
    // rectangle の幅 = 入力された値 (double)
    // print "面積は" + area-of(rectangle)
}

これを元にプログラムを作成する。

// プログラム全体
public static void main(String[] args) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    // rectangle = 新しい長方形インスタンス
    Rectangle rectangle = new Rectangle();

    // print "高さを入力:"
    System.out.print("高さを入力:");

    // rectangle の高さ = 入力された値 (double)
    rectangle.height = Double.parseDouble(reader.readLine());

    // print "幅を入力:"
    System.out.print("幅を入力:");

    // rectangle の幅 = 入力された値 (double)
    rectangle.width = Double.parseDouble(reader.readLine());

    // print "面積は" + area-of(rectangle)
    System.out.print("面積は" + areaOf(rectangle));
}

全体的には下記のようなプログラムにする。

package j2.lesson01;

import java.io.*;

public class RectangleAction {

    // プログラム全体
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // rectangle = 新しい長方形インスタンス
        Rectangle rectangle = new Rectangle();

        // print "高さを入力:"
        System.out.print("高さを入力:");

        // rectangle の高さ = 入力された値 (double)
        rectangle.height = Double.parseDouble(reader.readLine());

        // print "幅を入力:"
        System.out.print("幅を入力:");

        // rectangle の幅 = 入力された値 (double)
        rectangle.width = Double.parseDouble(reader.readLine());

        // print "面積は" + area-of(rectangle)
        System.out.print("面積は" + areaOf(rectangle));
    }

    // area-of(rectangle)
    public static double areaOf(Rectangle rectangle) {
        // return rectangle の底辺 * rectangle の高さ
        return rectangle.width * rectangle.height;
    }
}

プログラムの実行

前期と同じ要領でプログラムを実行する。

プログラムの実行に成功し、順に 2.0, 1.5 と入力すると以下のように表示される。

高さを入力:2.0
幅を入力:1.5
面積は3.0

機能テスト

ここまでの作業をCtrl+Sを押して保存し、コンパイルを行う (保存時に自動で行われる)。ここでエラーが発生していたら文法エラーなので見直す。

「RectangleActionに対する機能テスト」 を実行する。

赤いバーが表示された場合、メッセージを元にプログラムを見直すこと。修正を行い、Ctrl+Sで保存した後に「Run」ボタンをクリックする。

メッセージ 詳細
期待された結果と異なります 出力された結果が期待された値と異なる。

機能テストの項目

項目名 テストの内容
sample サンプルと同じ入力でプログラムを実行