下準備
テストドライバの導入
第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による繰り返しを終了する。