第07週目課題

課題0701

コンソールに三角形の3辺a,b,cの長さをそれぞれ入力させ、その三角形の面積をヘロンの公式で計算し表示するメソッドを使ったプログラム HeronMethod.java をパッケージ j1.lesson07 に作成しなさい。

ただし、「三角形の面積をヘロンの公式で計算し表示するメソッド」は名前が heron で引数は3つの実数とし、メソッド内での処理は引数を元に計算して表示するまでとする。

コンソールへの入力要求は次のように表示する。

辺aの長さを入力:
辺bの長さを入力:
辺cの長さを入力:

必ず、辺a,b,cの順に入力させ、それぞれの辺の長さは実数を指定できること。今回は辺a,b,cから三角形を作れない場合は考慮しなくても良い (そのようなテストは行わない)。

結果の表示方法は次の通りとする。

三角形の面積はx

ただし、x の部分は heron メソッド内で計算を行った三角形の面積を出力すること。

結果の例

仮に、辺a,b,cにそれぞれ5.0,6.0,7.0を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

辺aの長さを入力:5.0
辺bの長さを入力:6.0
辺cの長さを入力:7.0
三角形の面積は14.696938456699069

手順

指定した箇所で必ずテストを行うこと。

  1. パッケージ j1.lesson07 にクラス HeronMethod を作成 (ファイル名は HeronMethod.javaとなる)
  2. クラス内に throws IOException の指定をした mainメソッド (public static void main(String[] args) throws IOException { }) を作成
  3. クラス内に必要なメソッド (heron) の骨格を作成 (こちらには throws IOException は必要ない)
  4. テスト項目「HeronMethod に対する骨格テスト」をパス
  5. main以外のメソッド内に課題の内容を実装
  6. mainから各メソッドを呼び出して、メソッドが正しく動作しているか確認
  7. テスト項目「HeronMethod に対する単体テスト」をパス
  8. mainメソッド内に課題の内容を実装
  9. いくつかテストを行って、プログラムが正しく動作しているか確認
  10. テスト項目「HeronMethod に対する機能テスト」をパス

ヒント

第02週の課題を参照。

この回では、以下のようにプログラムを分割すればよい。

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(メソッド名), existence 指定されたメソッドが存在しない
(メソッド名), public メソッドを作る際に public が抜けている
(メソッド名), static メソッドを作る際に static が抜けている
(メソッド名), type void メソッドを作る際に void 以外を指定している
(メソッド名), throws ... メソッドを作る際に throws... の指定がない

単体テスト

メッセージ 詳細
(メソッド名), 期待された結果と異なります (メソッド名)を起動した結果が期待された結果と異なる。テスト項目を参照

単体テストの項目

項目名 詳細
testHeron_111 heron メソッドを 実引数 (1, 1, 1) で起動した
testHeron_345 heron メソッドを 実引数 (3, 4, 5) で起動した
testHeron_789 heron メソッドを 実引数 (7, 8, 9) で起動した

機能テスト

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

機能テストの項目

項目名 詳細
test111 入力が順に 1, 1, 1
test345 入力が順に 3, 4, 5
test789 入力が順に 7, 8, 9

課題0702

コンソールから1以上の整数nを入力させ、nの約数を小さい順にすべて表示するプログラム Divisors.java をパッケージ j1.lesson07 に作成しなさい。

ただし、「引数に与えられた値 n に対して1からnまでの約数を全て表示するメソッド」を、名前が printDivisors で1つの整数を引数として取るようなメソッドとして作成すること。メソッド内での処理は引数を元に計算して表示するまでとする。

1以上の整数を入力させる、コンソールへの入力要求は次のように表示する。

1以上の整数を入力:

1以上の値以外が入力されたら、以下のように表示して終了する。

1以上の整数を入力してください

結果の例

入力に100を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

1以上の整数を入力:100
1 2 4 5 10 20 25 50 100

入力の最初に-1を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

1以上の整数を入力:-1
1以上の整数を入力してください

手順

指定した箇所で必ずテストを行うこと。

  1. パッケージ j1.lesson07 にクラス Divisors を作成 (ファイル名は Divisors.javaとなる)
  2. クラス内に throws IOException の指定をした mainメソッド (public static void main(String[] args) throws IOException { }) を作成
  3. クラス内に必要なメソッド (printDivisors) の骨格を作成 (こちらには throws IOException は必要ない)
  4. テスト項目「Divisors に対する骨格テスト」をパス
  5. main以外のメソッド内に課題の内容を実装
  6. mainから各メソッドを呼び出して、メソッドが正しく動作しているか確認
  7. テスト項目「Divisors に対する単体テスト」をパス
  8. mainメソッド内に課題の内容を実装
  9. いくつかテストを行って、プログラムが正しく動作しているか確認
  10. テスト項目「Divisors に対する機能テスト」をパス

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(メソッド名), existence 指定されたメソッドが存在しない
(メソッド名), public メソッドを作る際に public が抜けている
(メソッド名), static メソッドを作る際に static が抜けている
(メソッド名), type void メソッドを作る際に void 以外を指定している
(メソッド名), throws ... メソッドを作る際に throws... の指定がない

単体テスト

メッセージ 詳細
(メソッド名), 期待された結果と異なります (メソッド名)を起動した結果が期待された結果と異なる。テスト項目を参照

単体テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
testPrintDivisors_1 printDivisors メソッドを 実引数 (1) で起動した
testPrintDivisors_7 printDivisors メソッドを 実引数 (7) で起動した
testPrintDivisors_16 printDivisors メソッドを 実引数 (16) で起動した

機能テスト

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

機能テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
testM5 入力が -5
test0 入力が 0
test1 入力が 1
test2 入力が 2
test36 入力が 36
test257 入力が 257

課題0703 (optional)

(16進数が分からない場合は先に課題0704を解いてもよい)

コンソールから0以上の整数を入力させ、その値を8桁の16進数として表示するプログラム PrintAsHex.java をパッケージ j1.lesson07 に作成しなさい。

ただし、16進数で使う数字は 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F と、A から F には大文字のアルファベットを使用すること。

また、引数に int 型の整数を 1 つ受け取って、その16進数表現を8桁で表示するメソッド printAsHex を同クラス内に作成しなさい。メソッド内での処理は引数を元に計算して表示するまでとする。

0以上の整数を入力させる、コンソールへの入力要求は次のように表示する。

0以上の整数を入力:

0以上の値以外が入力されたら、以下のように表示して終了する。

0以上の整数を入力してください

0以上の値が入力されたら、この入力を16進数で表示する。ただし、8桁に満たない場合は上位を 0 で埋める。

結果の例

入力に19122942を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

0以上の整数を入力:19122942
0123CAFE

手順

指定した箇所で必ずテストを行うこと。

  1. パッケージ j1.lesson07 にクラス PrintAsHex を作成 (ファイル名は PrintAsHex.javaとなる)
  2. クラス内に throws IOException の指定をした mainメソッド (public static void main(String[] args) throws IOException { }) を作成
  3. クラス内に必要なメソッド (printAsHex) の骨格を作成 (こちらには throws IOException は必要ない)
  4. テスト項目「PrintAsHex に対する骨格テスト」をパス
  5. main以外のメソッド内に課題の内容を実装
  6. mainから各メソッドを呼び出して、メソッドが正しく動作しているか確認
  7. テスト項目「PrintAsHex に対する単体テスト」をパス
  8. mainメソッド内に課題の内容を実装
  9. いくつかテストを行って、プログラムが正しく動作しているか確認
  10. テスト項目「PrintAsHex に対する機能テスト」をパス

ヒント

10進数とは各桁を0から9までの数字で表し、1桁目がd1、2桁目がd2、3桁目がd3、4桁目がd4である10進数nは以下のように表せる。

n = d4*1000 + d3*100 + d2*10 + d1   (0 <= di < 10)
d1 = n/1 % 10 = (d4*1000 + d3*100 + d2*10 + d1) % 10
d2 = n/10 % 10 = (d4*100 + d3*10 + d2) % 10
d3 = n/100 % 10 = (d4*10 + d3) % 10
d4 = n/1000 % 10 = d4 % 10

1桁目がh1、2桁目がh2、3桁目がh3、4桁目がh4である16進数mは、以下のように表せる。

m = h4*16^3 + h3*16^2 + h2*16 + h1   (0 <= hi < 16)

10進数で各桁を抽出するには、以下のようにすれば良い。

(1桁目) n / 1 % 10
(2桁目) n / 10 % 10
(3桁目) n / 100 % 10
(4桁目) n / 1000 % 10

16進数ではどうすればよいか。

なお、10進数で扱う文字は0, 1, 2, 3, 4, 5, 6, 7, 8, 9 の10個であるが、16進数で扱う文字はそれに A, B, C, D, E, F の6個を加えた合計16個である。

16進数の各桁は、10進数で表すと以下のような関係になる。

16進数の文字 10進数で表記した場合
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
A 10
B 11
C 12
D 13
E 14
F 15

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(メソッド名), existence 指定されたメソッドが存在しない
(メソッド名), public メソッドを作る際に public が抜けている
(メソッド名), static メソッドを作る際に static が抜けている
(メソッド名), type void メソッドを作る際に void 以外を指定している
(メソッド名), throws ... メソッドを作る際に throws... の指定がない

単体テスト

メッセージ 詳細
(メソッド名), 期待された結果と異なります (メソッド名)を起動した結果が期待された結果と異なる。テスト項目を参照

単体テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
testPrintAsHex_1 printAsHex メソッドを 実引数 (1) で起動した
testPrintAsHex_9 printAsHex メソッドを 実引数 (9) で起動した
testPrintAsHex_10 printAsHex メソッドを 実引数 (10) で起動した
testPrintAsHex_15 printAsHex メソッドを 実引数 (15) で起動した
testPrintAsHex_16 printAsHex メソッドを 実引数 (16) で起動した
testPrintAsHex_2147483647 printAsHex メソッドを 実引数 (2147483647) で起動した
testPrintAsHex_180150000 printAsHex メソッドを 実引数 (180150000) で起動した

機能テスト

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

機能テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
testM5 入力が -5
testM1 入力が -1
test0 入力が 0
test2147483647 入力が2147483647
test9 入力が 9
test10 入力が 10
test15 入力が 15
test16 入力が 16
test305419896 入力が 305419896
test51966 入力が 51966

課題0704 (optional)

コンソールから1以上の整数を入力させ、入力された値によって以下のような図形をコンソール上に表示するプログラム PlotDiamond.java をパッケージ j1.lesson07 に作成しなさい。

表示させる図形は以下の通りである。

入力された値が 1 の場合

*

入力された値が 2 の場合

 *
***
 *

入力された値が 3 の場合

  *
 ***
*****
 ***
  *

入力された値が 4 の場合

   *
  ***
 *****
*******
 *****
  ***
   *

上記のような具合に、入力された値 n に対して、(2n - 1) 行の図形になる。

1以上の整数を入力させる、コンソールへの入力要求は次のように表示する。

図形の大きさを入力:

1以上の値以外が入力されたら、以下のように表示して終了する。

1以上の整数を入力してください

本課題では、「引数に与えられた値 n に対して上記のような図形を表示するメソッド」を、名前が plot で1つの整数を引数として取るようなメソッドとして作成すること。メソッド内での処理は引数を元に計算して表示するまでとする。

結果の例

入力に10を指定した場合、プログラムを終了まで実行した際のコンソールは以下のようになっている。

図形の大きさを入力:10
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************
 *****************
  ***************
   *************
    ***********
     *********
      *******
       *****
        ***
         *

手順

指定した箇所で必ずテストを行うこと。

  1. パッケージ j1.lesson07 にクラス PlotDiamond を作成 (ファイル名は PlotDiamond.javaとなる)
  2. クラス PlotDiamond 内に throws IOException の指定をした mainメソッド (public static void main(String[] args) throws IOException { }) を作成
  3. クラス内に必要なメソッド (plot) の骨格を作成 (こちらには throws IOException は必要ない)
  4. テスト項目「PlotDiamond に対する骨格テスト」をパス
  5. main以外のメソッド内に課題の内容を実装
  6. mainから各メソッドを呼び出して、メソッドが正しく動作しているか確認
  7. テスト項目「PlotDiamond に対する単体テスト」をパス
  8. mainメソッド内に課題の内容を実装
  9. いくつかテストを行って、プログラムが正しく動作しているか確認
  10. テスト項目「PlotDiamond に対する機能テスト」をパス

ヒント

図形の一行分を表示するメソッド plotLine(int space, int star) などを作成すると、綺麗にプログラムが書ける。

テストの失敗メッセージ

骨格テスト

メッセージ 詳細
(クラス名), existence パッケージ内に課題で指定したクラスが存在していない。パッケージやクラス名を確認
(メソッド名), existence 指定されたメソッドが存在しない
(メソッド名), public メソッドを作る際に public が抜けている
(メソッド名), static メソッドを作る際に static が抜けている
(メソッド名), type void メソッドを作る際に void 以外を指定している
(メソッド名), throws ... メソッドを作る際に throws... の指定がない

単体テスト

メッセージ 詳細
(メソッド名), 期待された結果と異なります (メソッド名)を起動した結果が期待された結果と異なる。テスト項目を参照

単体テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
testPlot_1 plot メソッドを 実引数 (1) で起動した
testPlot_4 plot メソッドを 実引数 (4) で起動した

機能テスト

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

機能テストの項目

テスト失敗時に「Results」の欄の左側に出る「test~」は、テストの項目名を表している。

項目名 詳細
testM5 入力が -5
test0 入力が 0
test1 入力が 1
test10 入力が 10