第05週目演習

下準備

テストドライバの導入

第05回目分のテストドライバを導入する。以下の手順で行う。

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

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

パッケージの作成

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

複雑な条件判定を行うプログラム

コンソールに一つだけ整数を入力させて、その値を様々な条件式で判定する。

演習

クラスの作成

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

  1. 先ほど作成したパッケージ 「j1.lesson05」の上で右クリック
  2. マウスカーソルを「新規」に合わせる
  3. 「クラス」をクリック
  4. クラス名は ComplexCondition とする
  5. 先週までと同じ手順でクラスを作成する

mainメソッドの作成

先と同じ手順で、クラス「ComplexCondition」内にpublic static void main(String[] args) throws IOException から始まるメソッドを作成する。

このプログラムでは「コンソールからの入力を取得」を行うため、importや throws IOException を忘れないこと。

骨格テスト

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

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

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

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

メッセージ 詳細
クラスが存在しません j1.lesson05 に ComplexCondition クラスが存在していない。パッケージやクラス名を確認
クラスがpublicで宣言されていません class の前に public の指定がない。
mainメソッドが存在しません public static void main(String[]) が存在していない。mainという名前やString[]の部分を確認
mainメソッドがpublicで宣言されていません mainメソッドを作る際に public が抜けている。
mainメソッドがstaticで宣言されていません mainメソッドを作る際に static が抜けている。
mainメソッドがvoidで宣言されていません mainメソッドを作る際に void 以外を指定している。
mainメソッドにthrows IOExceptionの指定がありません mainメソッドを作る際にthrows IOExceptionの指定を行っていない。

プログラムの作成

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

全体的には下記のようなプログラムにする。ただし、一文書くごとにCtrl+Sで保存とコンパイルを行い、常に文法エラーが発生していないことを確認すること。

package j1.lesson05;

import java.io.*;

public class ComplexCondition {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("整数を入力:");
        int a = Integer.parseInt(reader.readLine());
        
        if (0 <= a && a < 10)
            System.out.println("0以上かつ10未満");
        else if (a < -10 || a >= 20)
            System.out.println("-10未満または20以上");
        
        if (0 < a && ((a % 5) == 0 || (a % 7) == 0))
            System.out.println("5の倍数または7の倍数");
    }
}

プログラムの実行

先週までと同じ手順でプログラムを実行する。

実行が成功すると、以下のように表示される。

整数を入力:

ここで、:の右側をクリックして 21 と入力し、Enterキーを押す。すると、プログラムは最後まで進んで次のように表示される。

整数を入力:21
-10未満または20以上
5の倍数または7の倍数

機能テスト

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

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

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

メッセージ 詳細
余計な入力を待っていると考えられます コンソール入力を取得する命令を2回以上行っていないか確認
次の入力を変換できませんでした (???) ??? を取得しようとして失敗している。コンソール入力を取得する命令を確認
期待された結果と異なります 出力された結果が期待された値と異なる。「期待された値」と「実際の値」を比較 (エラーメッセージが出力されているエリアの下のほうにあるバーをスクロールさせれば見ることができる) し確認。他にも直接プログラムを実行して結果を調べたり、エラーメッセージの2行目にあるat以下を参考にプログラムを見直す

機能テスト失敗時のヒント

メッセージ テストの内容
期待された結果と異なります (M20) 入力が-20
期待された結果と異なります (M11) 入力が-11
期待された結果と異なります (M10) 入力が-10
期待された結果と異なります (M5) 入力が-5
期待された結果と異なります (M1) 入力が-1
期待された結果と異なります (0) 入力が0
期待された結果と異なります (1) 入力が1
期待された結果と異なります (4) 入力が4
期待された結果と異なります (5) 入力が5
期待された結果と異なります (6) 入力が6
期待された結果と異なります (7) 入力が7
期待された結果と異なります (8) 入力が8
期待された結果と異なります (9) 入力が9
期待された結果と異なります (10) 入力が10
期待された結果と異なります (15) 入力が15
期待された結果と異なります (19) 入力が19
期待された結果と異なります (20) 入力が20
期待された結果と異なります (21) 入力が21
期待された結果と異なります (29) 入力が29

解説

解説のために、プログラムに行番号をつけて解説する。

01: package j1.lesson05;
02: 
03: import java.io.*;
04: 
05: public class ComplexCondition {
06: 
07:     public static void main(String[] args) throws IOException {
08:         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
09:         System.out.print("整数を入力:");
10:         int a = Integer.parseInt(reader.readLine());
11:         
12:         if (0 <= a && a < 10)
13:             System.out.println("0以上かつ10未満");
14:         else if (a < -10 || a >= 20)
15:             System.out.println("-10未満または20以上");
16:         
17:         if (0 < a && ((a % 5) == 0 || (a % 7) == 0))
18:             System.out.println("5の倍数または7の倍数");
19:     }
20: }

0が入力されるまで出力を繰り返すプログラム

コンソールに整数を一つ入力させ、その値が0でなければ「Hello!」と表示し、またそれらを繰り返す。0が入力されたらプログラムは終了する。

演習

クラスの作成

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

  1. 先ほど作成したパッケージ 「j1.lesson05」の上で右クリック
  2. マウスカーソルを「新規」に合わせる
  3. 「クラス」をクリック
  4. クラス名は UntilLoop とする
  5. 先週までと同じ手順でクラスを作成する

mainメソッドの作成

先と同じ手順で、クラス「UntilLoop」内にpublic static void main(String[] args) throws IOException から始まるメソッドを作成する。

このプログラムでは「コンソールからの入力を取得」を行うため、importや throws IOException を忘れないこと。

骨格テスト

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

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

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

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

メッセージ 詳細
クラスが存在しません j1.lesson05 に UntilLoop クラスが存在していない。パッケージやクラス名を確認
クラスがpublicで宣言されていません class の前に public の指定がない。
mainメソッドが存在しません public static void main(String[]) が存在していない。mainという名前やString[]の部分を確認
mainメソッドがpublicで宣言されていません mainメソッドを作る際に public が抜けている。
mainメソッドがstaticで宣言されていません mainメソッドを作る際に static が抜けている。
mainメソッドがvoidで宣言されていません mainメソッドを作る際に void 以外を指定している。
mainメソッドにthrows IOExceptionの指定がありません mainメソッドを作る際にthrows IOExceptionの指定を行っていない。

プログラムの作成

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

全体的には下記のようなプログラムにする。ただし、一文書くごとにCtrl+Sで保存とコンパイルを行い、常に文法エラーが発生していないことを確認すること。

package j1.lesson05;

import java.io.*;

public class UntilLoop {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
        // 入力を保存する変数を宣言
        int input;

        // 最初の入力
        System.out.print("0で終了:");
        input = Integer.parseInt(reader.readLine());
        
        // 入力が0以外なら繰り返す
        while (input != 0) {
            System.out.println("Hello!");
            
            // 次の入力
            System.out.print("0で終了:");
            input = Integer.parseInt(reader.readLine());
        }
    }
}

プログラムの実行

先週までと同じ手順でプログラムを実行する。

実行が成功すると、以下のように表示される。

0で終了:

ここで、:の右側をクリックして 1 と入力し、Enterキーを押す。すると、プログラムは少し進んで次のように表示される。

Hello!
0で終了:

ここでまた、:の右側をクリックして 0 と入力し、Enterキーを押す。すると、プログラムはそのまま終了する。

機能テスト

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

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

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

メッセージ 詳細
無限ループの可能性 繰り返し部分が無限に繰り返されていないか確認
余計な入力を待っていると考えられます コンソール入力を取得する命令を必要以上に行っていないか確認
次の入力を変換できませんでした (???) ??? を取得しようとして失敗している。コンソール入力を取得する命令を確認
期待された結果と異なります 出力された結果が期待された値と異なる。「期待された値」と「実際の値」を比較 (エラーメッセージが出力されているエリアの下のほうにあるバーをスクロールさせれば見ることができる) し確認。他にも直接プログラムを実行して結果を調べたり、エラーメッセージの2行目にあるat以下を参考にプログラムを見直す

機能テスト失敗時のヒント

メッセージ テストの内容
期待された結果と異なります (0) 入力が0のみ
期待された結果と異なります (1) 入力が順に1, 0
期待された結果と異なります (5) 入力が順に-10, 10, 30, 60, 50, 0

解説

解説のために、プログラムに行番号をつけて解説する。

01: package j1.lesson05;
02: 
03: import java.io.*;
04: 
05: public class UntilLoop {
06: 
07:     public static void main(String[] args) throws IOException {
08:         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
09:         
10:         // 入力を保存する変数を宣言
11:         int input;
12: 
13:         // 最初の入力
14:         System.out.print("0で終了:");
15:         input = Integer.parseInt(reader.readLine());
16:         
17:         // 入力が0以外なら繰り返す
18:         while (input != 0) {
19:             System.out.println("Hello!");
20:             
21:             // 次の入力
22:             System.out.print("0で終了:");
23:             input = Integer.parseInt(reader.readLine());
24:         }
25:     }
26: }

つまり、15行目か23行目で 0 が入力されたら、whileによる繰り返しを終了する。