下準備
テストドライバの導入
第05回目分のテストドライバを導入する。以下の手順で行う。
- ダウンロード のページを開く (ここをクリック)
- プロジェクト「java20XX」にある「test」の左側の「+」をクリック
- ツリーが展開されるので「install-libraries.xml」を右クリック
- 「実行(R)」にマウスカーソルを合わせる
- 「1 Ant ビルド」をクリック
- 「コンソール」タブに"BUILD SUCCESSFUL"と表示されれば成功
- eclipseの画面でプロジェクト「java20XX」を右クリック
- メニューが表示されるので、「更新」あるいは「最新表示」をクリック
- "week05.zip" をデスクトップなどにダウンロード
- eclipseの画面でプロジェクト「java20XX」を右クリック
- メニューから「インポート(I)」を選択
- 「インポート」ウィンドウが表示されるので、「Zip ファイル」あるいは「アーカイブファイル」を選択
- 「次へ(N)」をクリック
- 宛先フォルダー(L): が「java20XX」になっていることを確認
- From archive file: の右側にある 「参照(R)...」あるいは「ブラウズ(R)...」をクリック
- ファイルダイアログが表示されるので、ダイアログ内に表示されたダウンロードしたファイルをダブルクリック
- 前の画面に戻るので、From archive file: のエリアに正しいパスが入力されていることを確認
- フォルダ「/」の左にチェックがついていることを確認 (ついていなければチェックボックスをクリック)
- 「警告を出さずに既存リソースを上書き」にチェックがついていることを確認 (上書きしたくないファイルがある場合はチェックを外す)
- 「終了 (F)」をクリック
第05週目テストドライバの導入に成功すると、java20XX プロジェクトの test フォルダに j1.lesson05.xml というファイルが作成される。
パッケージの作成
過去の演習を参考にして、「j1.lesson05」というパッケージを作成する。
複雑な条件判定を行うプログラム
コンソールに一つだけ整数を入力させて、その値を様々な条件式で判定する。
演習
クラスの作成
以下の手順で、パッケージ「j1.lesson05」に「ComplexCondition」クラスを作成する。
- 先ほど作成したパッケージ 「j1.lesson05」の上で右クリック
- マウスカーソルを「新規」に合わせる
- 「クラス」をクリック
- クラス名は ComplexCondition とする
- 先週までと同じ手順でクラスを作成する
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: }
- 8行目
- コンソールの入力を取得するためのおまじない
- 9行目
- 入力するタイミングをユーザに知らせるために 繰り返す回数を入力してください: と表示
- 10行目
- int 型の変数 a を宣言
- ユーザの入力した整数を a に代入
- 12行目
- { a の値が 0 以上 (0 <= a) かつ a の値が 10 以下 (a < 10) } かどうかで分岐
- 上記の条件が成立したら 13 行目へ
- 上記の条件が成立しなかったら 14 行目へ
- 13行目
- "0以上かつ10未満" と表示
- 対応する else の終了までジャンプ (16行目以降へ)
- 14行目
- { a の値が -10 未満 (a < -10) または a の値が 20 以上 (a >= 20) } かどうかで分岐
- 上記の条件が成立したら 15 行目へ
- 上記の条件が成立しなかったら 16 行目へ
- 15行目
- "-10未満または20以上" と表示
- 対応する else がないので次へ (16行目以降へ)
- 17行目
- 次の条件が成立化するかどうかで分岐
- a の値が 0 以上 (0 < a)
- かつ
- a の値が 5 で割り切れる((a % 5) == 0) または a の値が 7 で割り切れる((a % 7) = = 0)
- 上記の条件が成立したら 18 行目へ
- 上記の条件が成立しなかったら 19 行目へ (プログラムの終了)
- 19行目
- "5の倍数または7の倍数" と表示
- 対応する else がないので次へ (プログラムの終了)
0が入力されるまで出力を繰り返すプログラム
コンソールに整数を一つ入力させ、その値が0でなければ「Hello!」と表示し、またそれらを繰り返す。0が入力されたらプログラムは終了する。
演習
クラスの作成
以下の手順で、パッケージ「j1.lesson05」に「UntilLoop」クラスを作成する。
- 先ほど作成したパッケージ 「j1.lesson05」の上で右クリック
- マウスカーソルを「新規」に合わせる
- 「クラス」をクリック
- クラス名は UntilLoop とする
- 先週までと同じ手順でクラスを作成する
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: }
- 8行目
- コンソールの入力を取得するためのおまじない
- 11行目
- int 型の変数 input を宣言
- 14~15行目
- 繰り返しを開始する前にユーザの入力した整数を input に代入
- 18行目
- 以下の条件で 19行目~23行目を繰り返す
- input の値が 0 以外である
- 19行目
- "Hello!" と表示する
- 22~23行目
- ユーザの入力した整数を input に代入
- 24行目
- 18行目の条件をチェックし、成立していたら繰り返す
- 成立していなければ 24 行目へ (終了)
つまり、15行目か23行目で 0 が入力されたら、whileによる繰り返しを終了する。